From: Michael Albinus Date: Sun, 20 Apr 2025 16:16:14 +0000 (+0200) Subject: Fix emerge.el for remote files X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=332ef34a7fc77f0e367b5c52e77f2e44607cc6df;p=emacs.git 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. (cherry picked from commit 8c04396b198e81c1467314e44b720e3322ca8643) --- diff --git a/lisp/vc/emerge.el b/lisp/vc/emerge.el index 45405028df9..56afcf4b7af 100644 --- a/lisp/vc/emerge.el +++ b/lisp/vc/emerge.el @@ -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 diff --git a/test/lisp/vc/emerge-tests.el b/test/lisp/vc/emerge-tests.el new file mode 100644 index 00000000000..e9c92dfaa79 --- /dev/null +++ b/test/lisp/vc/emerge-tests.el @@ -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