Change candle project --history to candle job
[candle] / src / main / cli.lisp
index 006830eca33bab8387aa3c986ff253488e5c1386..bee2885a6dab94847183ecb04077aa9d60982a20 100644 (file)
@@ -9,15 +9,23 @@
 (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>")))
+    "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 :delete :long "delete" :takes-argument t :description
+    "Delete a project named by NAME."
+    :variable-name "NAME")))
 
 (defun job-options ()
  '((:name :help :short "h" :long "help" :description "Print this usage.")
-   (: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>")))
+   (:name :project-name :long "project" :takes-argument t
+    :variable-name "PROJECT"
+    :description "The project name for the jobs under consideration.  Required argumnet.")))
 
 (defun run-options ()
  '((:name :help :short "h" :long "help" :description "Print this usage.")))
     (let*
      ((name (subseq project-definition 0 pos))
       (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 job-info->line (job-info)
+ (format nil "~A (~A) ~A"
+  (subseq (first job-info) 0 8)
+  (format nil "~{~A/~A/~A ~A:~A~}"
+   (utils:time-as-list (third job-info) :month :date :year :hr :min))
+  (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"))))
+
+(defun show-project (name)
+ (let*
+  ((branch-infos (communication:query `(candle:project-branch-information ,name)))
+   (width (apply #'max (mapcar #'length (mapcar #'car branch-infos)))))
+  (mapcar
+   (lambda (branch-info)
+    (format t (format nil "~~~A@A: ~~A~~%" width)
+     (first branch-info)
+     (job-info->line (second branch-info))))
+   (sort branch-infos #'< :key (lambda (branch-info) (third (second branch-info)))))))
+
+(defun project-history (name)
+ (format t "~{~A~%~}"
+  (mapcar
+   #'job-info->line
+   (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 :add options) (add-project (opera:option-argument :add options))))))
 
-(defun 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))))))
+   ((not (opera:option-present :project-name options)) (format *error-output* "Requires --project argument.  See 'candle job --help'.~%" ))
+   (t (project-history (opera:option-argument :project-name options))))))
 
 (defmethod execute-command ((command (eql :run)) args)
  (multiple-value-bind (options remaining-args error) (opera:process-arguments (run-options) args)