(:in-progress "In progress"))))
(defmacro standard-cli (cmd options-in args usage remaining-args-required &rest success)
-`(multiple-value-bind (parsed-options remaining-args error) (opera:process-arguments ,options-in ,args)
- (cond
- ((opera:option-present :help parsed-options)
- (format t "~A" ,(if (eql usage :default) `(opera:usage ,cmd ,options-in) usage)))
- ((eql error :unknown-option)
- (error-and-exit "Unknown option: ~A. See '~A --help'.~%" (car remaining-args) ,cmd))
- ((eql error :required-argument-missing)
- (error-and-exit "Missing argument for ~A. See '~A --help'.~%" (car remaining-args) ,cmd))
- ((and ,remaining-args-required (not remaining-args))
- (error-and-exit "~A required. See 'candle --help'.~%" ,remaining-args-required))
- (t
- ,@success))))
+ `(multiple-value-bind (parsed-options remaining-args error) (opera:process-arguments ,options-in ,args)
+ (cond
+ ((opera:option-present :help parsed-options)
+ (format t "~A" ,(if (eql usage :default) `(opera:usage ,cmd ,options-in) usage)))
+ ((eql error :unknown-option)
+ (error-and-exit "Unknown option: ~A. See '~A --help'.~%" (car remaining-args) ,cmd))
+ ((eql error :required-argument-missing)
+ (error-and-exit "Missing argument for ~A. See '~A --help'.~%" (car remaining-args) ,cmd))
+ ((and ,remaining-args-required (not remaining-args))
+ (error-and-exit "~A required. See 'candle --help'.~%" ,remaining-args-required))
+ (t
+ ,@success))))
;;; Section for ./candle
(standard-cli "candle" (main-options) (cdr sb-ext:*posix-argv*) (main-usage) "Command"
(handler-case
(if
- (and (opera:option-present :port parsed-options) (not (parse-integer (opera:option-argument :port parsed-options) :junk-allowed t)))
+ (and
+ (opera:option-present :port parsed-options)
+ (not (parse-integer (opera:option-argument :port parsed-options) :junk-allowed t)))
(error-and-exit "--port requires a number. See 'candle -h'~%")
(let
((communication:*query-port*
(defun add-project (args)
(let
((options
- '((:name :help :short "h" :long "help" :description "Print this usage.")
- (:positional "<name>:<src>" :description "<name> is the name of the project, which must be alphanumeric (hyphens are allowed), while <src> is the location of the repository for cloning. This location must be accessible by the machine running candle."))))
+ `((:name :help :short "h" :long "help" :description "Print this usage.")
+ (:positional "<name>:<src>"
+ :description
+ ,(format nil "~{~A~}"
+ (list
+ "<name> is the name of the project, which must be alphanumeric (hyphens are allowed), while <src> is the "
+ "location of the repository for cloning. This location must be accessible by the machine running candle."
+ ""))))))
(standard-cli "candle project add" options args :default "<name>:<src>"
(let*
((project-definition (car remaining-args))
(pos (position #\: project-definition)))
(cond
- ((not pos) (error-and-exit "Project definition ~A is not valid. See 'candle project add --help'.~%" project-definition))
+ ((not pos)
+ (error-and-exit "Project definition ~A is not valid. See 'candle project add --help'.~%" project-definition))
(t
(let*
((name (subseq project-definition 0 pos))
(defun delete-project (args)
(let
((options
- '((:name :help :short "h" :long "help" :description "Print this usage.")
- (:positional "<name>" :description "<name> is the name of the project to delete"))))
+ '((:name :help :short "h" :long "help" :description "Print this usage.")
+ (:positional "<name>" :description "<name> is the name of the project to delete"))))
(standard-cli "candle project delete" options args :default "<name>"
- (communication:query `(candle:delete-project ,(car remaining-args)))
- (format t "Removed project ~A~%" (car remaining-args)))))
+ (communication:query `(candle:delete-project ,(car remaining-args)))
+ (format t "Removed project ~A~%" (car remaining-args)))))
(defun show-project (args)
(let
((options
- '((:name :help :short "h" :long "help" :description "Print this usage.")
- (:positional "<name>" :description "<name> is the name of the project to show"))))
+ '((:name :help :short "h" :long "help" :description "Print this usage.")
+ (:positional "<name>" :description "<name> is the name of the project to show"))))
(standard-cli "candle project show" options args :default "<name>"
(let*
((branch-infos (communication:query `(candle:project-branch-information ,(car remaining-args))))
(defun refresh-project (args)
(let
((options
- '((:name :help :short "h" :long "help" :description "Print this usage.")
- (:positional "<name>" :description "<name> is the name of the project to refresh"))))
+ '((:name :help :short "h" :long "help" :description "Print this usage.")
+ (:positional "<name>" :description "<name> is the name of the project to refresh"))))
(standard-cli "candle project refresh" options args :default "<name>"
(communication:query `(candle:refresh-project ,(car remaining-args)))
(format t "Refreshed project ~A~%" (car remaining-args)))))
(defun project-failures (args)
(let
((options
- '((:name :help :short "h" :long "help" :description "Print this usage.")
- (:name :project :long "project" :variable-name "PROJECT" :takes-argument t :description "Restrict failures to project named by PROJECT"))))
+ '((:name :help :short "h" :long "help" :description "Print this usage.")
+ (:name :project :long "project" :variable-name "PROJECT" :takes-argument t
+ :description "Restrict failures to project named by PROJECT"))))
(standard-cli "candle project failures" options args :default nil
(format t "~A"
(communication:query
- `(candle:failures ,(when (opera:option-present :project parsed-options) (opera:option-argument :project parsed-options))))))))
+ `(candle:failures
+ ,(when (opera:option-present :project parsed-options)
+ (opera:option-argument :project parsed-options))))))))
;;; Section for ./candle job
(defun job-list (args)
(let
((options
- '((:name :help :short "h" :long "help" :description "Print this usage.")
- (:name :project :long "project" :variable-name "PROJECT" :takes-argument t :description "Restrict jobs to project named by PROJECT"))))
+ '((:name :help :short "h" :long "help" :description "Print this usage.")
+ (:name :project :long "project" :variable-name "PROJECT" :takes-argument t
+ :description "Restrict jobs to project named by PROJECT"))))
(standard-cli "candle job list" options args :default nil
(format t "~{~A~%~}"
(mapcar
#'job-info->line
- (sort (communication:query `(candle:project-job-information ,(opera:option-argument :project parsed-options))) #'< :key #'fourth))))))
+ (sort
+ (communication:query `(candle:project-job-information ,(opera:option-argument :project parsed-options)))
+ #'< :key #'fourth))))))
(defun decompose-job-definition (job-definition)
(let
(defun job-log (args)
(let
((options
- '((:name :help :short "h" :long "help" :description "Print this usage.")
- (:positional "<project>:<sha>" :description "<project> is the name of the project, while <sha> is the sha of the job in question."))))
+ '((:name :help :short "h" :long "help" :description "Print this usage.")
+ (:positional "<project>:<sha>"
+ :description "<project> is the name of the project, while <sha> is the sha of the job in question."))))
(standard-cli "candle job log" options args :default "<project>:<sha>"
(multiple-value-bind (project-name sha) (decompose-job-definition (car remaining-args))
(if project-name
(defun retry-job (args)
(let
((options
- '((:name :help :short "h" :long "help" :description "Print this usage.")
- (:positional "<project>:<sha>" :description "<project> is the name of the project, while <sha> is the sha of the job in question."))))
+ '((:name :help :short "h" :long "help" :description "Print this usage.")
+ (:positional "<project>:<sha>"
+ :description "<project> is the name of the project, while <sha> is the sha of the job in question."))))
(standard-cli "candle job retry" options args :default "<project>:<sha>"
(multiple-value-bind (project-name sha) (decompose-job-definition (car remaining-args))
(if project-name
(remaining-args
(format *error-output* "Don't understand ~A. See 'candle-server -h'~%" (car remaining-args))
(sb-ext:exit :code 1))
- ((and (opera:option-present :port options) (not (parse-integer (opera:option-argument :port options) :junk-allowed t)))
+ ((and
+ (opera:option-present :port options)
+ (not (parse-integer (opera:option-argument :port options) :junk-allowed t)))
(format *error-output* "--port requires a number. See 'candle-server -h'~%"))
(t
(let
(opera:option-present :port options)
(parse-integer (opera:option-argument :port options) :junk-allowed t))
25004)))
- (setf candle:*job-system*
- (if (opera:option-present :system options)
- (intern (string-upcase (opera:option-argument :system options)) :keyword)
- :local))
- (let
- ((*error-output* (make-broadcast-stream)))
- (case candle:*job-system*
- (:aws (asdf:load-system :candle-aws))
- (:local (asdf:load-system :candle-local))))
- (setf candle:*candle-dir*
- (if (opera:option-present :dir options)
- (opera:option-argument :dir options)
- "/opt/candle/"))
- (candle:server port nil))))))
+ (setf candle:*job-system*
+ (if (opera:option-present :system options)
+ (intern (string-upcase (opera:option-argument :system options)) :keyword)
+ :local))
+ (let
+ ((*error-output* (make-broadcast-stream)))
+ (case candle:*job-system*
+ (:aws (asdf:load-system :candle-aws))
+ (:local (asdf:load-system :candle-local))))
+ (setf candle:*candle-dir*
+ (if (opera:option-present :dir options)
+ (opera:option-argument :dir options)
+ "/opt/candle/"))
+ (candle:server port nil))))))