Initial import
[ShellArchive.git] / trac-ticket.el
blobf2bf2700299f82f520f16f597d8689de27f3a449
1 (require 'mm-url)
3 (defvar trac-ticket-base-url
4 "http://cp.dev.dmt.bbc.co.uk/trac/ticket/")
6 (defun trac-ticket-zip-lists (list1 list2 &optional symbolify)
7 "Zip two lists together to produce a list of alists."
8 (unless (eq (length list1) (length list2))
9 (error "Lists are different lengths"))
10 (let ((index -1))
11 (mapcar
12 (lambda (x)
13 (cons (if symbolify (intern x) x)
14 (nth (incf index) list2)))
15 list1)))
17 (defun trac-ticket-get-details (number &optional url)
18 "Returns an alist of details for the ticket NUMBER from the
19 trac at URL."
20 (let ((url (or url trac-ticket-base-url))
21 (keys)
22 (values))
23 (with-temp-buffer
24 (mm-url-insert (concat url (number-to-string number) "?format=csv"))
25 (dolist (var '(keys values))
26 (set var
27 (split-string
28 (buffer-substring-no-properties (point-at-bol) (point-at-eol))
29 "," nil))
30 (forward-line)))
31 (let ((tickets (trac-ticket-zip-lists keys values t)))
32 (unless (assoc 'id tickets)
33 (error "Failed to fetch ticket from '%s'" url))
34 tickets)))
36 ;;;###autoload
37 (defun trac-ticket-to-org (number)
38 "Put an Org compatible TODO item into the kill ring."
39 ;; TODO: custom priority calc, TODO keyword config, org-store-link?
40 (interactive "nTicket #: ")
41 (let* ((pri-map '(("1" . "A") ("2" . "B") ("3" . "C")))
42 (ticket (trac-ticket-get-details number))
43 (num (cdr (assoc 'id ticket)))
44 (link (concat trac-ticket-base-url num))
45 (details (concat
46 "TODO [#"
47 (or
48 (cdr (assoc (cdr (assoc 'priority ticket)) pri-map))
49 "C")
50 "] [[" link "][#" num "]] "
51 (cdr (assoc 'summary ticket)))))
52 (kill-new details)))
54 (provide 'trac-ticket)