Browse Source

Fix the order of org-get-tags collected tags from #+filetags

* lisp/org.el (org-get-tags): Now org-get-tags returns tags list with
  tags from #+filetags in the beginning.

* testing/lisp/test-org.el (test-org/get-tags): Add test.

Fixes regression caused by commit
<https://code.orgmode.org/bzg/org-mode/commit/5e27b2fd326810e4ed876b094df852338909c1f8>.

Bug reported in
<https://lists.gnu.org/r/emacs-orgmode/2019-01/msg00052.html>.
Kaushal Modi 8 months ago
parent
commit
34e5dcfb06
2 changed files with 29 additions and 14 deletions
  1. 18 14
      lisp/org.el
  2. 11 0
      testing/lisp/test-org.el

+ 18 - 14
lisp/org.el

@@ -14714,26 +14714,30 @@ When argument POS is non-nil, retrieve tags for headline at POS.
 
 According to `org-use-tags-inheritance', tags may be inherited
 from parent headlines, and from the whole document, through
-`org-file-tags'.  However, when optional argument LOCAL is
-non-nil, only return tags specified at the headline.
+`org-file-tags'.  In this case, the returned list of tags
+contains tags in this order: file tags, tags inherited from
+parent headlines, local tags.
+
+However, when optional argument LOCAL is non-nil, only return
+tags specified at the headline.
 
 Inherited tags have the `inherited' text property."
   (if (and org-trust-scanner-tags
-	   (or (not pos) (eq pos (point)))
-	   (not local))
+           (or (not pos) (eq pos (point)))
+           (not local))
       org-scanner-tags
     (org-with-point-at (or pos (point))
       (unless (org-before-first-heading-p)
-	(org-back-to-heading t)
-	(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 itags (append (mapcar #'org-add-prop-inherited
-					  (org--get-local-tags))
-				  itags)))
-	    (delete-dups
-	     (append (org-remove-uninherited-tags itags) ltags))))))))
+        (org-back-to-heading t)
+        (let ((ltags (org--get-local-tags)) itags)
+          (if (or local (not org-use-tag-inheritance)) ltags
+            (while (org-up-heading-safe)
+              (setq itags (append (mapcar #'org-add-prop-inherited
+                                          (org--get-local-tags))
+                                  itags)))
+            (setq itags (append org-file-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."

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

@@ -6217,6 +6217,17 @@ Paragraph<point>"
             (let ((org-use-tag-inheritance t)
                   (org-tags-exclude-from-inheritance '("foo")))
 	      (org-get-tags)))))
+  ;; Test the collection of tags from #+filetags and parent tags.
+  (should
+   (equal '("a" "b" "c" "d")
+	  (org-test-with-temp-text (concat "#+filetags: a\n"
+					   "* Level 1 :b:\n"
+					   "** Level 2 :c:\n"
+					   "*** Level 3 :d:\n"
+					   "<point>")
+            (let ((org-use-tag-inheritance t))
+	      (org-mode-restart) ;So that `org-file-tags' get populated from #+filetags
+	      (org-get-tags)))))
   ;; Pathological case: tagged headline with an empty body.
   (should (org-test-with-temp-text "* :tag:" (org-get-tags))))