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"))
13 (cons (if symbolify
(intern x
) x
)
14 (nth (incf index
) list2
)))
17 (defun trac-ticket-get-details (number &optional url
)
18 "Returns an alist of details for the ticket NUMBER from the
20 (let ((url (or url trac-ticket-base-url
))
24 (mm-url-insert (concat url
(number-to-string number
) "?format=csv"))
25 (dolist (var '(keys values
))
28 (buffer-substring-no-properties (point-at-bol) (point-at-eol))
31 (let ((tickets (trac-ticket-zip-lists keys values t
)))
32 (unless (assoc 'id tickets
)
33 (error "Failed to fetch ticket from '%s'" url
))
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
))
48 (cdr (assoc (cdr (assoc 'priority ticket
)) pri-map
))
50 "] [[" link
"][#" num
"]] "
51 (cdr (assoc 'summary ticket
)))))
54 (provide 'trac-ticket
)