(fix): fix rename file corrupting database (#1308)

The rename file advice is passed relative file names: e.g. "foo.org" ->
"bar.org". This was not accounted for, and paths in the Org-roam
database are supposed to be absolute paths. This caused the storing of
relative paths in the Org-roam database, which were then never purged.

Fixes #1304
This commit is contained in:
Jethro Kuan
2020-11-19 22:26:59 +08:00
committed by GitHub
parent b17cc3b1e3
commit ab34dd138d
3 changed files with 41 additions and 37 deletions

View File

@ -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)

View File

@ -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))))))
(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))))
file)))
;;;;; Inserting
(defun org-roam-db--insert-meta (&optional update-p)

View File

@ -1412,19 +1412,23 @@ 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)
(setq new-buffer (or (find-buffer-visiting new-file)
(find-file-noselect new-file)))
(files-affected (org-roam-db-query [:select :distinct [source]
(setq files-affected (org-roam-db-query [:select :distinct [source]
:from links
:where (= dest $s1)]
old-file)))
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
@ -1446,7 +1450,7 @@ When NEW-FILE-OR-DIR is a directory, we use it to compute the new file path."
(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))))))
(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."