diff --git a/org-contacts.el b/org-contacts.el index bc07fc1..edc09fe 100644 --- a/org-contacts.el +++ b/org-contacts.el @@ -261,16 +261,37 @@ to dead or no buffer." (make-progress-reporter "Updating Org Contacts Database..." 0 (length org-contacts-files))) (i 0)) (dolist (file (org-contacts-files)) - (org-check-agenda-file file) - (with-current-buffer (org-get-agenda-file-buffer file) - (unless (eq major-mode 'org-mode) - (error "File %s is not in `org-mode'" file)) - (setf result - (append result - (org-scan-tags - 'org-contacts-at-point - contacts-matcher - todo-only)))) + (if (catch 'nextfile + ;; if file doesn't exist and the user agrees to removing it + ;; from org-agendas-list, 'nextfile is thrown. Catch it here + ;; and skip processing the file. + ;; + ;; TODO: suppose that the user has set an org-contacts-files + ;; list that contains an element that doesn't exist in the + ;; file system: in that case, the org-agenda-files list could + ;; be updated (and saved to the customizations of the user) if + ;; it contained the same file even though the org-agenda-files + ;; list wasn't actually used. I don't think it is normal that + ;; org-contacts updates org-agenda-files in this case, but + ;; short of duplicating org-check-agenda-files and + ;; org-remove-files, I don't know how to avoid it. + ;; + ;; A side effect of the TODO is that the faulty + ;; org-contacts-files list never gets updated and thus the + ;; user is always queried about the missing files when + ;; org-contacts-db-need-update-p returns true. + (org-check-agenda-file file)) + (message "Skipped %s removed from org-agenda-files list." + (abbreviate-file-name file)) + (with-current-buffer (org-get-agenda-file-buffer file) + (unless (eq major-mode 'org-mode) + (error "File %s is not in `org-mode'" file)) + (setf result + (append result + (org-scan-tags + 'org-contacts-at-point + contacts-matcher + todo-only))))) (progress-reporter-update progress-reporter (setq i (1+ i)))) (setf org-contacts-db result org-contacts-last-update (current-time))