From 452d0c52cdf9a1ac9fe0df8acff931e9ef94c0a2 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Fri, 21 Dec 2018 13:53:20 +0100 Subject: [PATCH] Fix Bug#33735 * lisp/net/tramp-sh.el (tramp-sh-gio-monitor-process-filter): Delete empty lines. (Bug#33735) (tramp-sh-inotifywait-process-filter): Use `string-match'. (tramp-set-remote-path): Check for PIPE_BUF but PATH_MAX. * test/lisp/filenotify-tests.el: Handle $REMOTE_FILE_NOTIFY_LIBRARY. (file-notify--deftest-remote): Suppress vc-handled-backends. (file-notify-test08-backup): Do not expect failure on hydra. (Bug#33735). --- lisp/net/tramp-compat.el | 1 + lisp/net/tramp-sh.el | 22 ++++++++++++---------- test/lisp/filenotify-tests.el | 27 ++++++++++++++++++++++++--- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/lisp/net/tramp-compat.el b/lisp/net/tramp-compat.el index e1bd18b0a90..eace3b38c26 100644 --- a/lisp/net/tramp-compat.el +++ b/lisp/net/tramp-compat.el @@ -264,6 +264,7 @@ If NAME is a remote file name, the local part of NAME is unquoted." A nil value for either argument stands for the current time." (equal (or t1 (current-time)) (or t2 (current-time))))) +;; `flatten-tree' has appeared in Emacs 27.1. (if (fboundp 'flatten-tree) (defalias 'tramp-compat-flatten-tree 'flatten-tree) (defun tramp-compat-flatten-tree (tree) diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index 2959422a5da..ba652bddd35 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -3615,11 +3615,14 @@ Fall back to normal file name handler if no Tramp handler exists." (string-match-p "Monitoring not supported\\|No locations given" string) (delete-process proc)) + ;; Delete empty lines. + (setq string (replace-regexp-in-string "\n\n" "\n" string)) + (while (string-match (eval-when-compile (concat "^[^:]+:" "[[:space:]]\\([^:]+\\):" - "[[:space:]]" (regexp-opt tramp-gio-events t) + "[[:space:]]" (regexp-opt tramp-gio-events t) "\\([[:space:]]\\([^:]+\\)\\)?$")) string) @@ -3713,7 +3716,7 @@ file-notify events." (tramp-message proc 6 "%S\n%s" proc string) (dolist (line (split-string string "[\n\r]+" 'omit)) ;; Check, whether there is a problem. - (unless (string-match-p + (unless (string-match (eval-when-compile (concat "^[^[:blank:]]+" "[[:blank:]]+\\([^[:blank:]]+\\)+" @@ -3880,6 +3883,9 @@ This function expects to be in the right *tramp* buffer." (setq result (buffer-substring (point) (point-at-eol))))) result))) +;; On hydra.nixos.org, the $PATH environment variable is too long to +;; send it. This is likely not due to PATH_MAX, but PIPE_BUF. We +;; check it, and use a temporary file in case of. See Bug#33781. (defun tramp-set-remote-path (vec) "Sets the remote environment PATH to existing directories. I.e., for each directory in `tramp-remote-path', it is tested @@ -3888,12 +3894,12 @@ variable PATH." (let ((command (format "PATH=%s; export PATH" (mapconcat 'identity (tramp-get-remote-path vec) ":"))) - (path-max - (with-tramp-connection-property vec "path-max" - (tramp-send-command-and-read vec "getconf PATH_MAX /"))) + (pipe-buf + (with-tramp-connection-property vec "pipe-buf" + (tramp-send-command-and-read vec "getconf PIPE_BUF /"))) tmpfile) (tramp-message vec 5 "Setting $PATH environment variable") - (if (< (length command) path-max) + (if (< (length command) pipe-buf) (tramp-send-command vec command) ;; Use a temporary file. (setq tmpfile (tramp-make-tramp-temp-file vec)) @@ -5785,10 +5791,6 @@ function cell is returned to be applied on a buffer." ;; gets confused about the file locking status. Try to find out why ;; the workaround doesn't work. ;; -;; * Allow out-of-band methods as _last_ multi-hop. Open a connection -;; until the last but one hop via `start-file-process'. Apply it -;; also for ftp and smb. -;; ;; * WIBNI if we had a command "trampclient"? If I was editing in ;; some shell with root privileges, it would be nice if I could ;; just call diff --git a/test/lisp/filenotify-tests.el b/test/lisp/filenotify-tests.el index 51b323f9b47..fb268b45138 100644 --- a/test/lisp/filenotify-tests.el +++ b/test/lisp/filenotify-tests.el @@ -31,6 +31,21 @@ ;; remote host, set this environment variable to "/dev/null" or ;; whatever is appropriate on your system. +;; For the remote file-notify library, Tramp checks for the existence +;; of a respective command. The first command found is used. In +;; order to use a dedicated one, the environment variable +;; $REMOTE_FILE_NOTIFY_LIBRARY shall be set, possible values are +;; "inotifywait", "gio-monitor" and "gvfs-monitor-dir". + +;; Local file-notify libraries are auto-detected during Emacs +;; configuration. This can be changed with a respective configuration +;; argument, like +;; +;; --with-file-notification=inotify +;; --with-file-notification=kqueue +;; --with-file-notification=gfile +;; --with-file-notification=w32 + ;; A whole test run can be performed calling the command `file-notify-test-all'. ;;; Code: @@ -64,6 +79,12 @@ (format "/mock::%s" temporary-file-directory))) "Temporary directory for Tramp tests.") +;; Filter suppressed remote file-notify libraries. +(when (stringp (getenv "REMOTE_FILE_NOTIFY_LIBRARY")) + (dolist (lib '("inotifywait" "gio-monitor" "gvfs-monitor-dir")) + (unless (string-equal (getenv "REMOTE_FILE_NOTIFY_LIBRARY") lib) + (add-to-list 'tramp-connection-properties `(nil ,lib nil))))) + (defvar file-notify--test-tmpdir nil) (defvar file-notify--test-tmpfile nil) (defvar file-notify--test-tmpfile1 nil) @@ -250,7 +271,8 @@ This returns only for the local case and gfilenotify; otherwise it is nil. (skip-unless (not ,skip)) (let* ((temporary-file-directory file-notify-test-remote-temporary-file-directory) - (ert-test (ert-get-test ',test))) + (ert-test (ert-get-test ',test)) + vc-handled-backends) (skip-unless (file-notify--test-remote-enabled)) (tramp-cleanup-connection (tramp-dissect-file-name temporary-file-directory) nil 'keep-password) @@ -1243,8 +1265,7 @@ delivered." (file-notify--test-cleanup))) (file-notify--deftest-remote file-notify-test08-backup - "Check that backup keeps file notification for remote files." - (if (getenv "EMACS_HYDRA_CI") :failed :passed)) ; fixme bug#33735 + "Check that backup keeps file notification for remote files.") (ert-deftest file-notify-test09-watched-file-in-watched-dir () "Watches a directory and a file in that directory separately.