diff options
| -rw-r--r-- | lisp/ChangeLog | 7 | ||||
| -rw-r--r-- | lisp/vc-dispatcher.el | 44 |
2 files changed, 25 insertions, 26 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 65b7bc0e3e3..c7e546b6978 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog | |||
| @@ -1,3 +1,10 @@ | |||
| 1 | 2008-05-09 Stefan Monnier <monnier@iro.umontreal.ca> | ||
| 2 | |||
| 3 | * vc-dispatcher.el (vc-dispatcher-browsing): Use derived-mode-p. | ||
| 4 | (vc-dir-prepare-status-buffer): Use vc-dispatcher-browsing. | ||
| 5 | (vc-dispatcher-in-fileset-p): New fun. | ||
| 6 | (vc-dispatcher-selection-set): Use it to properly handle directories. | ||
| 7 | |||
| 1 | 2008-05-09 Dan Nicolaescu <dann@ics.uci.edu> | 8 | 2008-05-09 Dan Nicolaescu <dann@ics.uci.edu> |
| 2 | 9 | ||
| 3 | * vc.el (vc-version-diff, vc-print-log, vc-revert, vc-rollback) | 10 | * vc.el (vc-version-diff, vc-print-log, vc-revert, vc-rollback) |
diff --git a/lisp/vc-dispatcher.el b/lisp/vc-dispatcher.el index 002ac5438e6..2970854c019 100644 --- a/lisp/vc-dispatcher.el +++ b/lisp/vc-dispatcher.el | |||
| @@ -671,7 +671,7 @@ See `run-hooks'." | |||
| 671 | (unless create-new | 671 | (unless create-new |
| 672 | (dolist (buffer (buffer-list)) | 672 | (dolist (buffer (buffer-list)) |
| 673 | (set-buffer buffer) | 673 | (set-buffer buffer) |
| 674 | (when (and (eq major-mode 'vc-dir-mode) | 674 | (when (and (vc-dispatcher-browsing) |
| 675 | (string= (expand-file-name default-directory) dir)) | 675 | (string= (expand-file-name default-directory) dir)) |
| 676 | (return buffer))))))) | 676 | (return buffer))))))) |
| 677 | (or buf | 677 | (or buf |
| @@ -1326,7 +1326,17 @@ NOT-URGENT means it is ok to continue if the user says not to save." | |||
| 1326 | 1326 | ||
| 1327 | (defun vc-dispatcher-browsing () | 1327 | (defun vc-dispatcher-browsing () |
| 1328 | "Are we in a directory browser buffer?" | 1328 | "Are we in a directory browser buffer?" |
| 1329 | (eq major-mode 'vc-dir-mode)) | 1329 | (derived-mode-p 'vc-dir-mode)) |
| 1330 | |||
| 1331 | (defun vc-dispatcher-in-fileset-p (fileset) | ||
| 1332 | (let ((member nil)) | ||
| 1333 | (while (and (not member) fileset) | ||
| 1334 | (let ((elem (pop fileset))) | ||
| 1335 | (if (if (file-directory-p elem) | ||
| 1336 | (eq t (compare-strings buffer-file-name nil (length elem) | ||
| 1337 | elem nil nil)) | ||
| 1338 | (eq (current-buffer) (get-file-buffer elem))) | ||
| 1339 | (setq member t)))))) | ||
| 1330 | 1340 | ||
| 1331 | (defun vc-dispatcher-selection-set () | 1341 | (defun vc-dispatcher-selection-set () |
| 1332 | "Deduce a set of files to which to apply an operation. Return the fileset. | 1342 | "Deduce a set of files to which to apply an operation. Return the fileset. |
| @@ -1350,31 +1360,13 @@ containing that file. Otherwise, throw an error." | |||
| 1350 | (vc-dispatcher-selection-set))) | 1360 | (vc-dispatcher-selection-set))) |
| 1351 | ;; No good set here, throw error | 1361 | ;; No good set here, throw error |
| 1352 | (t (error "No fileset is available here."))))) | 1362 | (t (error "No fileset is available here."))))) |
| 1353 | ;; We assume, in order to avoid unpleasant surprises to the user, | 1363 | ;; We assume, in order to avoid unpleasant surprises to the user, |
| 1354 | ;; that a fileset is not in good shape to be handed to the user if the | 1364 | ;; that a fileset is not in good shape to be handed to the user if the |
| 1355 | ;; buffers visiting the fileset don't match the on-disk contents. | 1365 | ;; buffers visiting the fileset don't match the on-disk contents. |
| 1356 | (dolist (file files) | 1366 | ;; This is actually untrue for operations like `print-log' (or `diff' |
| 1357 | (let ((visited (get-file-buffer file))) | 1367 | ;; between two revisions), so maybe this should be moved elsewhere. |
| 1358 | (when visited | 1368 | (save-some-buffers |
| 1359 | (if (vc-dispatcher-browsing) | 1369 | nil (lambda () (vc-dispatcher-in-fileset-p fileset))) |
| 1360 | (switch-to-buffer-other-window visited) | ||
| 1361 | (set-buffer visited)) | ||
| 1362 | ;; Check relation of buffer and file, and make sure | ||
| 1363 | ;; user knows what he's doing. First, finding the file | ||
| 1364 | ;; will check whether the file on disk is newer. | ||
| 1365 | ;; Ignore buffer-read-only during this test, and | ||
| 1366 | ;; preserve find-file-literally. | ||
| 1367 | (let ((buffer-read-only (not (file-writable-p file)))) | ||
| 1368 | (find-file-noselect file nil find-file-literally)) | ||
| 1369 | (if (not (verify-visited-file-modtime (current-buffer))) | ||
| 1370 | (if (yes-or-no-p (format "Replace %s on disk with buffer contents? " file)) | ||
| 1371 | (write-file buffer-file-name) | ||
| 1372 | (error "Aborted")) | ||
| 1373 | ;; Now, check if we have unsaved changes. | ||
| 1374 | (vc-buffer-sync t) | ||
| 1375 | (when (buffer-modified-p) | ||
| 1376 | (or (y-or-n-p (message "Use %s on disk, keeping modified buffer? " file)) | ||
| 1377 | (error "Aborted"))))))) | ||
| 1378 | files)) | 1370 | files)) |
| 1379 | 1371 | ||
| 1380 | ;; arch-tag: 7d08b17f-5470-4799-914b-bfb9fcf6a246 | 1372 | ;; arch-tag: 7d08b17f-5470-4799-914b-bfb9fcf6a246 |