X-Git-Url: https://code.consxy.com/gitweb/gitweb.cgi?a=blobdiff_plain;f=src%2Fmain%2Fcli.lisp;h=e451c8041659b44720cc71148321eb54f91bb81a;hb=3f7d82afc943450315c1884708b88b5e2ae91169;hp=0dd036ad5ffe7afa9c8f458cf821baba55d9efd7;hpb=43528d90eeeee498d0a94c22bc38de9554e15d9a;p=candle diff --git a/src/main/cli.lisp b/src/main/cli.lisp index 0dd036a..e451c80 100644 --- a/src/main/cli.lisp +++ b/src/main/cli.lisp @@ -6,18 +6,30 @@ :description "Port on which to listen for commands. Defaults to 25004") (:positional "" :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. is the name of the project, which must not include colons, while is the location of the repository for cloning. This location must be accessible by the machine running candle." - :variable-name ":"))) + "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") + (:name :show :long "show" :takes-argument t :description + "Show branch information for a project named by NAME." + :variable-name "NAME") + (:name :refresh :long "refresh" :takes-argument t :description + "Refresh project named by NAME." + :variable-name "NAME") + (:name :history :long "history" :takes-argument t :description + "Show history of project named by NAME." + :variable-name "NAME") + (:name :delete :long "delete" :takes-argument t :description + "Delete a project named by NAME." + :variable-name "NAME"))) -(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 :add :long "add" :takes-argument t :description - "Add a job to a project. is the commit for that project to run the job. Requires --project to be specified." - :variable-name ""))) + (:name :project-name :long "project" :takes-argument t :description "The project name for the jobs under consideration."))) + +(defun run-options () + '((:name :help :short "h" :long "help" :description "Print this usage."))) (defun main-usage () (format t "~A" @@ -26,7 +38,8 @@ (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)) @@ -41,35 +54,76 @@ (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)))))) +(defun delete-project (name) + (communication:query `(candle:delete-project ,name)) + (format t "Removed project ~A~%" name)) + +(defun show-project (name) + (mapcar + (lambda (branch-info) + (format t "~A: ~A ~A at ~A~%" + (first branch-info) + (fourth branch-info) + (case (second branch-info) + (:succeeded (format nil "~c[1;32mPassed~c[0m" #\Esc #\Esc)) + (:failed (format nil "~c[1;31mFailed~c[0m" #\Esc #\Esc)) + (:queued "In queue") + (:no-candle-file "No candle file present") + (:in-progress "In progress")) + (format nil "~{~A/~A/~A ~A:~A~}" + (utils:time-as-list (third branch-info) :month :date :year :hr :min)))) + (sort (communication:query `(candle:project-branch-information ,name)) #'< :key #'third))) + +(defun project-history (name) + (mapcar + (lambda (job-info) + (format t "~A: ~A at ~A~%" + (first job-info) + (case (second job-info) + (:succeeded (format nil "~c[1;32mPassed~c[0m" #\Esc #\Esc)) + (:failed (format nil "~c[1;31mFailed~c[0m" #\Esc #\Esc)) + (:queued "In queue") + (:no-candle-file "No candle file present") + (:in-progress "In progress")) + (format nil "~{~A/~A/~A ~A:~A~}" + (utils:time-as-list (third job-info) :month :date :year :hr :min)))) + (sort (communication:query `(candle:project-job-information ,name)) #'< :key #'third))) + +(defun refresh-project (name) + (communication:query `(candle:refresh-project ,name)) + (format t "Refreshed project ~A~%" name)) + (defmethod execute-command ((command (eql :project)) args) (multiple-value-bind (options remaining-args error) (opera:process-arguments (project-options) args) (cond ((eql error :unknown-option) (format *error-output* "Unknown option: ~A. See 'candle project --help'.~%" (car remaining-args))) ((eql error :required-argument-missing) (format *error-output* "Missing argument for ~A. See 'candle project --help'.~%" (car remaining-args))) ((opera:option-present :help options) (format t "~A" (opera:usage "candle project" (project-options)))) + ((opera:option-present :delete options) (delete-project (opera:option-argument :delete options))) + ((opera:option-present :show options) (show-project (opera:option-argument :show options))) + ((opera:option-present :refresh options) (refresh-project (opera:option-argument :refresh options))) + ((opera:option-present :history options) (project-history (opera:option-argument :history options))) ((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))) - (defmethod execute-command ((command (eql :job)) args) (multiple-value-bind (options remaining-args error) (opera:process-arguments (job-options) args) (cond ((eql error :unknown-option) (format *error-output* "Unknown option: ~A. See 'candle job --help'.~%" (car remaining-args))) ((eql error :required-argument-missing) (format *error-output* "Missing argument for ~A. See 'candle job --help'.~%" (car remaining-args))) - ((opera:option-present :help options) (format t "~A" (opera:usage "candle job" (job-options)))) - ((and (opera:option-present :add options) (not (opera:option-present :project-name options))) - (format *error-output* "Cannot --add without --project. See 'candle job --help'.~%")) - ((opera:option-present :add options) - (add-job - (opera:option-argument :project-name options) - (opera:option-argument :add options)))))) + ((opera:option-present :help options) (format t "~A" (opera:usage "candle job" (job-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*)) @@ -88,5 +142,3 @@ (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