Home
Reading
Searching
Subscribe
Sponsors
Statistics
Posting
Contact
Spam
Lists
Links
About
Hosting
Filtering
Features Download
Marketing
Archives
FAQ
Blog
 
Gmane
From: John Wiegley <jwiegley <at> gmail.com>
Subject: Easier integration of org-mode and Bugzilla
Newsgroups: gmane.emacs.orgmode
Date: Thursday 20th May 2010 22:45:24 UTC (over 6 years ago)
I use Org-mode for tracking all tasks, including Bugzilla issues.  But I
also use remember.el for quickyl creating new tasks, some of which should
then go into BZ.

The following setup lets me just type "x z" on a task in the Agenda, and a
related Bugzilla task is automatically created.  Note that this code will
have to be edited to work in your environment.

First, I have a special link name for these bugs:

#+LINK: cegbug https://portal/bugzilla/show_bug.cgi?id=

Second, you need the bugzilla-submit script, attached to this mail.  You
can also find this script in the Bugzilla distribution.

Third is this function, several ports of which you will need to edit
(though it should be pretty obvious):

(defun make-bugzilla-bug (product component version priority severity)
  (interactive
   (let ((omk (get-text-property (point) 'org-marker)))
     (with-current-buffer (marker-buffer omk)
       (save-excursion
	 (goto-char omk)
	 (let ((products
		(list (list "ABC" (list "Admin" "User" "Other" "CSR")
			    (list "3.0"))
		      (list "Bizcard" (list "Catalog" "Content Section"
					    "Uploader" "Visual Aesthetics"
					    "webui")
			    (list "unspecified"))
		      (list "Adagio" (list "DTSX" "PTS" "Satellite" "Zips"
					   "Core")
			    (list "unspecified"))
		      (list "IT" (list "install" "network" "repair" "misc")
			    (list "unspecified"))
		      (list "EVAprint" (list "misc")
			    (list "1.0"))))
	       (priorities (list "P1" "P2" "P3" "P4" "P5"))
	       (severities (list "blocker" "critical" "major"
				 "normal" "minor" "trivial"))
	       (product (org-get-category)))
	   (list product
		 (let ((components (nth 1 (assoc product products))))
		   (if (= 1 (length components))
		       (car components)
		     (ido-completing-read "Component: " components
					  nil t nil nil (car (last components)))))
		 (let ((versions (nth 2 (assoc product products))))
		   (if (= 1 (length versions))
		       (car versions)
		     (ido-completing-read "Version: " versions
					  nil t nil nil (car (last versions)))))
		 (let ((orgpri (nth 3 (org-heading-components))))
		   (if (and orgpri (= ?A orgpri))
		       "P1"
		     (ido-completing-read "Priority: " priorities
					  nil t nil nil "P3")))
		 (ido-completing-read "Severity: " severities nil t nil nil
				      "normal") ))))))
  (if (string= product "Bizcard")
      (setq product "BizCard"))
  (let ((omk (get-text-property (point) 'org-marker)))
    (with-current-buffer (marker-buffer omk)
      (save-excursion
	(goto-char omk)
	(let ((heading (nth 4 (org-heading-components)))
	      (contents (buffer-substring-no-properties
			 (org-entry-beginning-position)
			 (org-entry-end-position)))
	      bug)
	  (with-temp-buffer
	    (insert contents)
	    (goto-char (point-min))
	    (delete-region (point) (1+ (line-end-position)))
	    (search-forward ":PROP")
	    (delete-region (match-beginning 0) (point-max))
	    (goto-char (point-min))
	    (while (re-search-forward "^   " nil t)
	      (delete-region (match-beginning 0) (match-end 0)))
	    (goto-char (point-min))
	    (while (re-search-forward "^SCHE" nil t)
	      (delete-region (match-beginning 0) (1+ (line-end-position))))
	    (goto-char (point-min))
	    (when (eobp)
	      (insert "No description file.")
	      (goto-char (point-min)))
	    (insert (format "Product: %s
Component: %s
Version: %s
Priority: %s
Severity: %s
Hardware: Other
OS: Other
Summary: %s" product component version priority severity heading) ?\n ?\n)
	    (let ((buf (current-buffer)))
	      (with-temp-buffer
		(let ((tmpbuf (current-buffer)))
		  (if nil
		      (insert "Bug 999 posted.")
		    (with-current-buffer buf
		      (shell-command-on-region
		       (point-min) (point-max)
		       "~/bin/bugzilla-submit https://portal/bugzilla/"
		       tmpbuf)))
		  (goto-char (point-min))
		  (re-search-forward "Bug \\([0-9]+\\) posted.")
		  (setq bug (match-string 1))))))
	  (save-excursion
	    (org-back-to-heading t)
	    (re-search-forward "\\(TODO\\|STARTED\\|WAITING\\|DELEGATED\\)
\\(\\[#[ABC]\\] \\)?")
	    (insert (format "[[cegbug:%s][#%s]] " bug bug)))))))
  (org-agenda-redo))

Fourth is the agenda keybinding, some of which you may prefer to delete:

(eval-after-load "org-agenda"
  '(progn
     (dolist (map (list org-agenda-keymap org-agenda-mode-map))
       (define-prefix-command 'org-todo-state-map)

       (define-key map "x" 'org-todo-state-map)

       (define-key org-todo-state-map "d"
	 #'(lambda nil (interactive) (org-agenda-todo "DONE")))
       (define-key org-todo-state-map "r"
	 #'(lambda nil (interactive) (org-agenda-todo "DEFERRED")))
       (define-key org-todo-state-map "y"
	 #'(lambda nil (interactive) (org-agenda-todo "SOMEDAY")))
       (define-key org-todo-state-map "g"
	 #'(lambda nil (interactive) (org-agenda-todo "DELEGATED")))
       (define-key org-todo-state-map "n"
	 #'(lambda nil (interactive) (org-agenda-todo "NOTE")))
       (define-key org-todo-state-map "s"
	 #'(lambda nil (interactive) (org-agenda-todo "STARTED")))
       (define-key org-todo-state-map "t"
	 #'(lambda nil (interactive) (org-agenda-todo "TODO")))
       (define-key org-todo-state-map "w"
	 #'(lambda nil (interactive) (org-agenda-todo "WAITING")))
       (define-key org-todo-state-map "x"
	 #'(lambda nil (interactive) (org-agenda-todo "CANCELLED")))

       (define-key org-todo-state-map "z" #'make-bugzilla-bug))))

John
 
CD: 3ms