emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: "John Wiegley" <johnw@gnu.org>
To: emacs-orgmode@gnu.org
Subject: Patch to add a new org-archive hook and context info type
Date: Wed, 06 Nov 2024 22:19:22 -0800	[thread overview]
Message-ID: <m2ttcja7md.fsf@gnu.org> (raw)

Hello,

The following patch adds ‘org-archive-finalize-hook’, which runs earlier than
‘org-archive-hook’ and in the destination buffer, not the original file. This
allows the context to be extended, the archived entry to be cleaned up after
inseration, maybe even encrypted or hashed to prevent changes.

I also added a new ‘ARCHIVE_OLID’ context type, which preserves the ID of the
parent the archived entry was previously under. This is because ARCHIVE_OLPATH
is not stable: it’s very possible the tree structure may change over time and
invalidate the path. But as long as the original parent is not deleted, there
stands a better chance that the original context of the archived entry can be
restored.

John

--- a/lisp/org-archive.el
+++ b/lisp/org-archive.el
@@ -144,13 +144,26 @@ information."
 	      (const :tag "Priority" priority)
 	      (const :tag "Inherited tags" itags)
 	      (const :tag "Outline path" olpath)
+	      (const :tag "Outline parent id" olid)
 	      (const :tag "Local tags" ltags)))
 
-(defvar org-archive-hook nil
+(defcustom org-archive-hook nil
   "Hook run after successfully archiving a subtree.
 Hook functions are called with point on the subtree in the
 original file.  At this stage, the subtree has been added to the
-archive location, but not yet deleted from the original file.")
+archive location, but not yet deleted from the original file."
+  :group 'org-archive
+  :type 'hook)
+
+(defcustom org-archive-finalize-hook nil
+  "Hook run after successfully archiving a subtree in final location.
+Hook functions are called with point on the subtree in the
+destination file. Compare this with `org-archive-hook', which
+runs in the original file. At this stage, the subtree has been
+added to the archive location, but not yet deleted from the
+original file."
+  :group 'org-archive
+  :type 'hook)
 
 ;;;###autoload
 (defun org-add-archive-files (files)
@@ -299,6 +312,9 @@ direct children of this heading."
 		    (olpath . ,(mapconcat #'identity
 					  (org-get-outline-path)
 					  "/"))
+                    (olid . ,(org-with-wide-buffer
+                              (and (org-up-heading-safe)
+	                           (org-entry-get (point) "ID"))))
 		    (time . ,time)
 		    (todo . ,(org-entry-get (point) "TODO")))))
 	    ;; We first only copy, in case something goes wrong
@@ -393,6 +409,7 @@ direct children of this heading."
 		     (point)
 		     (concat "ARCHIVE_" (upcase (symbol-name item)))
 		     value))))
+              (run-hooks 'org-archive-finalize-hook)
 	      ;; Save the buffer, if it is not the same buffer and
 	      ;; depending on `org-archive-subtree-save-file-p'.
 	      (unless (eq this-buffer buffer)


                 reply	other threads:[~2024-11-07  6:20 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m2ttcja7md.fsf@gnu.org \
    --to=johnw@gnu.org \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).