aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Whitton2026-04-15 10:06:48 -0400
committerSean Whitton2026-04-15 10:06:48 -0400
commit43f0da207e2e87a1c1bcf3efbf29aae82b5f0cc6 (patch)
tree0e55a87da1acf64f76ed52fabbd7680217bdc718
parent0ea1c0d831d230a8494431d168f95a72534ea2e6 (diff)
downloademacs-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.el7
-rw-r--r--test/lisp/vc/vc-tests/vc-tests.el66
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