19bc25d1 |
#!/usr/bin/env sbcl --script
|
f9607eae |
(require :sb-posix)
(load #p"~/quicklisp/setup.lisp")
|
19bc25d1 |
|
f9607eae |
(eval-when (:load-toplevel :compile-toplevel :execute)
(push (truename ".") asdf:*central-registry*)
(ql:quickload :ubiquitous)
(sb-posix:setenv "CC" "gcc" 1)
|
19bc25d1 |
(ql:quickload :net.didierverna.clon))
(eval-when (:load-toplevel :compile-toplevel :execute)
(push (truename ".") asdf:*central-registry*)
|
f9607eae |
(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)
|
0c0e0fb8 |
(defparameter *version* (format nil "0.1-init"))
|
f9607eae |
|
19bc25d1 |
(defparameter *endpoint-template* "https://~a/rest/api/2/")
|
f9607eae |
(eval-when (:compile-toplevel :load-toplevel :execute)
(ubiquitous:restore :jira-api))
(defsynopsis (:postfix "ARGUMENTS...")
|
19bc25d1 |
(text :contents "A command line client for Jira issues")
|
f9607eae |
(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")
|
19bc25d1 |
;;(flag :short-name "pi" :long-name "post-issue"
;; :description "post and issue")
|
0c0e0fb8 |
)
|
f9607eae |
(group (:header "JIRA options")
(stropt :long-name "jira-account"
:description "The jira account to use."
|
19bc25d1 |
:argument-name "URL-SUBDOMAIN"))
|
f9607eae |
(group (:header "Filtering Issues")
|
3460d29f |
(flag :short-name "c" :long-name "with-comments"
|
19bc25d1 |
:description "Show the issue's comments")
|
f9607eae |
(stropt :short-name "s" :long-name "status"
:description "Only show issues with a certain status"))
(group (:header "Other options")
|
0c0e0fb8 |
(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")
|
f9607eae |
(flag :short-name "h" :long-name "help"
|
0c0e0fb8 |
:description "Show this help")
|
f9607eae |
(flag :short-name "v" :long-name "version"
:description "Show the program version")))
(defvar *auth*)
|
0c0e0fb8 |
(defun dump-configuration ()
(format t "~&~s~&"
(hash-table-alist
|
19bc25d1 |
(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)))
|
0c0e0fb8 |
|
f9607eae |
(defun main ()
|
0c0e0fb8 |
(ubiquitous:restore :jira-api)
|
f9607eae |
(setf *auth* (ubiquitous:value :jira :creds))
(make-context)
|
0c0e0fb8 |
|
19bc25d1 |
(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
|
9fbca987 |
(jira-api::get-issue *auth*
(format nil "~a-~a"
(car options)
(cadr options)))
|
3460d29f |
jira-api::=issue=)
|
19bc25d1 |
(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
|
9fbca987 |
(jira-api::get-projects *auth*))))
|
19bc25d1 |
#+nil((getopt :long-name "post-issue") (yason:encode (jira-api::read-issue)))
(t (help) (exit)))))
|
f9607eae |
|
19bc25d1 |
;;#+nil
|
f9607eae |
(dump "jira-client" main)
|