Subject: bug#48067: 28.0.50; Tramp error: cannot determine gio monitor

From: Michael Albinus <[email-masked]>
Date: Wed, 28 Apr 2021 15:57:37 +0200

Thierry Volpiatto <[email-masked]> writes:

> Hello Michael,

Hi Thierry,

> What I did: M-x helm-find-files => /sudo::/home/thierry/tmp/
> Looks the watchers are recorded with a warning though.

That's OK. The warning tells us that it is an older gio version, which
doesn't want to speak about its implementation details. Not a big deal,
Tramp handles this.

> Then I delete test.txt from external terminal.
> It seems the watcher catched the event but the notification is with the
> local name of directory instead of the remote name.
> I.e. /home/thierry/tmp/ instead of /sudo::/home/thierry/tmp/
> not sure if it is normal.

That's OK. gio doesn't know Tramp and its syntax :-)

> 14:39:28.298343 tramp-sh-gio-monitor-process-filter (6) # #<process gio>
>
> (gio monitor:27194): GLib-GIO-%1b[1;33mWARNING%1b[0m **:
> %1b[34m14:39:28.217%1b[0m: Can't find module 'help' specified in GIO_USE_FILE_MONITOR

And here's the problem. The warning includes escape sequences, which are
not known to tramp-sh-gio-monitor-process-filter. So I've reworked the
patch as attached, could you pls test?

> Thanks.

Best regards, Michael.

*** /tmp/ediffoD9hFR	2021-04-28 15:56:06.972513700 +0200
--- /home/albinus/src/tramp/lisp/tramp-sh.el	2021-04-28 15:49:29.271184411 +0200
***************
*** 3730,3760 ****

        ;; Determine monitor name.
        (unless (tramp-connection-property-p proc "gio-file-monitor")
!         (cond
!          ;; We have seen this on cygwin gio and on emba.  Let's make some assumptions.
!          ((string-match
!            "Can't find module 'help' specified in GIO_USE_FILE_MONITOR" string)
!           (cond
!            ((getenv "EMACS_EMBA_CI")
!             (tramp-set-connection-property
!              proc "gio-file-monitor" 'GInotifyFileMonitor))
!            ((eq system-type 'cygwin)
!             (tramp-set-connection-property
!              proc "gio-file-monitor" 'GPollFileMonitor))
!            (t (tramp-error proc 'file-error "Cannot determine gio monitor"))))
!          ;; TODO: What happens, if several monitor names are reported?
!          ((string-match "\
  Supported arguments for GIO_USE_FILE_MONITOR environment variable:
  \\s-*\\([[:alpha:]]+\\) - 20" string)
-           (tramp-set-connection-property
-            proc "gio-file-monitor"
             (intern
!             (format "G%sFileMonitor" (capitalize (match-string 1 string))))))
!          (t (throw 'doesnt-work nil)))
!         (setq string (replace-match "" nil nil string)))

        ;; Delete empty lines.
!       (setq string (tramp-compat-string-replace "\n\n" "\n" string))

        (while (string-match
  	      (eval-when-compile
--- 3730,3758 ----

        ;; Determine monitor name.
        (unless (tramp-connection-property-p proc "gio-file-monitor")
!         (tramp-set-connection-property
!          proc "gio-file-monitor"
!          (cond
!           ;; We have seen this on cygwin gio and on emba.  Let's make
!           ;; some assumptions.
!           ((string-match
!             "Can't find module 'help' specified in GIO_USE_FILE_MONITOR" string)
!            (cond
!             ((getenv "EMACS_EMBA_CI") 'GInotifyFileMonitor)
!             ((eq system-type 'cygwin) 'GPollFileMonitor)
!             (t tramp-cache-undefined)))
!           ;; TODO: What happens, if several monitor names are reported?
!           ((string-match "\
  Supported arguments for GIO_USE_FILE_MONITOR environment variable:
  \\s-*\\([[:alpha:]]+\\) - 20" string)
             (intern
! 	    (format "G%sFileMonitor" (capitalize (match-string 1 string)))))
!           (t (throw 'doesnt-work nil))))
! 	(setq string (substring string (match-end 0))))

        ;; Delete empty lines.
!       (setq string (tramp-compat-string-replace "\n\n" "\n" string)
! 	    string (replace-regexp-in-string "^\n" "" string))

        (while (string-match
  	      (eval-when-compile