diff options
| author | Sean Whitton | 2026-04-15 10:06:48 -0400 |
|---|---|---|
| committer | Sean Whitton | 2026-04-15 10:06:48 -0400 |
| commit | 43f0da207e2e87a1c1bcf3efbf29aae82b5f0cc6 (patch) | |
| tree | 0e55a87da1acf64f76ed52fabbd7680217bdc718 | |
| parent | 0ea1c0d831d230a8494431d168f95a72534ea2e6 (diff) | |
| download | emacs-43f0da207e2e87a1c1bcf3efbf29aae82b5f0cc6.tar.gz emacs-43f0da207e2e87a1c1bcf3efbf29aae82b5f0cc6.zip | |
Fix renaming whole directories with Mercurial
* lisp/vc/vc-hg.el (vc-hg-rename-file): Use 'hg mv --after'.
* test/lisp/vc/vc-tests/vc-tests.el (vc-test--rename-directory):
New test.
| -rw-r--r-- | lisp/vc/vc-hg.el | 7 | ||||
| -rw-r--r-- | test/lisp/vc/vc-tests/vc-tests.el | 66 |
2 files changed, 70 insertions, 3 deletions
diff --git a/lisp/vc/vc-hg.el b/lisp/vc/vc-hg.el index 398645e5a1e..1535e767ea5 100644 --- a/lisp/vc/vc-hg.el +++ b/lisp/vc/vc-hg.el | |||
| @@ -1189,10 +1189,13 @@ Should be called with DEFAULT-DIRECTORY equal to the repository root." | |||
| 1189 | (file-error nil))) | 1189 | (file-error nil))) |
| 1190 | (vc-hg-command nil 0 files "remove" "--after" "--force")) | 1190 | (vc-hg-command nil 0 files "remove" "--after" "--force")) |
| 1191 | 1191 | ||
| 1192 | ;; Modeled after the similar function in vc-bzr.el | ||
| 1193 | (defun vc-hg-rename-file (old new) | 1192 | (defun vc-hg-rename-file (old new) |
| 1194 | "Rename file from OLD to NEW using `hg mv'." | 1193 | "Rename file from OLD to NEW using `hg mv'." |
| 1195 | (vc-hg-command nil 0 (expand-file-name new) "mv" | 1194 | ;; Do the rename ourselves then update hg. Otherwise only registered |
| 1195 | ;; files are moved. ('git mv' moves both registered and unregistered | ||
| 1196 | ;; files which seems more useful.) | ||
| 1197 | (rename-file old new) | ||
| 1198 | (vc-hg-command nil 0 (expand-file-name new) "mv" "--after" | ||
| 1196 | (expand-file-name old))) | 1199 | (expand-file-name old))) |
| 1197 | 1200 | ||
| 1198 | (defun vc-hg-register (files &optional _comment) | 1201 | (defun vc-hg-register (files &optional _comment) |
diff --git a/test/lisp/vc/vc-tests/vc-tests.el b/test/lisp/vc/vc-tests/vc-tests.el index 788db646db3..ed0f2597bd0 100644 --- a/test/lisp/vc/vc-tests/vc-tests.el +++ b/test/lisp/vc/vc-tests/vc-tests.el | |||
| @@ -624,6 +624,54 @@ This checks also `vc-backend' and `vc-responsible-backend'." | |||
| 624 | (ignore-errors | 624 | (ignore-errors |
| 625 | (run-hooks 'vc-test--cleanup-hook)))))) | 625 | (run-hooks 'vc-test--cleanup-hook)))))) |
| 626 | 626 | ||
| 627 | (defun vc-test--rename-directory (backend) | ||
| 628 | "Check the rename-file action for directories." | ||
| 629 | (ert-with-temp-directory tempdir | ||
| 630 | (let ((vc-handled-backends `(,backend)) | ||
| 631 | (default-directory | ||
| 632 | (file-name-as-directory | ||
| 633 | (expand-file-name | ||
| 634 | (make-temp-name "vc-test") temporary-file-directory))) | ||
| 635 | (process-environment process-environment) | ||
| 636 | vc-test--cleanup-hook) | ||
| 637 | (vc--fix-home-for-bzr tempdir) | ||
| 638 | (unwind-protect | ||
| 639 | (progn | ||
| 640 | ;; Cleanup. | ||
| 641 | (add-hook | ||
| 642 | 'vc-test--cleanup-hook | ||
| 643 | (let ((dir default-directory)) | ||
| 644 | (lambda () (delete-directory dir 'recursive)))) | ||
| 645 | |||
| 646 | ;; Create empty repository. | ||
| 647 | (make-directory default-directory) | ||
| 648 | (vc-test--create-repo-function backend) | ||
| 649 | |||
| 650 | (let* ((tmp-dir (expand-file-name "dir1/" default-directory)) | ||
| 651 | (tmp-name1 (expand-file-name "foo" tmp-dir)) | ||
| 652 | (tmp-name2 (expand-file-name "bar" tmp-dir)) | ||
| 653 | (new-dir (expand-file-name "dir2/" default-directory)) | ||
| 654 | (new-name1 (expand-file-name "foo" new-dir)) | ||
| 655 | (new-name2 (expand-file-name "bar" new-dir))) | ||
| 656 | (make-directory tmp-dir) | ||
| 657 | (write-region "foo" nil tmp-name1 nil 'nomessage) | ||
| 658 | (write-region "bar" nil tmp-name2 nil 'nomessage) | ||
| 659 | ;; Register TMP-NAME1 but *not* TMP-NAME2. | ||
| 660 | (vc-register `(,backend | ||
| 661 | (,(file-relative-name tmp-name1 | ||
| 662 | default-directory)))) | ||
| 663 | |||
| 664 | (vc-rename-file (directory-file-name tmp-dir) | ||
| 665 | (directory-file-name new-dir)) | ||
| 666 | (should-not (file-exists-p tmp-name1)) | ||
| 667 | (should-not (file-exists-p tmp-name2)) | ||
| 668 | (should (file-exists-p new-name1)) | ||
| 669 | (should (file-exists-p new-name2)))) | ||
| 670 | |||
| 671 | ;; Save exit. | ||
| 672 | (ignore-errors | ||
| 673 | (run-hooks 'vc-test--cleanup-hook)))))) | ||
| 674 | |||
| 627 | (defvar vc-hg-global-switches) | 675 | (defvar vc-hg-global-switches) |
| 628 | 676 | ||
| 629 | (defmacro vc-test--with-author-identity (backend &rest body) | 677 | (defmacro vc-test--with-author-identity (backend &rest body) |
| @@ -1222,7 +1270,23 @@ This checks also `vc-backend' and `vc-responsible-backend'." | |||
| 1222 | ',(intern | 1270 | ',(intern |
| 1223 | (format "vc-test-%s01-register" backend-string)))))) | 1271 | (format "vc-test-%s01-register" backend-string)))))) |
| 1224 | (skip-unless (memq ',backend '(Git Hg))) | 1272 | (skip-unless (memq ',backend '(Git Hg))) |
| 1225 | (vc-test--checkin-patch ',backend)))))) | 1273 | (vc-test--checkin-patch ',backend)) |
| 1274 | |||
| 1275 | (ert-deftest | ||
| 1276 | ,(intern (format "vc-test-%s10-rename-directory" backend-string)) () | ||
| 1277 | ,(format "Check `vc-rename-file' with directories for the %s backend." | ||
| 1278 | backend-string) | ||
| 1279 | (skip-unless | ||
| 1280 | (ert-test-passed-p | ||
| 1281 | (ert-test-most-recent-result | ||
| 1282 | (ert-get-test | ||
| 1283 | ',(intern | ||
| 1284 | (format "vc-test-%s01-register" backend-string)))))) | ||
| 1285 | ;; See vc-test-*-rename-file regarding CVS and Mtn. | ||
| 1286 | ;; SVN requires all files to rename are registered but we want | ||
| 1287 | ;; to test a mix of registered and unregistered files in this test. | ||
| 1288 | (skip-when (memq ',backend '(CVS SVN Mtn))) | ||
| 1289 | (vc-test--rename-directory ',backend)))))) | ||
| 1226 | 1290 | ||
| 1227 | (provide 'vc-tests) | 1291 | (provide 'vc-tests) |
| 1228 | ;;; vc-tests.el ends here | 1292 | ;;; vc-tests.el ends here |