1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-05 22:20:24 -08:00

Fix emerge.el for remote files

* lisp/vc/emerge.el (emerge-make-diff-list)
(emerge-make-diff3-list): Set proper `default-directory' in order
to support remote files.  (Bug#6850, Bug#74352)

* test/lisp/vc/emerge-tests.el: New file.
This commit is contained in:
Michael Albinus 2025-04-20 18:16:14 +02:00
parent 2f2fbae882
commit 8c04396b19
2 changed files with 93 additions and 10 deletions

View file

@ -583,6 +583,7 @@ This is *not* a user option, since Emerge uses it for its own processing.")
(with-current-buffer
emerge-diff-buffer
(erase-buffer)
(setq default-directory temporary-file-directory)
(shell-command
(format "%s %s %s %s"
(shell-quote-argument emerge-diff-program)
@ -755,16 +756,17 @@ This is *not* a user option, since Emerge uses it for its own processing.")
(defun emerge-make-diff3-list (file-A file-B file-ancestor)
(setq emerge-diff-buffer (get-buffer-create "*emerge-diff*"))
(with-current-buffer
emerge-diff-buffer
(erase-buffer)
(shell-command
(format "%s %s %s %s %s"
(shell-quote-argument emerge-diff3-program)
emerge-diff-options
(shell-quote-argument file-A)
(shell-quote-argument file-ancestor)
(shell-quote-argument file-B))
t))
emerge-diff-buffer
(erase-buffer)
(setq default-directory temporary-file-directory)
(shell-command
(format "%s %s %s %s %s"
(shell-quote-argument emerge-diff3-program)
emerge-diff-options
(shell-quote-argument file-A)
(shell-quote-argument file-ancestor)
(shell-quote-argument file-B))
t))
(emerge-prepare-error-list emerge-diff3-ok-lines-regexp)
(emerge-convert-diffs-to-markers
emerge-A-buffer emerge-B-buffer emerge-merge-buffer

View file

@ -0,0 +1,81 @@
;;; emerge-tests.el --- Tests of shadowfile -*- lexical-binding:t -*-
(require 'tramp)
(require 'ert-x)
(require 'emerge)
(setq auth-source-save-behavior nil
password-cache-expiry nil
;; When the remote user id is 0, Tramp refuses unsafe temporary files.
tramp-allow-unsafe-temporary-files
(or tramp-allow-unsafe-temporary-files noninteractive)
tramp-cache-read-persistent-data t ;; For auth-sources.
tramp-persistency-file-name nil
tramp-verbose 0
;; On macOS, `temporary-file-directory' is a symlinked directory.
temporary-file-directory (file-truename temporary-file-directory)
ert-remote-temporary-file-directory
(ignore-errors (file-truename ert-remote-temporary-file-directory)))
(ert-deftest emerge-test-files ()
"Check emerge for two files."
(skip-when (memq system-type '(windows-nt ms-dos)))
(skip-unless (file-remote-p ert-remote-temporary-file-directory))
;; Remote file.
(ert-with-temp-file
file1 :prefix (expand-file-name "emerge-tests" ert-remote-temporary-file-directory) :text "foo"
;; Local file.
(ert-with-temp-file
file2 :prefix (expand-file-name "emerge-tests" temporary-file-directory) :text "foo"
;; Output.
(ert-with-temp-file
file3 :prefix (expand-file-name "emerge-tests" temporary-file-directory)
;; Run emerge.
(should (emerge-files nil file1 file2 file3))
(cl-letf (((symbol-function #'y-or-n-p) #'always))
(emerge-quit nil))
;; Check result.
(with-temp-buffer
(insert-file-contents file3)
(should (string-equal "foo" (buffer-string))))))))
(ert-deftest emerge-test-files-with-ancestor ()
"Check emerge for three files."
(skip-when (memq system-type '(windows-nt ms-dos)))
(skip-unless (file-remote-p ert-remote-temporary-file-directory))
;; Remote file.
(ert-with-temp-file
file1 :prefix (expand-file-name "emerge-tests" ert-remote-temporary-file-directory) :text "foo"
;; Local file.
(ert-with-temp-file
file2 :prefix (expand-file-name "emerge-tests" temporary-file-directory) :text "foo"
;; Remote file.
(ert-with-temp-file
file3 :prefix (expand-file-name "emerge-tests" ert-remote-temporary-file-directory) :text "foo"
;; Output.
(ert-with-temp-file
file4 :prefix (expand-file-name "emerge-tests" temporary-file-directory)
;; Run emerge.
(should (emerge-files-with-ancestor nil file1 file2 file3 file4))
(cl-letf (((symbol-function #'y-or-n-p) #'always))
(emerge-quit nil))
;; Check result.
(with-temp-buffer
(insert-file-contents file4)
(should (string-equal "foo" (buffer-string)))))))))
(defun emerge-test-all (&optional interactive)
"Run all tests for `emerge-*'."
(interactive "p")
(if interactive
(ert-run-tests-interactively "^emerge-")
(ert-run-tests-batch "^emerge-")))
(provide 'emerge-tests)
;;; emerge-tests.el ends here