[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[O] Best approaches for implementing a developer workflow using ORG?
From: |
Alex Bennée |
Subject: |
[O] Best approaches for implementing a developer workflow using ORG? |
Date: |
Fri, 08 Jul 2016 17:27:49 +0100 |
User-agent: |
mu4e 0.9.17; emacs 25.0.95.8 |
Hi,
As a developer I spend a lot of time moving back and forth between email
messages and COMMIT buffers copying and pasting review and signoff tags.
I've been investigating if there is anyway I can streamline this work
using org-mode.
The first step is fairly easy. When I come across an email that has
review comments or tags I can use org-capture to store a link under a
sub-heading of my reviews.org file:
#+name: capture-steps
#+begin_src emacs-lisp
(setq
org-capture-templates
'(
("g" "Save reference to review tag"
checkitem
(file+headline "review.org" "Review Tags")
" - [ ] %a" :immediate-finish t)
("r" "Review Comment (email)"
checkitem
(file+headline "review.org" "Review Comments")
" - [ ] %a")))
(defvar my-dco-tag-re
(rx (: bol (zero-or-more (in blank)) ;; fresh line
(any "RSTA") (one-or-more (in alpha "-")) "-by: " ;; tag
(one-or-more (in alpha blank "<>@.")) ;; person
eol))
"Regexp to match DCO style tag.")
(defun my-capture-review-tags ()
"Return a list of tags for current buffer"
(let ((tags))
(save-excursion
(goto-char (point-min))
(while (re-search-forward my-dco-tag-re (point-max) t)
(add-to-list 'tags (match-string-no-properties 0))))
tags))
(defun my-org-maybe-capture-review-tag ()
"Check buffer for DCO tags and if found queue a review comment."
(interactive)
(when (my-capture-review-tags)
(org-capture nil "g")))
(when (fboundp 'mu4e-view-mode-map)
(define-key mu4e-view-mode-map (kbd "C-c C-c")
'my-org-maybe-capture-review-tag))
#+end_src
My stumbling block is now how do I approach automating the application
of tags when I'm in a magit COMMIT buffer. After some fumbling about I
can navigate my org file and find links that match a given patch title
(which generally matches the email title as they start as
git-send-email patch series):
#+name: automating-tag-fetching
#+begin_src emacs-lisp
(defun my-org-get-elements (file heading)
"Search FILE for HEADING and return the AST of that heading."
(interactive)
(let ((org-buf (org-capture-target-buffer file)))
(with-current-buffer org-buf
(org-element-map (org-element-parse-buffer) 'headline
(lambda (hl)
(when (string-match heading (org-element-property :raw-value hl))
(identity hl)))))))
(defun my-org-get-unchecked-items (items)
"Return the AST of unchecked ITEMS."
(org-element-map items 'item
(lambda (item) (when (eq (org-element-property :checkbox item) 'off)
(org-element-contents item)))))
(defun my-org-visit-link-and-snarf-tags ()
"Visit org-link-at-point and return a set of tags."
(save-window-excursion
(save-excursion
(org-open-at-point t)
(my-capture-review-tags))))
(defun my-org-find-review-tags (subject)
"Search saved review tags, looking for `SUBJECT' match."
(interactive)
(let* ((ast (my-org-get-elements "review.org" "Review Tags"))
(buffer (org-capture-target-buffer "review.org"))
(unchecked (my-org-get-unchecked-items ast))
(tags))
(org-element-map unchecked 'link
(lambda (link)
(let ((beg (org-element-property :begin link))
(end (org-element-property :end link)))
(with-current-buffer buffer
(when (string-match-p
subject
(buffer-substring-no-properties beg end))
(add-to-list 'tags
(my-org-visit-link-and-snarf-tags)))))))
(when tags
(mapconcat 'symbol-name tags "\n"))))
#+end_src
I'm not sure if my parsing of the tree is as efficient as it should
be, especially the manual grubbing about with :begin and :end of link
to match the link subject.
However the main problem is my-org-visit-link-and-snarf-tags doesn't
work as expected because there doesn't seem to be a way to visit an
org-link in the background to gather the data I need. Really I want to
visit the resulting buffer that org-open-at-point visits in a
(with-current-buffer &body) style visit.
I have tried the other option of inserting the tags as data for the
capture by doing a kill-new and a template like:
#+name: alternative-template
#+begin_src emacs-lisp
(setq
org-capture-templates
'(
("g" "Save reference to review tag"
checkitem
(file+headline "review.org" "Review Tags")
" - [ ] %a\n%c" :immediate-finish t)
("r" "Review Comment (email)"
checkitem
(file+headline "review.org" "Review Comments")
" - [ ] %a")))
#+end_src
But that seemed to cause problems when capturing multiple checkbox
links in a row. Maybe there is some way to stuff some meta-data in the
link?
However ideally I'd like to solve the problem of programitically
following org-links as I'd like to automate the bringing up of review
comments when I doing re-basing.
It is of course possible that I'm abusing org-mode a bit too much using
it in this way and I should use something more database like to store
this stuff. However I would appreciate any suggestions of ways to tackle
this problem.
Regards,
--
Alex Bennée
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [O] Best approaches for implementing a developer workflow using ORG?,
Alex Bennée <=