Browse Source

Ensure that org-get-tags returns all local tags

* lisp/org.el: (org-get-tags) Create a clearer separation between
  local and inherited tags in the function, so that
  org-remove-uninherited tags is only run on inherited tags. This is
  important to avoid destroying existing tags when adding new tags.
* testing/lisp/test-org.el: (test-org/get-tags) Add regression test
Matt Lundin 10 months ago
parent
commit
5e27b2fd32
2 changed files with 15 additions and 7 deletions
  1. 8 7
      lisp/org.el
  2. 7 0
      testing/lisp/test-org.el

+ 8 - 7
lisp/org.el

@@ -14722,14 +14722,15 @@ Inherited tags have the `inherited' text property."
     (org-with-point-at (or pos (point))
       (unless (org-before-first-heading-p)
 	(org-back-to-heading t)
-	(let ((tags (org--get-local-tags)))
-	  (if (or local (not org-use-tag-inheritance)) tags
+	(let ((ltags (org--get-local-tags)) itags)
+	  (if (or local (not org-use-tag-inheritance)) ltags
+	    (setq itags org-file-tags)
 	    (while (org-up-heading-safe)
-	      (setq tags (append (mapcar #'org-add-prop-inherited
-					 (org--get-local-tags))
-				 tags)))
-	    (org-remove-uninherited-tags
-	     (delete-dups (append org-file-tags tags)))))))))
+	      (setq itags (append (mapcar #'org-add-prop-inherited
+					  (org--get-local-tags))
+				  itags)))
+	    (delete-dups
+	     (append (org-remove-uninherited-tags itags) ltags))))))))
 
 (defun org-get-buffer-tags ()
   "Get a table of all tags used in the buffer, for completion."

+ 7 - 0
testing/lisp/test-org.el

@@ -6190,6 +6190,13 @@ Paragraph<point>"
    (equal '("foo")
 	  (org-test-with-temp-text "* H1 :foo:\n* <point>H2 :bar:"
 	    (org-get-tags 1))))
+  ;; Make sure tags excluded from inheritance are returned if local
+  (should
+   (equal '("foo")
+	  (org-test-with-temp-text "* Test :foo:"
+            (let ((org-use-tag-inheritance t)
+                  (org-tags-exclude-from-inheritance '("foo")))
+	      (org-get-tags)))))
   ;; Pathological case: tagged headline with an empty body.
   (should (org-test-with-temp-text "* :tag:" (org-get-tags))))