:description "Port on which to listen for commands. Defaults to 25004")
(:positional "<command>" :required t :description "Command to send to candle server")))
-(defun project-options()
+(defun project-options ()
'((:name :help :short "h" :long "help" :description "Print this usage.")
(:name :add :long "add" :takes-argument t :description
"Add a project. <name> is the name of the project, which must not include colons, while <src> is the location of the repository for cloning. This location must be accessible by the machine running candle."
:variable-name "<name>:<src>")))
-(defun job-options()
+(defun job-options ()
'((:name :help :short "h" :long "help" :description "Print this usage.")
- (:name :project-name :short "p" :long "project" :takes-argument t :description "The project name for the jobs under consideration.")
+ (:name :project-name :long "project" :takes-argument t :description "The project name for the jobs under consideration.")
(:name :add :long "add" :takes-argument t :description
"Add a job to a project. <sha> is the commit for that project to run the job. Requires --project to be specified."
:variable-name "<sha>")))
+(defun run-options ()
+ '((:name :help :short "h" :long "help" :description "Print this usage.")))
+
(defun main-usage ()
(format t "~A"
(opera:usage
(main-options)
"Interacts with candle server. The available commands are:
project List, show or add projects
- job List or show jobs")))
+ job List or show jobs
+ run Local command. Run candle in the current working directory")))
(defgeneric execute-command (command args))
(t
(let*
((name (subseq project-definition 0 pos))
- (src (subseq project-definition (1+ pos)))
- (response (communication:query `(candle:add-project ,name ,src))))
+ (src (subseq project-definition (1+ pos))))
+ (communication:query `(candle:add-project ,name ,src))
(format t "Added project ~A at src definition ~A~%" name src))))))
(defmethod execute-command ((command (eql :project)) args)
((opera:option-present :add options) (add-project (opera:option-argument :add options))))))
(defun add-job (project-name sha)
- (let
- ((response (communication:query `(candle:add-job ,project-name ,sha))))
- (format t "Added job with sha ~A to project ~A~%" sha project-name)))
+ (format t "Added job with sha ~A to project ~A~%" sha project-name))
(defmethod execute-command ((command (eql :job)) args)
(multiple-value-bind (options remaining-args error) (opera:process-arguments (job-options) args)
(opera:option-argument :project-name options)
(opera:option-argument :add options))))))
+(defmethod execute-command ((command (eql :run)) args)
+ (multiple-value-bind (options remaining-args error) (opera:process-arguments (run-options) args)
+ (cond
+ ((eql error :unknown-option) (format *error-output* "Unknown option: ~A. See 'candle run --help'.~%" (car remaining-args)))
+ ((eql error :required-argument-missing) (format *error-output* "Missing argument for ~A. See 'candle run --help'.~%" (car remaining-args)))
+ (remaining-args (format *error-output* "Unknown option: ~A. See 'candle run --help'.~%" (car remaining-args)))
+ ((opera:option-present :help options) (format t "~A" (opera:usage "candle run" (run-options))))
+ ((not (candle:run)) (sb-ext:exit :code 1)))))
+
(defun run ()
(multiple-value-bind (options remaining-args error) (opera:process-arguments (main-options) (cdr sb-ext:*posix-argv*))
(cond
(parse-integer (opera:option-argument :port options) :junk-allowed t))
25004)))
(execute-command (intern (string-upcase (car remaining-args)) :keyword) (cdr remaining-args)))))))
-
-; vim:ft=lisp