diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ae9c2b..247b20b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ ### Fixed - [#1281](https://github.com/org-roam/org-roam/pull/1281) fixed idle-timer not instantiated on `org-roam-mode` +- [#1308](https://github.com/org-roam/org-roam/pull/1308) fixed file renames corrupting database ## 1.2.3 (13-11-2020) diff --git a/org-roam-db.el b/org-roam-db.el index 44ac476..97aa493 100644 --- a/org-roam-db.el +++ b/org-roam-db.el @@ -255,15 +255,14 @@ This function is called on `org-roam-db-file-update-timer'." (dolist (table (mapcar #'car org-roam-db--table-schemata)) (org-roam-db-query `[:delete :from ,table])))) -(defun org-roam-db--clear-file (&optional filepath) - "Remove any related links to the file at FILEPATH. +(defun org-roam-db--clear-file (&optional file) + "Remove any related links to the FILE. This is equivalent to removing the node from the graph." - (let ((file (expand-file-name (or filepath - (buffer-file-name (buffer-base-buffer)))))) - (dolist (table (mapcar #'car org-roam-db--table-schemata)) - (org-roam-db-query `[:delete :from ,table - :where (= ,(if (eq table 'links) 'source 'file) $s1)] - file)))) + (setq file (or file (buffer-file-name (buffer-base-buffer)))) + (dolist (table (mapcar #'car org-roam-db--table-schemata)) + (org-roam-db-query `[:delete :from ,table + :where (= ,(if (eq table 'links) 'source 'file) $s1)] + file))) ;;;;; Inserting (defun org-roam-db--insert-meta (&optional update-p) diff --git a/org-roam.el b/org-roam.el index fb4ec6c..224bbd5 100644 --- a/org-roam.el +++ b/org-roam.el @@ -1412,41 +1412,45 @@ To be added to `org-roam-title-change-hook'." When NEW-FILE-OR-DIR is a directory, we use it to compute the new file path." (let ((new-file (if (directory-name-p new-file-or-dir) (expand-file-name (file-name-nondirectory old-file) new-file-or-dir) - new-file-or-dir))) + new-file-or-dir)) + files-affected + new-buffer) + (setq new-file (expand-file-name new-file)) + (setq old-file (expand-file-name old-file)) (when (and (not (auto-save-file-name-p old-file)) (not (auto-save-file-name-p new-file)) (not (backup-file-name-p old-file)) (not (backup-file-name-p new-file)) (org-roam--org-roam-file-p old-file)) (org-roam-db--ensure-built) - (let* ((new-buffer (or (find-buffer-visiting new-file) - (find-file-noselect new-file))) - (files-affected (org-roam-db-query [:select :distinct [source] - :from links - :where (= dest $s1)] - old-file))) - ;; Remove database entries for old-file.org - (org-roam-db--clear-file old-file) - ;; Replace links from old-file.org -> new-file.org in all Org-roam files with these links - (mapc (lambda (file) - (setq file (if (string-equal (car file) old-file) - new-file - (car file))) - (with-current-buffer (or (find-buffer-visiting file) - (find-file-noselect file)) - (org-roam--replace-link old-file new-file) - (save-buffer) - (org-roam-db--update-file))) - files-affected) - ;; If the new path is in a different directory, relative links - ;; will break. Fix all file-relative links: - (unless (string= (file-name-directory old-file) - (file-name-directory new-file)) - (with-current-buffer new-buffer - (org-roam--fix-relative-links old-file) - (save-buffer))) - (when (org-roam--org-roam-file-p new-file) - (org-roam-db--update-file new-file)))))) + (setq new-buffer (or (find-buffer-visiting new-file) + (find-file-noselect new-file))) + (setq files-affected (org-roam-db-query [:select :distinct [source] + :from links + :where (= dest $s1)] + old-file)) + ;; Remove database entries for old-file.org + (org-roam-db--clear-file old-file) + ;; Replace links from old-file.org -> new-file.org in all Org-roam files with these links + (mapc (lambda (file) + (setq file (if (string-equal (car file) old-file) + new-file + (car file))) + (with-current-buffer (or (find-buffer-visiting file) + (find-file-noselect file)) + (org-roam--replace-link old-file new-file) + (save-buffer) + (org-roam-db--update-file))) + files-affected) + ;; If the new path is in a different directory, relative links + ;; will break. Fix all file-relative links: + (unless (string= (file-name-directory old-file) + (file-name-directory new-file)) + (with-current-buffer new-buffer + (org-roam--fix-relative-links old-file) + (save-buffer))) + (when (org-roam--org-roam-file-p new-file) + (org-roam-db--update-file new-file))))) (defun org-roam--id-new-advice (&rest _args) "Update the database if a new Org ID is created."