diff options
| author | Juri Linkov | 2020-02-19 01:35:03 +0200 |
|---|---|---|
| committer | Juri Linkov | 2020-02-19 01:35:03 +0200 |
| commit | 2b04ca05ad9f3679a047ffc06b35d2d61d74b12e (patch) | |
| tree | f4e0225935a983eaf7e2054f130442507fa672ba | |
| parent | 0c0fa1d5fddadea943a9813e491f3f7727b86f45 (diff) | |
| download | emacs-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/NEWS | 5 | ||||
| -rw-r--r-- | lisp/vc/vc-dispatcher.el | 3 | ||||
| -rw-r--r-- | lisp/vc/vc.el | 35 |
3 files changed, 35 insertions, 8 deletions
| @@ -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." |