* filenotify.el (file-notify--library): Renamed from
authorMichael Albinus <michael.albinus@gmx.de>
Thu, 18 Jul 2013 10:03:49 +0000 (12:03 +0200)
committerMichael Albinus <michael.albinus@gmx.de>
Thu, 18 Jul 2013 10:03:49 +0000 (12:03 +0200)
`file-notify-support'.  Do not autoload.  Adapt all uses.
(file-notify-supported-p): New defun.

* autorevert.el (auto-revert-use-notify): Use
`file-notify-supported-p' instead of `file-notify-support'.  Adapt
docstring.
(auto-revert-notify-add-watch): Use `file-notify-supported-p'.

* net/tramp.el (tramp-file-name-for-operation):
Add `file-notify-supported-p'.

* net/tramp-sh.el (tramp-sh-handle-file-notify-supported-p):
New defun.
(tramp-sh-file-name-handler-alist): Add it as handler for
`file-notify-supported-p '.

* net/tramp-adb.el (tramp-adb-file-name-handler-alist):
* net/tramp-gvfs.el (tramp-gvfs-file-name-handler-alist):
* net/tramp-smb.el (tramp-smb-file-name-handler-alist):
Add `ignore' as handler for `file-notify-*' functions.

lisp/ChangeLog
lisp/autorevert.el
lisp/filenotify.el
lisp/net/tramp-adb.el
lisp/net/tramp-gvfs.el
lisp/net/tramp-sh.el
lisp/net/tramp-smb.el
lisp/net/tramp.el

index 25fd3e6..fc38ef0 100644 (file)
@@ -1,3 +1,27 @@
+2013-07-18  Michael Albinus  <michael.albinus@gmx.de>
+
+       * filenotify.el (file-notify--library): Renamed from
+       `file-notify-support'.  Do not autoload.  Adapt all uses.
+       (file-notify-supported-p): New defun.
+
+       * autorevert.el (auto-revert-use-notify): Use
+       `file-notify-supported-p' instead of `file-notify-support'.  Adapt
+       docstring.
+       (auto-revert-notify-add-watch): Use `file-notify-supported-p'.
+
+       * net/tramp.el (tramp-file-name-for-operation):
+       Add `file-notify-supported-p'.
+
+       * net/tramp-sh.el (tramp-sh-handle-file-notify-supported-p):
+       New defun.
+       (tramp-sh-file-name-handler-alist): Add it as handler for
+       `file-notify-supported-p '.
+
+       * net/tramp-adb.el (tramp-adb-file-name-handler-alist):
+       * net/tramp-gvfs.el (tramp-gvfs-file-name-handler-alist):
+       * net/tramp-smb.el (tramp-smb-file-name-handler-alist):
+       Add `ignore' as handler for `file-notify-*' functions.
+
 2013-07-17  Eli Zaretskii  <eliz@gnu.org>
 
        * simple.el (line-move-partial, line-move): Don't start vscroll or
index 00e88fc..5c593e2 100644 (file)
@@ -271,21 +271,20 @@ This variable becomes buffer local when set in any fashion.")
   :type 'boolean
   :version "24.4")
 
