ruediger / magit-filenotify

Refresh status buffer when git tree changes

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Breaks when using TRAMP

PythonNut opened this issue · comments

If magit-filenotify is enabled and magit-status is called on a TRAMP directory, the buffer will be caught in an infinite loop because of the extra delay of TRAMP causing magit-filenotify to trigger its own refresh conditions.

@PythonNut Can file notifications work at all for remote directories? I guess not, so a simple yet proper fix was to not activate magit-filenotify-mode if (file-remote-p default-directory) returns t, no?

@tsdh I think it does work doesn't it? The fact that it loops indicates that the file notification system is working, right?

@PythonNut Good point. :-)

Hm, I just tried to reproduce the issue by finding a git working copy directory on a remote server and doing M-x magit-status but I get the error: tramp-file-name-handler: No file notification program found on /ssh:horn@jiffybox:.

And now I tried on a different remote but then M-x magit-status asks me for which project to open the status buffer meaning that it didn't even recognize that the remote file or directory is tracked by git...

@PythonNut Well, actually I don't understand your description completely. magit-filenotify's refresh conditions are "something in a repo dir changed on disk". How does firing up or refreshing a magit status buffer change something on disk?

But anyway, it is possible that my PR #12 already solves this issue by accident. Essentially, it delays magit status buffer refreshes as long as new file notifications keep coming in in a short period of time. So please test if you find some time.

@tsdh git uses a lockfile (/.git/index.lock) to ensure that operations don't collide, so checking the status will create and destroy /.git/index.lock, which triggers the filenotify listener.

I'll look into your PR when I get a few spare minutes.

The .git directory is not watched at all with the current code so that shouldn't be the issue.

@PythonNut Good point. :-)

Hm, I just tried to reproduce the issue by finding a git working copy directory on a remote server and doing M-x magit-status but I get the error: tramp-file-name-handler: No file notification program found on /ssh:horn@jiffybox:.

Actually magit-filenotify works fine on remote repos, if gvfs-monitor-dir is installed.

It just seems to hang if it has to handle too many remote directories (A SSH+gvfs-monitor-dir process is spawned for every subdir). Actually its not usable on big repos.

I use GNU Emacs 24.5 and the tramp master branch.

Not sure how relevant this is since I haven't been following this thread, but

The .git directory is not watched at all with the current code so that shouldn't be the issue.

The file watching mechanism may cast a wider net than you expect, cf magit/magit#2454 (comment) and http://debbugs.gnu.org/cgi/bugreport.cgi?bug=22454

http://debbugs.gnu.org/cgi/bugreport.cgi?bug=22454 is fixed.

It's not "fixed" exactly, I closed it because there was no bug in Emacs: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=22454#13

So depending on the filesystem, it's possible that changes inside .git/ would trigger notifications events about the .git/ directory changing, even if Emacs is not listening for changes inside .git/. I'm not sure how relevant that is to this bug.

I just got the No file notification program found error when I tried to use magit-status on a remote machine through TRAMP. Is there any way to use Magit without the notification monitoring?

@alphapapa magit-filenotify is just an optional mode. You can run Magit without it. M-x magit-filenotify-mode RET will disable it. Remove it from magit-status-hook-mode to no longer automatically start it.