From 12a23d6c61ce04695e8d967e96843f94823df78b Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Sun, 22 Jan 2017 14:28:02 +0100 Subject: [PATCH] `org-entry-delete' can remove erroneous special properties * lisp/org.el (org-entry-delete): Also remove erroneously inserted special properties in properties drawer. Small refactoring. * testing/lisp/test-org.el (test-org/entry-delete): Add test. Reported-by: Michael Welle --- lisp/org.el | 34 ++++++++++++++++------------------ testing/lisp/test-org.el | 7 ++++++- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index 9df4468ee..cf3a889f7 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -16088,24 +16088,22 @@ If yes, return this value. If not, return the current value of the variable." "Delete PROPERTY from entry at point-or-marker POM. Accumulated properties, i.e. PROPERTY+, are also removed. Return non-nil when a property was removed." - (unless (member property org-special-properties) - (org-with-point-at pom - (let ((range (org-get-property-block))) - (when range - (let* ((begin (car range)) - (origin (cdr range)) - (end (copy-marker origin)) - (re (org-re-property - (concat (regexp-quote property) "\\+?") t t))) - (goto-char begin) - (while (re-search-forward re end t) - (delete-region (match-beginning 0) (line-beginning-position 2))) - ;; If drawer is empty, remove it altogether. - (when (= begin end) - (delete-region (line-beginning-position 0) - (line-beginning-position 2))) - ;; Return non-nil if some property was removed. - (prog1 (/= end origin) (set-marker end nil)))))))) + (org-with-point-at pom + (pcase (org-get-property-block) + (`(,begin . ,origin) + (let* ((end (copy-marker origin)) + (re (org-re-property + (concat (regexp-quote property) "\\+?") t t))) + (goto-char begin) + (while (re-search-forward re end t) + (delete-region (match-beginning 0) (line-beginning-position 2))) + ;; If drawer is empty, remove it altogether. + (when (= begin end) + (delete-region (line-beginning-position 0) + (line-beginning-position 2))) + ;; Return non-nil if some property was removed. + (prog1 (/= end origin) (set-marker end nil)))) + (_ nil)))) ;; Multi-values properties are properties that contain multiple values ;; These values are assumed to be single words, separated by whitespace. diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el index 4d299a94d..32cd441b1 100644 --- a/testing/lisp/test-org.el +++ b/testing/lisp/test-org.el @@ -4143,7 +4143,12 @@ Paragraph" (org-entry-delete (point) "A"))) (should-not (org-test-with-temp-text "* H\n:PROPERTIES:\n:A: 1\n:B: 2\n:END:" - (org-entry-delete (point) "C")))) + (org-entry-delete (point) "C"))) + ;; Special properties cannot be located in a drawer. Allow to + ;; remove them anyway, in case of user error. + (should + (org-test-with-temp-text "* H\n:PROPERTIES:\n:SCHEDULED: 1\n:END:" + (org-entry-delete (point) "SCHEDULED")))) (ert-deftest test-org/entry-get () "Test `org-entry-get' specifications."