[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master deb61da: * lisp/dired-aux.el (dired-vc-rename-file): New defcusto

From: Juri Linkov
Subject: master deb61da: * lisp/dired-aux.el (dired-vc-rename-file): New defcustom.
Date: Wed, 6 Nov 2019 18:15:05 -0500 (EST)

branch: master
commit deb61da7a27698ddc0b95ba92d18c20f533bb802
Author: Juri Linkov <address@hidden>
Commit: Juri Linkov <address@hidden>

    * lisp/dired-aux.el (dired-vc-rename-file): New defcustom.
    (dired-rename-file): Call vc-rename-file when dired-vc-rename-file is 
    * lisp/vc/vc.el (vc-rename-file): Allow renaming added files.
    Call vc-file-clearprops on new file too for the case when
    old and new files were renamed to each other back and forth.
 etc/NEWS          |  3 +++
 lisp/dired-aux.el | 17 ++++++++++++++++-
 lisp/vc/vc.el     |  3 ++-
 3 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index 737053a..4d5d9f2 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -846,6 +846,9 @@ directories in the destination.
 *** The non-nil value of 'dired-dwim-target' uses one of the most recently
 visited windows with a Dired buffer instead of the next window.
+*** When the new user option 'dired-vc-rename-file' is non-nil,
+Dired performs file renaming using underlying version control system.
 ** Find-Dired
 *** New user option 'find-dired-refine-function'.
diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el
index b1521ec..722d036 100644
--- a/lisp/dired-aux.el
+++ b/lisp/dired-aux.el
@@ -1635,11 +1635,26 @@ If `ask', ask for user confirmation."
         (dired-log "Can't set date on %s:\n%s\n" from err))))))
+(defcustom dired-vc-rename-file nil
+  "Whether Dired should register file renaming in underlying vc system.
+If nil, use default `rename-file'.
+If non-nil and the renamed files are under version control,
+rename them using `vc-rename-file'."
+  :type '(choice (const :tag "Use rename-file" nil)
+                 (const :tag "Use vc-rename-file" t))
+  :group 'dired
+  :version "27.1")
 (defun dired-rename-file (file newname ok-if-already-exists)
   (dired-handle-overwrite newname)
   (dired-maybe-create-dirs (file-name-directory newname))
-  (rename-file file newname ok-if-already-exists) ; error is caught in 
+  (if (and dired-vc-rename-file
+           (vc-backend file)
+           (ignore-errors (vc-responsible-backend newname)))
+      (vc-rename-file file newname)
+    ;; error is caught in -create-files
+    (rename-file file newname ok-if-already-exists))
   ;; Silently rename the visited file of any buffer visiting this file.
   (and (get-file-buffer file)
        (with-current-buffer (get-file-buffer file)
diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el
index c982b02..20056de 100644
--- a/lisp/vc/vc.el
+++ b/lisp/vc/vc.el
@@ -2913,11 +2913,12 @@ current buffer's file name if it's under version 
     (when (file-exists-p new)
       (error "New file already exists"))
     (let ((state (vc-state old)))
-      (unless (memq state '(up-to-date edited))
+      (unless (memq state '(up-to-date edited added))
        (error "Please %s files before moving them"
               (if (stringp state) "check in" "update"))))
     (vc-call rename-file old new)
     (vc-file-clearprops old)
+    (vc-file-clearprops new)
     ;; Move the actual file (unless the backend did it already)
     (when (file-exists-p old) (rename-file old new))
     ;; ?? Renaming a file might change its contents due to keyword expansion.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]