aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuri Linkov2020-02-19 01:35:03 +0200
committerJuri Linkov2020-02-19 01:35:03 +0200
commit2b04ca05ad9f3679a047ffc06b35d2d61d74b12e (patch)
treef4e0225935a983eaf7e2054f130442507fa672ba
parent0c0fa1d5fddadea943a9813e491f3f7727b86f45 (diff)
downloademacs-2b04ca05ad9f3679a047ffc06b35d2d61d74b12e.tar.gz
emacs-2b04ca05ad9f3679a047ffc06b35d2d61d74b12e.zip
Support state changing VC operations in dired-mode on files (bug#34949)
* lisp/vc/vc.el (vc-deduce-fileset): Don't error out when observer is nil. (vc-dired-deduce-fileset): Add optional args 'state-model-only-files' and 'observer'. Check that all files are in a consistent state when state-model-only-files is non-nil. Error out on directories. * lisp/vc/vc-dispatcher.el (vc-dispatcher-browsing): Check dired-mode for derived-mode-p.
-rw-r--r--etc/NEWS5
-rw-r--r--lisp/vc/vc-dispatcher.el3
-rw-r--r--lisp/vc/vc.el35
3 files changed, 35 insertions, 8 deletions
diff --git a/etc/NEWS b/etc/NEWS
index 1f8e6049a88..1a51a90636d 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -96,6 +96,11 @@ shows equivalent key bindings for all commands that have them.
96 96
97* Changes in Specialized Modes and Packages in Emacs 28.1 97* Changes in Specialized Modes and Packages in Emacs 28.1
98 98
99** Dired
100
101*** State changing VC operations are supported in dired-mode on files
102(but still not on directories).
103
99** Help 104** Help
100 105
101+++ 106+++
diff --git a/lisp/vc/vc-dispatcher.el b/lisp/vc/vc-dispatcher.el
index 5ae300bf09b..4a04c9365a5 100644
--- a/lisp/vc/vc-dispatcher.el
+++ b/lisp/vc/vc-dispatcher.el
@@ -746,7 +746,8 @@ the buffer contents as a comment."
746 746
747(defun vc-dispatcher-browsing () 747(defun vc-dispatcher-browsing ()
748 "Are we in a directory browser buffer?" 748 "Are we in a directory browser buffer?"
749 (derived-mode-p 'vc-dir-mode)) 749 (or (derived-mode-p 'vc-dir-mode)
750 (derived-mode-p 'dired-mode)))
750 751
751;; These are unused. 752;; These are unused.
752;; (defun vc-dispatcher-in-fileset-p (fileset) 753;; (defun vc-dispatcher-in-fileset-p (fileset)
diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el
index ec252b74d47..f7d651fac6f 100644
--- a/lisp/vc/vc.el
+++ b/lisp/vc/vc.el
@@ -1032,9 +1032,7 @@ BEWARE: this function may change the current buffer."
1032 ((derived-mode-p 'vc-dir-mode) 1032 ((derived-mode-p 'vc-dir-mode)
1033 (vc-dir-deduce-fileset state-model-only-files)) 1033 (vc-dir-deduce-fileset state-model-only-files))
1034 ((derived-mode-p 'dired-mode) 1034 ((derived-mode-p 'dired-mode)
1035 (if observer 1035 (vc-dired-deduce-fileset state-model-only-files observer))
1036 (vc-dired-deduce-fileset)
1037 (error "State changing VC operations not supported in `dired-mode'")))
1038 ((setq backend (vc-backend buffer-file-name)) 1036 ((setq backend (vc-backend buffer-file-name))
1039 (if state-model-only-files 1037 (if state-model-only-files
1040 (list backend (list buffer-file-name) 1038 (list backend (list buffer-file-name)
@@ -1046,7 +1044,8 @@ BEWARE: this function may change the current buffer."
1046 ;; FIXME: Why this test? --Stef 1044 ;; FIXME: Why this test? --Stef
1047 (or (buffer-file-name vc-parent-buffer) 1045 (or (buffer-file-name vc-parent-buffer)
1048 (with-current-buffer vc-parent-buffer 1046 (with-current-buffer vc-parent-buffer
1049 (derived-mode-p 'vc-dir-mode)))) 1047 (or (derived-mode-p 'vc-dir-mode)
1048 (derived-mode-p 'dired-mode)))))
1050 (progn ;FIXME: Why not `with-current-buffer'? --Stef. 1049 (progn ;FIXME: Why not `with-current-buffer'? --Stef.
1051 (set-buffer vc-parent-buffer) 1050 (set-buffer vc-parent-buffer)
1052 (vc-deduce-fileset observer allow-unregistered state-model-only-files))) 1051 (vc-deduce-fileset observer allow-unregistered state-model-only-files)))
@@ -1066,9 +1065,31 @@ BEWARE: this function may change the current buffer."
1066 (list buffer-file-name)))) 1065 (list buffer-file-name))))
1067 (t (error "File is not under version control"))))) 1066 (t (error "File is not under version control")))))
1068 1067
1069(defun vc-dired-deduce-fileset () 1068(declare-function dired-get-marked-files "dired"
1070 (list (vc-responsible-backend default-directory) 1069 (&optional localp arg filter distinguish-one-marked error))
1071 (dired-map-over-marks (dired-get-filename nil t) nil))) 1070
1071(defun vc-dired-deduce-fileset (&optional state-model-only-files observer)
1072 (let ((backend (vc-responsible-backend default-directory))
1073 (files (dired-get-marked-files nil nil nil nil t))
1074 only-files-list
1075 state
1076 model)
1077 (when (and (not observer) (cl-some #'file-directory-p files))
1078 (error "State changing VC operations on directories not supported in `dired-mode'"))
1079
1080 (when state-model-only-files
1081 (setq only-files-list (mapcar (lambda (file) (cons file (vc-state file))) files))
1082 (setq state (cdar only-files-list))
1083 ;; Check that all files are in a consistent state, since we use that
1084 ;; state to decide which operation to perform.
1085 (dolist (crt (cdr only-files-list))
1086 (unless (vc-compatible-state (cdr crt) state)
1087 (error "When applying VC operations to multiple files, the files are required\nto be in similar VC states.\n%s in state %s clashes with %s in state %s"
1088 (car crt) (cdr crt) (caar only-files-list) state)))
1089 (setq only-files-list (mapcar 'car only-files-list))
1090 (when (and state (not (eq state 'unregistered)))
1091 (setq model (vc-checkout-model backend only-files-list))))
1092 (list backend files only-files-list state model)))
1072 1093
1073(defun vc-ensure-vc-buffer () 1094(defun vc-ensure-vc-buffer ()
1074 "Make sure that the current buffer visits a version-controlled file." 1095 "Make sure that the current buffer visits a version-controlled file."