[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/gnorb d7327b5 192/449: The big switch! Rely only on reg
From: |
Stefan Monnier |
Subject: |
[elpa] externals/gnorb d7327b5 192/449: The big switch! Rely only on registry for tracking |
Date: |
Fri, 27 Nov 2020 23:15:37 -0500 (EST) |
branch: externals/gnorb
commit d7327b51ea9dcb71f99e871d1a3fb5eff8b4a924
Author: Eric Abrahamsen <eric@ericabrahamsen.net>
Commit: Eric Abrahamsen <eric@ericabrahamsen.net>
The big switch! Rely only on registry for tracking
* lisp/gnorb-registry.el (gnorb-msg-id-to-heading-table): Deleted
variable.
(gnorb-find-visit-candidates): Find candidates via the registry,
not the hash table.
(gnorb-org-add-id-hash-entry): Deleted function.
(gnorb-org-populate-id-hash): Deleted function.
* lisp/gnorb-utils.el (gnorb-pretty-outline): Because tracking now only
stores Org ids, not Org ids plus outline path, we need a separate
function for creating a pretty outline path from an id.
* lisp/gnorb-gnus.el: Lists of relevant headings are now simple lists of
ids, not lists of lists, so use car rather than caar to get the first.
Also, use `gnorb-pretty-outline' where appropriate.
* README.org: Document
---
README.org | 19 ++++++++++++++---
lisp/gnorb-gnus.el | 36 +++++++++++++------------------
lisp/gnorb-registry.el | 58 +++++++-------------------------------------------
lisp/gnorb-utils.el | 29 +++++++++++++++++++++----
4 files changed, 64 insertions(+), 78 deletions(-)
diff --git a/README.org b/README.org
index 1dc0872..9488364 100644
--- a/README.org
+++ b/README.org
@@ -27,9 +27,22 @@ they do one thing only, and (I hope) don't require anything
special in
terms of file formats or workflow. A few exceptions to that are listed
below.
** Using Gnorb for Tracking Email TODOs
-Because we try to track email messages and related TODOs round-trip --
-incoming and outgoing under one TODO representing a conversation -- it
-works best if things match up at both ends. Specifically:
+
+Tracking correspondences between Org TODOs and email messages is one
+of the more complicated things that Gnorb does, and thus requires a
+little setup. Tracking relies on the Gnus registry, so that must be
+installed (ie you've called `gnus-registry-initialize' somewhere). It
+also relies on Org ids, so you'll want to require 'org-id, and set
+`org-id-track-globally' to t (that's the default anyway).
+
+Once that's done, call `gnorb-tracking-initialize' after loading
+Gnorb, and you should be done.
+
+NOTE: If you were using an earlier version of Gnorb that stored
+correspondences in Org heading properties, you can transition to the
+newer system with the function `gnorb-registry-transition-from-props'.
+See the docstring for details.
+
*** Capture templates for emails
Most people will be using plain capture templates to create TODOs from
messages. You'll almost always want to save a link to the message, so
diff --git a/lisp/gnorb-gnus.el b/lisp/gnorb-gnus.el
index 216b066..559015f 100644
--- a/lisp/gnorb-gnus.el
+++ b/lisp/gnorb-gnus.el
@@ -336,7 +336,7 @@ work."
;; stored into `gnorb-gnus-sending-message-info'.
(if arg
(progn
- (push (caar rel-headings) gnorb-message-org-ids)
+ (push (car rel-headings) gnorb-message-org-ids)
(gnorb-org-restore-after-send))
(setq ref-ids (plist-get gnorb-gnus-sending-message-info :refs))
(if ref-ids
@@ -350,7 +350,7 @@ work."
(if (not rel-headings)
(gnorb-gnus-outgoing-make-todo-1)
(dolist (h rel-headings)
- (push (car h) gnorb-message-org-ids))
+ (push h gnorb-message-org-ids))
(gnorb-org-restore-after-send)))
;; not relevant, just make a new TODO
(gnorb-gnus-outgoing-make-todo-1)))
@@ -392,15 +392,15 @@ work."
;; then get the org-ids of those headings, and insert
;; them into this message as headers. If the id was
;; already present in a header, don't add it again.
- (unless (member (car h) header-ids)
+ (unless (member h header-ids)
(goto-char (point-at-bol))
(open-line 1)
(message-insert-header
(intern gnorb-mail-header)
- (car h))
+ h)
;; tell the rest of the function that this is a relevant
;; message
- (push (car h) header-ids)))))
+ (push h header-ids)))))
(message-goto-body)
(add-to-list
'message-exit-actions
@@ -455,7 +455,6 @@ work."
(org-capture nil gnorb-gnus-new-todo-capture-key)
(when msg-id
(org-entry-put (point) gnorb-org-msg-id-key msg-id)
- (gnorb-org-add-id-hash-entry msg-id)
(gnorb-registry-make-entry msg-id sender subject (org-id-get-create)
group))))
;;; If an incoming message should trigger state-change for a Org todo,
@@ -520,8 +519,8 @@ to t (it is, by default)."
(gnorb-trigger-todo-action arg id)
(if (and offer-heading
(y-or-n-p (format "Trigger action on %s"
- (org-format-outline-path (cadr
offer-heading)))))
- (gnorb-trigger-todo-action arg (car offer-heading))
+ (gnorb-pretty-outline offer-heading))))
+ (gnorb-trigger-todo-action arg offer-heading)
(setq targ (org-refile-get-location
"Trigger heading" nil t))
(find-file (nth 1 targ))
@@ -600,18 +599,13 @@ option `gnorb-gnus-hint-relevant-article' is non-nil."
rel-headings)
(when ref-ids
(setq ref-ids (split-string ref-ids))
- (when (setq rel-headings
- (gnorb-find-visit-candidates ref-ids))
- (message "Possible relevant todo (%s): %s, trigger with %s"
- (org-with-point-at (org-id-find
- (caar rel-headings) t)
- (org-element-property
- :todo-keyword (org-element-at-point)))
- (org-format-outline-path
- (cadr (car rel-headings)))
- (if key
- (key-description key)
- "M-x gnorb-gnus-incoming-do-todo")))))))
+ (when (setq rel-headings
+ (gnorb-find-visit-candidates ref-ids))
+ (message "Possible relevant todo %s, trigger with %s"
+ (gnorb-pretty-outline (car rel-headings) t)
+ (if key
+ (key-description key)
+ "M-x gnorb-gnus-incoming-do-todo")))))))
(add-hook 'gnus-article-prepare-hook 'gnorb-gnus-hint-relevant-message)
@@ -640,7 +634,7 @@ option `gnorb-gnus-hint-relevant-article' is non-nil."
(setq refs (split-string refs))
(setq rel-headings (gnorb-find-visit-candidates refs))
(delete-other-windows)
- (org-id-goto (caar rel-headings)))))
+ (org-id-goto (car rel-headings)))))
(provide 'gnorb-gnus)
;;; gnorb-gnus.el ends here
diff --git a/lisp/gnorb-registry.el b/lisp/gnorb-registry.el
index 2fc2d0d..b590b87 100644
--- a/lisp/gnorb-registry.el
+++ b/lisp/gnorb-registry.el
@@ -55,12 +55,6 @@
:tag "Gnorb Registry"
:group 'gnorb)
-(defvar gnorb-msg-id-to-heading-table nil
- "Hash table where keys are message-ids, and values are lists of
- org headings which have that message-id in their GNORB_MSG_ID
- property. Values are actually two-element lists: the heading's
- id, and its outline path.")
-
(defun gnorb-registry-make-entry (msg-id sender subject org-id group)
"Create a Gnus registry entry for a message, either received or
sent. Save the relevant Org ids in the 'gnorb-ids key."
@@ -118,53 +112,17 @@ to the message's registry entry, under the 'gnorb-ids
key."
(defun gnorb-find-visit-candidates (ids)
"For all message-ids in IDS (which should be a list of
Message-ID strings, with angle brackets), produce a list of Org
-ids (and ol-paths) for headings that contain one of those id
-values in their `gnorb-org-org-msg-id-key' property."
+ids for headings that are relevant to that message."
(let (ret-val sub-val)
- (unless gnorb-msg-id-to-heading-table
- (gnorb-org-populate-id-hash))
- (dolist (id ids)
- (when (setq sub-val (gethash id gnorb-msg-id-to-heading-table))
- (setq ret-val (append sub-val ret-val))))
+ (when gnorb-tracking-enabled
+ (progn
+ (dolist (id ids)
+ (when
+ (setq sub-val
+ (gnus-registry-get-id-key id 'gnorb-ids))
+ (setq ret-val (append sub-val ret-val))))))
ret-val))
-(defun gnorb-org-add-id-hash-entry (msg-id &optional marker)
- (org-with-point-at (or marker (point))
- (let ((old-val (gethash msg-id gnorb-msg-id-to-heading-table))
- (new-val (list
- (org-id-get-create)
- (append
- (list
- (file-name-nondirectory
- (buffer-file-name
- (org-base-buffer (current-buffer)))))
- (org-get-outline-path)
- (list
- (org-no-properties
- (replace-regexp-in-string
- org-bracket-link-regexp
- "\\3"
- (nth 4 (org-heading-components)))))))))
- (unless (member (car new-val) old-val)
- (puthash msg-id
- (if old-val
- (append (list new-val) old-val)
- (list new-val))
- gnorb-msg-id-to-heading-table)))))
-
-(defun gnorb-org-populate-id-hash ()
- "Scan all agenda files for headings with the
- `gnorb-org-msg-id-key' property, and construct a hash table of
- message-ids as keys, and org headings as values -- actually
- two-element lists representing the heading's id and outline
- path."
- ;; where are all the places where we might conceivably want to
- ;; refresh this?
- (interactive)
- (setq gnorb-msg-id-to-heading-table
- (make-hash-table
- :test 'equal :size 100))
- (let (props)
(defun gnorb-registry-org-id-search (id)
(registry-search gnus-registry-db :member `((gnorb-ids ,id))))
diff --git a/lisp/gnorb-utils.el b/lisp/gnorb-utils.el
index 620a73b..97817c2 100644
--- a/lisp/gnorb-utils.el
+++ b/lisp/gnorb-utils.el
@@ -139,15 +139,13 @@ the prefix arg."
(point-at-bol))
ret-dest-todo (org-entry-get
root-marker "TODO"))
- (let ((ids (org-entry-get-multivalued-property
- root-marker gnorb-org-msg-id-key))
- (sent-id (plist-get gnorb-gnus-sending-message-info :msg-id)))
+ (let ((sent-id (plist-get gnorb-gnus-sending-message-info :msg-id)))
(when sent-id
(gnorb-registry-make-entry
sent-id
(plist-get gnorb-gnus-sending-message-info :from)
(plist-get gnorb-gnus-sending-message-info :subject)
- (org-id-get)
+ (org-id-get-create)
(plist-get gnorb-gnus-sending-message-info :group)))
(setq action (cond ((not
(or (and ret-dest-todo
@@ -176,6 +174,29 @@ the prefix arg."
(call-interactively note-func)
(call-interactively todo-func)))))
+(defun gnorb-pretty-outline (id &optional kw)
+ "Return pretty outline path of the Org heading indicated by ID.
+
+If the KW argument is true, add the TODO keyword into the path."
+ (org-with-point-at (org-id-find id t)
+ (let ((el (org-element-at-point)))
+ (concat
+ (if kw
+ (format "(%s): "
+ (org-element-property :todo-keyword el))
+ "")
+ (org-format-outline-path
+ (append
+ (list
+ (file-name-nondirectory
+ (buffer-file-name
+ (org-base-buffer (current-buffer)))))
+ (org-get-outline-path)
+ (list
+ (replace-regexp-in-string
+ org-bracket-link-regexp
+ "\\3" (org-element-property :raw-value el)))))))))
+
(defun gnorb-scan-links (bound &rest types)
;; this function could be refactored somewhat -- lots of code
;; repetition. It also should be a little faster for when we're
- [elpa] externals/gnorb b70d845 168/449: Handle nil group values in registry entries, (continued)
- [elpa] externals/gnorb b70d845 168/449: Handle nil group values in registry entries, Stefan Monnier, 2020/11/27
- [elpa] externals/gnorb 880afd6 158/449: Register sent messages so we can view them later, Stefan Monnier, 2020/11/27
- [elpa] externals/gnorb 25aa0f1 173/449: Use a marker in conjunction with window conf, Stefan Monnier, 2020/11/27
- [elpa] externals/gnorb e1129e9 170/449: Fix problems when BBDB is not present and gnorb-bbdb is not loaded., Stefan Monnier, 2020/11/27
- [elpa] externals/gnorb 5f96b98 167/449: Stupid typo, Stefan Monnier, 2020/11/27
- [elpa] externals/gnorb 9a2f747 175/449: Don't hint messages in nnir or virtual summaries, Stefan Monnier, 2020/11/27
- [elpa] externals/gnorb ec44a6d 182/449: Continue shifting candidate finding to the registry, Stefan Monnier, 2020/11/27
- [elpa] externals/gnorb 927e401 184/449: New function for restoring window layout, Stefan Monnier, 2020/11/27
- [elpa] externals/gnorb a352586 189/449: Improve lookups for entries with unknown groups, Stefan Monnier, 2020/11/27
- [elpa] externals/gnorb 81fed4b 193/449: Helper function for transitioning to the new system, Stefan Monnier, 2020/11/27
- [elpa] externals/gnorb d7327b5 192/449: The big switch! Rely only on registry for tracking,
Stefan Monnier <=
- [elpa] externals/gnorb 7ba1786 196/449: Use gnorb-gnus-message-info for incoming and outgoing, Stefan Monnier, 2020/11/27
- [elpa] externals/gnorb 0cb4d1a 201/449: Docstring for gnorb-scan-links, Stefan Monnier, 2020/11/27
- [elpa] externals/gnorb 5c9ef6e 203/449: Don't create Org IDs when scanning for mails, Stefan Monnier, 2020/11/27
- [elpa] externals/gnorb 9ac84b7 218/449: Return links in the order which they were found, Stefan Monnier, 2020/11/27
- [elpa] externals/gnorb a9535ae 223/449: Merge branch 'registry', Stefan Monnier, 2020/11/27
- [elpa] externals/gnorb dd4e013 225/449: Restore action shouldn't quit summary buffer, Stefan Monnier, 2020/11/27
- [elpa] externals/gnorb 08e0742 229/449: Empty News and gnorb.texi files, Stefan Monnier, 2020/11/27
- [elpa] externals/gnorb bcfd501 236/449: gitignore Elpa-generated stuff, Stefan Monnier, 2020/11/27
- [elpa] externals/gnorb 55a630d 238/449: Gnus hinting needs to check in-reply-to as well, Stefan Monnier, 2020/11/27
- [elpa] externals/gnorb d2831b8 237/449: Refactor summary buffer hinting into separate function, Stefan Monnier, 2020/11/27