git.fiddlerwoaroof.com
Raw Blame History
#!/usr/bin/env sbcl --script
(require :sb-posix)
(load #p"~/quicklisp/setup.lisp")

(eval-when (:load-toplevel :compile-toplevel :execute)
  (push (truename ".") asdf:*central-registry*)
  (ql:quickload :ubiquitous)
  (sb-posix:setenv "CC" "gcc" 1)
  (ql:quickload :net.didierverna.clon))

(eval-when (:load-toplevel :compile-toplevel :execute)
  (push (truename ".") asdf:*central-registry*)
  (ql:quickload :jira-api))

(defpackage #:jira-api.client
  (:use #:cl #:serapeum #:alexandria #:fw.lu #:jira-api.cli #:jira-api #:net.didierverna.clon))

(in-package #:jira-api.client)
(defparameter *version* (format nil "0.1-init"))

(defparameter *endpoint-template* "https://~a/rest/api/2/")

(eval-when (:compile-toplevel :load-toplevel :execute)
  (ubiquitous:restore :jira-api))

(defsynopsis (:postfix "ARGUMENTS...")
    (text :contents "A command line client for Jira issues")
  (group (:header "Main actions")
         (flag :short-name "lp" :long-name "list-projects"
               :description "List available JIRA projects")
         (flag :short-name "is"
               :long-name "get-issues"
               :description "list issues")
         (flag :short-name "i"
               :long-name "get-issue"
               :description "show an issue")
         ;;(flag :short-name "pi" :long-name "post-issue"
         ;;      :description "post and issue")
         )
  (group (:header "JIRA options")
         (stropt :long-name "jira-account"
                 :description "The jira account to use."
                 :argument-name "URL-SUBDOMAIN"))
  (group (:header "Filtering Issues")
         (flag :short-name "c" :long-name "with-comments"
               :description "Show the issue's comments")
         (stropt :short-name "s" :long-name "status"
                 :description "Only show issues with a certain status"))
  (group (:header "Other options")
         (flag :short-name "dc" :long-name "dump-configuration"
               :description "Dump the current configuration")
         (flag :short-name "g" :long-name "configure"
               :description "Configure the default values")
         (flag :short-name "h" :long-name "help"
               :description "Show this help")
         (flag :short-name "v" :long-name "version"
               :description "Show the program version")))

(defvar *auth*)

(defun dump-configuration ()
  (format t "~&~s~&"
          (hash-table-alist
           (ubiquitous:value :jira))))

(defun get-track-eng-issues (auth)
  (let ((jql
          (concatenate 'string
                       "project = CJPM AND status"
                       "  in (Open, \"In Progress\", Resolved, Closed, \"Needs QR\","
                       "      \"Needs Demo\", \"Needs SOX\", \"Dev Done\")"
                       " AND component = EMPTY"
                       " AND \"Product Domain\" = Insights"
                       " ORDER BY Rank ASC")))
    (jira-api:get-issues auth :jql jql)))

(defun get-needsqr-issues (auth)
  (let ((jql
          (concatenate 'string
                       "project = CJPM"
                       " AND status in (\"Needs QR\")"
                       " AND \"Product Domain\" = Insights"
                       " ORDER BY Rank ASC")))
    (jira-api:get-issues auth :jql jql)))

(defun get-insights-issues (auth)
  (let ((jql
          (concatenate 'string
                       "project = CJPM"
                       " AND status in (Open, \"In Progress\", Resolved, \"Needs QR\","
                       "                \"Needs Demo\", \"Needs SOX\", \"Dev Done\")"
                       " AND \"Product Domain\" = Insights"
                       " ORDER BY Rank ASC")))
    (jira-api:get-issues auth :jql jql)))

(defun main ()
  (ubiquitous:restore :jira-api)
  (setf *auth* (ubiquitous:value :jira :creds))
  (make-context)

  (let ((configure (getopt :long-name "configure"))
        (help (getopt :long-name "help")))
    (unless (or configure help)
      (jira-api::update-hostname (ubiquitous:value :jira :account)))
    (cond
      (help (help))
      ((getopt :long-name "version") (format t "~&~a~%" *version*))
      ((getopt :long-name "dump-configuration") (dump-configuration))
      (configure (let ((creds (prompt :creds))
                       (account (prompt :jira-account)))
                   (setf (ubiquitous:value :jira :creds) creds)
                   (setf (ubiquitous:value :jira :account) account)
                   (dump-configuration)))
      ((getopt :long-name "get-issue") (let ((options (remainder)))
                                         (format t "~&~a~&"
                                                 (jira-api::show
                                                  (jira-api::json2sheeple
                                                   (jira-api::get-issue *auth*
                                                                        (format nil "~a-~a"
                                                                                (car options)
                                                                                (cadr options)))
                                                   jira-api::=issue=)
                                                  (getopt :long-name "with-comments")))))
      ((getopt :long-name "get-issues")
       (let ((options (remainder)))
         (let ((issues (jira-api::sort-issues-by-status (jira-api::json2sheeple (get-insights-issues *auth*)
                                                                                jira-api::=issues=))))
           (alexandria:if-let ((status (getopt :long-name "status")))
               (setf issues
                     (sheeple:defobject ()
                         ((jira-api::issues
                           (apply 'vector
                                  (gethash status
                                           (jira-api::classify-issues issues))))))))
           (jira-api::show-issues issues))))

      ((getopt :long-name "list-projects") (jira-api::show-projects
                                            (jira-api::json2sheeple
                                             (jira-api::get-projects *auth*))))
      #+nil((getopt :long-name "post-issue") (yason:encode (jira-api::read-issue)))
      (t  (help) (exit)))))

;;#+nil
(dump "jira-client" main)