branch: externals/org
commit f02b4c8b4d1dd4305bddfeebddaf8c545b63482d
Author: Ihor Radchenko <yanta...@posteo.net>
Commit: Ihor Radchenko <yanta...@posteo.net>

    org-refile-get-targets: Improve malformed target handling
    
    * lisp/org-refile.el (org-refile-get-targets): Throw better errors
    when `org-refile-targets' value is malformed.  Allow common mistake
    with not using a cons cell in the target description.
---
 lisp/org-refile.el | 45 +++++++++++++++++++++++++++------------------
 1 file changed, 27 insertions(+), 18 deletions(-)

diff --git a/lisp/org-refile.el b/lisp/org-refile.el
index f96182c00a..248b3f8ef3 100644
--- a/lisp/org-refile.el
+++ b/lisp/org-refile.el
@@ -273,8 +273,10 @@ converted to a headline before refiling."
        (entries (or org-refile-targets '((nil . (:level . 1)))))
        targets tgs files desc descre)
     (message "Getting targets...")
+    (cl-assert (listp entries) t "`org-refile-targets' must be a list of 
targets")
     (with-current-buffer (or default-buffer (current-buffer))
       (dolist (entry entries)
+        (cl-assert (consp entry) t "Refile target must be a cons cell (FILES . 
SPECIFICATION)")
        (setq files (car entry) desc (cdr entry))
        (cond
         ((null files) (setq files (list (current-buffer))))
@@ -285,26 +287,33 @@ converted to a headline before refiling."
         ((and (symbolp files) (boundp files))
          (setq files (symbol-value files))))
        (when (stringp files) (setq files (list files)))
-       (cond
-        ((eq (car desc) :tag)
-         (setq descre (concat "^\\*+[ \t]+.*?:" (regexp-quote (cdr desc)) 
":")))
-        ((eq (car desc) :todo)
-         (setq descre (concat "^\\*+[ \t]+" (regexp-quote (cdr desc)) "[ 
\t]")))
-        ((eq (car desc) :regexp)
-         (setq descre (cdr desc)))
-        ((eq (car desc) :level)
-         (setq descre (concat "^\\*\\{" (number-to-string
-                                         (if org-odd-levels-only
-                                             (1- (* 2 (cdr desc)))
-                                           (cdr desc)))
-                              "\\}[ \t]")))
-        ((eq (car desc) :maxlevel)
-         (setq descre (concat "^\\*\\{1," (number-to-string
+        ;; Allow commonly used (FILE :maxlevel N) and similar values.
+        (when (and (listp (cdr desc)) (null (cddr desc)))
+          (setq desc (cons (car desc) (cadr desc))))
+        (condition-case err
+           (cond
+            ((eq (car desc) :tag)
+             (setq descre (concat "^\\*+[ \t]+.*?:" (regexp-quote (cdr desc)) 
":")))
+            ((eq (car desc) :todo)
+             (setq descre (concat "^\\*+[ \t]+" (regexp-quote (cdr desc)) "[ 
\t]")))
+            ((eq (car desc) :regexp)
+             (setq descre (cdr desc)))
+            ((eq (car desc) :level)
+             (setq descre (concat "^\\*\\{" (number-to-string
                                            (if org-odd-levels-only
-                                               (1- (* 2 (cdr desc)))
+                                               (1- (* 2 (cdr desc)))
                                              (cdr desc)))
-                              "\\}[ \t]")))
-        (t (error "Bad refiling target description %s" desc)))
+                                  "\\}[ \t]")))
+            ((eq (car desc) :maxlevel)
+             (setq descre (concat "^\\*\\{1," (number-to-string
+                                             (if org-odd-levels-only
+                                                 (1- (* 2 (cdr desc)))
+                                               (cdr desc)))
+                                  "\\}[ \t]")))
+            (t (error "Bad refiling target description %s" desc)))
+          (error
+           (error "Error parsing refiling target description: %s"
+                  (error-message-string err))))
        (dolist (f files)
          (with-current-buffer (if (bufferp f) f (org-get-agenda-file-buffer f))
             (unless (derived-mode-p 'org-mode)

Reply via email to