]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix emerge.el for remote files
authorMichael Albinus <michael.albinus@gmx.de>
Sun, 20 Apr 2025 16:16:14 +0000 (18:16 +0200)
committerEshel Yaron <me@eshelyaron.com>
Mon, 21 Apr 2025 20:42:08 +0000 (22:42 +0200)
* 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)

lisp/vc/emerge.el
test/lisp/vc/emerge-tests.el [new file with mode: 0644]

index 45405028df9b907c08748aae68bc2880536eb958..56afcf4b7af89e2ab7715e6ee0dec97c2cb34378 100644 (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
diff --git a/test/lisp/vc/emerge-tests.el b/test/lisp/vc/emerge-tests.el
new file mode 100644 (file)
index 0000000..e9c92df
--- /dev/null
@@ -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