]> code.delx.au - gnu-emacs/commitdiff
Improve file notifications in Tramp
authorMichael Albinus <michael.albinus@gmx.de>
Fri, 11 Sep 2015 09:40:33 +0000 (11:40 +0200)
committerMichael Albinus <michael.albinus@gmx.de>
Fri, 11 Sep 2015 09:40:33 +0000 (11:40 +0200)
* lisp/net/tramp-sh.el (tramp-sh-handle-file-notify-add-watch):
Set proper events to watch for.
(tramp-sh-file-gvfs-monitor-dir-process-filter): Report only
watched events.

lisp/net/tramp-sh.el

index 79b024e831082ddb310f2bcd45b1b604a532424a..d9490a0c04b0fa9beb776a98c698f29bc0f48114 100644 (file)
@@ -3727,6 +3727,14 @@ Fall back to normal file name handler if no Tramp handler exists."
        ;; gvfs-monitor-dir.
        ((setq command (tramp-get-remote-gvfs-monitor-dir v))
        (setq filter 'tramp-sh-file-gvfs-monitor-dir-process-filter
+             events
+             (cond
+              ((and (memq 'change flags) (memq 'attribute-change flags))
+               '(created changed changes-done-hint moved deleted
+                         attribute-changed))
+              ((memq 'change flags)
+               '(created changed changes-done-hint moved deleted))
+              ((memq 'attribute-change flags) '(attribute-changed)))
              sequence `(,command ,localname)))
        ;; inotifywait.
        ((setq command (tramp-get-remote-inotifywait v))
@@ -3734,8 +3742,11 @@ Fall back to normal file name handler if no Tramp handler exists."
              events
              (cond
               ((and (memq 'change flags) (memq 'attribute-change flags))
-               "create,modify,move,delete,attrib")
-              ((memq 'change flags) "create,modify,move,delete")
+               (concat "create,modify,move,moved_from,moved_to,move_self,"
+                       "delete,delete_self,attrib"))
+              ((memq 'change flags)
+               (concat "create,modify,move,moved_from,moved_to,move_self,"
+                       "delete,delete_self"))
               ((memq 'attribute-change flags) "attrib"))
              sequence `(,command "-mq" "-e" ,events ,localname)))
        ;; None.
@@ -3758,12 +3769,15 @@ Fall back to normal file name handler if no Tramp handler exists."
           (mapconcat 'identity sequence " "))
        (tramp-message v 6 "Run `%s', %S" (mapconcat 'identity sequence " ") p)
        (tramp-set-connection-property p "vector" v)
+       ;; Needed for `tramp-sh-file-gvfs-monitor-dir-process-filter'.
+       (tramp-compat-process-put p 'events events)
        (tramp-compat-set-process-query-on-exit-flag p nil)
        (set-process-filter p filter)
        p))))
 
 (defun tramp-sh-file-gvfs-monitor-dir-process-filter (proc string)
-  "Read output from \"gvfs-monitor-dir\" and add corresponding file-notify events."
+  "Read output from \"gvfs-monitor-dir\" and add corresponding \
+file-notify events."
   (let ((remote-prefix
         (with-current-buffer (process-buffer proc)
           (file-remote-p default-directory)))
@@ -3798,7 +3812,8 @@ Fall back to normal file name handler if no Tramp handler exists."
        ;; Usually, we would add an Emacs event now.  Unfortunately,
        ;; `unread-command-events' does not accept several events at
        ;; once.  Therefore, we apply the callback directly.
-       (tramp-compat-funcall 'file-notify-callback object)))
+       (when (member (cadr object) (tramp-compat-process-get proc 'events))
+         (tramp-compat-funcall 'file-notify-callback object))))
 
     ;; Save rest of the string.
     (when (zerop (length string)) (setq string nil))