]> git.eshelyaron.com Git - emacs.git/commitdiff
Add a new function 'file-backup-file-names'
authorLars Ingebrigtsen <larsi@gnus.org>
Mon, 24 Aug 2020 16:26:05 +0000 (18:26 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Mon, 24 Aug 2020 16:26:05 +0000 (18:26 +0200)
* lisp/files.el (file-backup-file-names): New function (bug#24089).
(file-newest-backup): Use it.

etc/NEWS
lisp/files.el

index a65852fcd0f03a9ea89434e3188bdeae2a7fe674..cd8cc317055f3d33b6c8674f4a7e8d483b754200 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1108,6 +1108,10 @@ ledit.el, lmenu.el, lucid.el and old-whitespace.el.
 \f
 * Lisp Changes in Emacs 28.1
 
+---
+*** New function 'file-backup-file-names'.
+This function returns all backup file names for the file in question.
+
 +++
 ** The 'count-lines' function now takes an optional parameter to
 ignore invisible lines.
index f92c3793b00eafa97e874e3d68d6661e3c3748fd..5102585d7de5daddbd4edc4284b45cdabcbe6e9e 100644 (file)
@@ -5655,25 +5655,27 @@ like `write-region' does."
 
 (defun file-newest-backup (filename)
   "Return most recent backup file for FILENAME or nil if no backups exist."
+  (car (file-backup-file-names filename)))
+
+(defun file-backup-file-names (filename)
+  "Return a list of backup files for FILENAME.
+The list will be sorted by newness."
   ;; `make-backup-file-name' will get us the right directory for
   ;; ordinary or numeric backups.  It might create a directory for
   ;; backups as a side-effect, according to `backup-directory-alist'.
   (let* ((filename (file-name-sans-versions
                    (make-backup-file-name (expand-file-name filename))))
-        (file (file-name-nondirectory filename))
-        (dir  (file-name-directory    filename))
-        (comp (file-name-all-completions file dir))
-         (newest nil)
-         tem)
-    (while comp
-      (setq tem (pop comp))
-      (cond ((and (backup-file-name-p tem)
-                  (string= (file-name-sans-versions tem) file))
-             (setq tem (concat dir tem))
-             (if (or (null newest)
-                     (file-newer-than-file-p tem newest))
-                 (setq newest tem)))))
-    newest))
+         (dir (file-name-directory filename)))
+    (sort
+     (seq-filter
+      (lambda (candidate)
+        (and (backup-file-name-p candidate)
+             (string= (file-name-sans-versions candidate) filename)))
+      (mapcar
+       (lambda (file)
+         (concat dir file))
+       (file-name-all-completions (file-name-nondirectory filename) dir)))
+     #'file-newer-than-file-p)))
 
 (defun rename-uniquely ()
   "Rename current buffer to a similar name not already taken.