-(defcustom auto-revert-use-notify (and file-notify-support t)
+(defcustom auto-revert-use-notify
+  ;; We use the support of the local filesystem as default.
+  (file-notify-supported-p temporary-file-directory)
   "If non-nil Auto Revert Mode uses file notification functions.
-This requires Emacs being compiled with file notification
-support (see `file-notify-support').  You should set this variable
-through Custom."
+You should set this variable through Custom."
   :group 'auto-revert
   :type 'boolean
   :set (lambda (variable value)
-        (set-default variable (and file-notify-support value))
+        (set-default variable value)
         (unless (symbol-value variable)
-          (when file-notify-support
-            (dolist (buf (buffer-list))
-              (with-current-buffer buf
-                (when (symbol-value 'auto-revert-notify-watch-descriptor)
-                  (auto-revert-notify-rm-watch)))))))
+          (dolist (buf (buffer-list))
+            (with-current-buffer buf
+              (when (symbol-value 'auto-revert-notify-watch-descriptor)
+                (auto-revert-notify-rm-watch))))))
   :initialize 'custom-initialize-default
   :version "24.4")
 
@@ -513,7 +512,8 @@ will use an up-to-date value of `auto-revert-interval'"
     (set (make-local-variable 'auto-revert-use-notify) nil))
 
   (when (and buffer-file-name auto-revert-use-notify
-            (not auto-revert-notify-watch-descriptor))
+            (not auto-revert-notify-watch-descriptor)
+            (file-notify-supported-p buffer-file-name))
     (setq auto-revert-notify-watch-descriptor
          (ignore-errors
            (file-notify-add-watch
index e170db2..c9a7e10 100644 (file)
@@ -27,8 +27,7 @@
 
 ;;; Code:
 
-;;;###autoload
-(defconst file-notify-support
+(defconst file-notify--library
   (cond
    ((featurep 'gfilenotify) 'gfilenotify)
    ((featurep 'inotify) 'inotify)
@@ -191,6 +190,17 @@ car of that event, which is the symbol `file-notify'."
            (funcall callback (list desc action file file1))
          (funcall callback (list desc action file)))))))
 
+(defun file-notify-supported-p (file)
+  "Returns non-nil if filesystem pertaining to FILE could be watched."
+  (unless (stringp file)
+    (signal 'wrong-type-argument (list file)))
+  (setq file (expand-file-name file))
+
+  (let ((handler (find-file-name-handler file 'file-notify-supported-p)))
+    (if handler
+       (funcall handler 'file-notify-supported-p file)
+      (and file-notify--library t))))
+
 (defun file-notify-add-watch (file flags callback)
   "Add a watch for filesystem events pertaining to FILE.
 This arranges for filesystem events pertaining to FILE to be reported
@@ -238,7 +248,7 @@ FILE is the name of the file whose event is being reported."
 
   (let* ((handler (find-file-name-handler file 'file-notify-add-watch))
         (dir (directory-file-name
-              (if (or (and (not handler) (eq file-notify-support 'w32notify))
+              (if (or (and (not handler) (eq file-notify--library 'w32notify))
                       (file-directory-p file))
                   file
                 (file-name-directory file))))
@@ -259,32 +269,32 @@ FILE is the name of the file whose event is being reported."
 
        ;; Check, whether Emacs has been compiled with file
        ;; notification support.
-       (unless file-notify-support
+       (unless file-notify--library
          (signal 'file-notify-error
                  '("No file notification package available")))
 
        ;; Determine low-level function to be called.
        (setq func (cond
-                   ((eq file-notify-support 'gfilenotify) 'gfile-add-watch)
-                   ((eq file-notify-support 'inotify) 'inotify-add-watch)
-                   ((eq file-notify-support 'w32notify) 'w32notify-add-watch)))
+                   ((eq file-notify--library 'gfilenotify) 'gfile-add-watch)
+                   ((eq file-notify--library 'inotify) 'inotify-add-watch)
+                   ((eq file-notify--library 'w32notify) 'w32notify-add-watch)))
 
        ;; Determine respective flags.
-       (if (eq file-notify-support 'gfilenotify)
+       (if (eq file-notify--library 'gfilenotify)
            (setq l-flags '(watch-mounts send-moved))
          (when (memq 'change flags)
            (setq
             l-flags
             (cond
-             ((eq file-notify-support 'inotify) '(create modify move delete))
-             ((eq file-notify-support 'w32notify)
+             ((eq file-notify--library 'inotify) '(create modify move delete))
+             ((eq file-notify--library 'w32notify)
               '(file-name directory-name size last-write-time)))))
          (when (memq 'attribute-change flags)
            (add-to-list
             'l-flags
             (cond
-             ((eq file-notify-support 'inotify) 'attrib)
-             ((eq file-notify-support 'w32notify) 'attributes)))))
+             ((eq file-notify--library 'inotify) 'attrib)
+             ((eq file-notify--library 'w32notify) 'attributes)))))
 
        ;; Call low-level function.
        (setq desc (funcall func dir l-flags 'file-notify-callback))))
@@ -311,9 +321,9 @@ DESCRIPTOR should be an object returned by `file-notify-add-watch'."
          (funcall handler 'file-notify-rm-watch descriptor)
        (funcall
         (cond
-         ((eq file-notify-support 'gfilenotify) 'gfile-rm-watch)
-         ((eq file-notify-support 'inotify) 'inotify-rm-watch)
-         ((eq file-notify-support 'w32notify) 'w32notify-rm-watch))
+         ((eq file-notify--library 'gfilenotify) 'gfile-rm-watch)
+         ((eq file-notify--library 'inotify) 'inotify-rm-watch)
+         ((eq file-notify--library 'w32notify) 'w32notify-rm-watch))
         descriptor)))
 
     (remhash descriptor file-notify-descriptors)))
index 14fb857..56c0ee2 100644 (file)
     (file-writable-p . tramp-adb-handle-file-writable-p)
     (file-local-copy . tramp-adb-handle-file-local-copy)
     (file-modes . tramp-handle-file-modes)
+    (file-notify-add-watch . ignore)
+    (file-notify-rm-watch . ignore)
+    (file-notify-supported-p .  ignore)
     (expand-file-name . tramp-adb-handle-expand-file-name)
     (find-backup-file-name . tramp-handle-find-backup-file-name)
     (directory-files . tramp-handle-directory-files)
index c2fdc04..5264081 100644 (file)
@@ -435,6 +435,9 @@ Every entry is a list (NAME ADDRESS).")
     (file-name-nondirectory . tramp-handle-file-name-nondirectory)
     ;; `file-name-sans-versions' performed by default handler.
     (file-newer-than-file-p . tramp-handle-file-newer-than-file-p)
+    (file-notify-add-watch . ignore)
+    (file-notify-rm-watch . ignore)
+    (file-notify-supported-p .  ignore)
     (file-ownership-preserved-p . ignore)
     (file-readable-p . tramp-gvfs-handle-file-readable-p)
     (file-regular-p . tramp-handle-file-regular-p)
index c92eacd..d2fc1b9 100644 (file)
@@ -867,7 +867,8 @@ of command line.")
     (set-file-acl . tramp-sh-handle-set-file-acl)
     (vc-registered . tramp-sh-handle-vc-registered)
     (file-notify-add-watch . tramp-sh-handle-file-notify-add-watch)
-    (file-notify-rm-watch . tramp-sh-handle-file-notify-rm-watch))
+    (file-notify-rm-watch . tramp-sh-handle-file-notify-rm-watch)
+    (file-notify-supported-p . tramp-sh-handle-file-notify-supported-p))
   "Alist of handler functions.
 Operations not mentioned here will be handled by the normal Emacs functions.")
 
@@ -3498,6 +3499,13 @@ Fall back to normal file name handler if no Tramp handler exists."
   (tramp-message proc 6 (format "Kill %S" proc))
   (kill-process proc))
 
+(defun tramp-sh-handle-file-notify-supported-p (file-name)
+  "Like `file-notify-supported-p' for Tramp files."
+  (with-parsed-tramp-file-name (expand-file-name file-name) nil
+    (and (or (tramp-get-remote-gvfs-monitor-dir v)
+            (tramp-get-remote-inotifywait v))
+        t)))
+
 ;;; Internal Functions:
 
 (defun tramp-maybe-send-script (vec script name)
index 65c52ae..d9bb505 100644 (file)
@@ -209,6 +209,9 @@ See `tramp-actions-before-shell' for more info.")
     (file-name-nondirectory . tramp-handle-file-name-nondirectory)
     ;; `file-name-sans-versions' performed by default handler.
     (file-newer-than-file-p . tramp-handle-file-newer-than-file-p)
+    (file-notify-add-watch . ignore)
+    (file-notify-rm-watch . ignore)
+    (file-notify-supported-p .  ignore)
     (file-ownership-preserved-p . ignore)
     (file-readable-p . tramp-handle-file-exists-p)
     (file-regular-p . tramp-handle-file-regular-p)
index 3513701..fd5435b 100644 (file)
@@ -1980,8 +1980,8 @@ ARGS are the arguments OPERATION has been called with."
                  ;; Emacs 22+ only.
                  'set-file-times
                  ;; Emacs 24+ only.
-                 'file-acl 'file-notify-add-watch 'file-selinux-context
-                 'set-file-acl 'set-file-selinux-context
+                 'file-acl 'file-notify-add-watch 'file-notify-supported-p
+                 'file-selinux-context 'set-file-acl 'set-file-selinux-context
                  ;; XEmacs only.
                  'abbreviate-file-name 'create-file-buffer
                  'dired-file-modtime 'dired-make-compressed-filename