Skip to content

Conversation

lewis6991
Copy link
Owner

  • Fix issue of watcher callback not being called when running
    with Watchman due to filename ignore check being done in the
    debounced section of the handler.

  • Only update abbrev_head when .git/HEAD is changed

  • Reduce watcher timer debounce interval to 200ms.

  • Add handwritten implementation of git rev-parse --abbrev-ref HEAD
    which reads .git/HEAD directly.

- Fix issue of watcher callback not being called when running
  with Watchman due to filename ignore check being done in the
  debounced section of the handler.

- Only update abbrev_head when `.git/HEAD` is changed

- Reduce watcher timer debounce interval to 200ms.

- Add handwritten implementation of `git rev-parse --abbrev-ref HEAD`
  which reads `.git/HEAD` directly.
@przepompownia
Copy link
Contributor

Unfortunately here I still can get outdated hunk signs (staging works) and still cannot find how to reproduce it.

@lewis6991
Copy link
Owner Author

Try looking at the debug messages, and see what events are getting picked up. This patch now explicitly marks when events are ignored.

@przepompownia
Copy link
Contributor

przepompownia commented Sep 22, 2025

This time I caught it when staging some untracked file, but previously got it also on versioned files. Staging/unstaging hunks action caused appending added lines to the stage (not checked what happens if there are deletions too):

$ GIT_PAGER= git diff --cached:

diff --git a/after/queries/make/indents.scm b/after/queries/make/indents.scm
new file mode 100644
index 0000000..45ca848
--- /dev/null
+++ b/after/queries/make/indents.scm
@@ -0,0 +1,12 @@
+[
+ (rule)
+ ] @indent.begin
+[
+ (rule)
+ ] @indent.begin
+[
+ (rule)
+ ] @indent.begin
+[
+ (rule)
+ ] @indent.begin

Debug messages (offtopic: notice checking extui buffers):

0.05 D dprintf: Deriving GitSignsAdd from Added
0.10 D derive: Deriving GitSignsChange from Changed
0.15 D derive: Deriving GitSignsDelete from Removed
0.19 D derive: Deriving GitSignsChangedelete from GitSignsChange
0.21 D derive: Deriving GitSignsTopdelete from GitSignsDelete
0.23 D derive: Deriving GitSignsUntracked from GitSignsAdd
0.26 D derive: Deriving GitSignsAddNr from GitSignsAdd
0.29 D derive: Deriving GitSignsChangeNr from GitSignsChange
0.32 D derive: Deriving GitSignsDeleteNr from GitSignsDelete
0.35 D derive: Deriving GitSignsChangedeleteNr from GitSignsChangeNr
0.37 D derive: Deriving GitSignsTopdeleteNr from GitSignsDeleteNr
0.39 D derive: Deriving GitSignsUntrackedNr from GitSignsAddNr
0.40 D derive: Deriving GitSignsAddLn from DiffAdd
0.44 D derive: Deriving GitSignsChangeLn from DiffChange
0.45 D derive: Deriving GitSignsChangedeleteLn from GitSignsChangeLn
0.49 D derive: Deriving GitSignsTopdeleteLn from GitSignsDeleteLn
0.51 D derive: Deriving GitSignsUntrackedLn from GitSignsAddLn
0.52 D derive: Deriving GitSignsAddCul from GitSignsAdd
0.53 D derive: Deriving GitSignsChangeCul from GitSignsChange
0.55 D derive: Deriving GitSignsDeleteCul from GitSignsDelete
0.56 D derive: Deriving GitSignsChangedeleteCul from GitSignsChangeCul
0.57 D derive: Deriving GitSignsTopdeleteCul from GitSignsDeleteCul
0.59 D derive: Deriving GitSignsUntrackedCul from GitSignsAddCul
0.66 D derive: Deriving GitSignsStagedAdd from GitSignsAdd
0.69 D derive: Deriving GitSignsStagedChange from GitSignsChange
0.71 D derive: Deriving GitSignsStagedDelete from GitSignsDelete
0.72 D derive: Deriving GitSignsStagedChangedelete from GitSignsChangedelete
0.74 D derive: Deriving GitSignsStagedTopdelete from GitSignsTopdelete
0.75 D derive: Deriving GitSignsStagedUntracked from GitSignsUntracked
0.77 D derive: Deriving GitSignsStagedAddNr from GitSignsAddNr
0.79 D derive: Deriving GitSignsStagedChangeNr from GitSignsChangeNr
0.81 D derive: Deriving GitSignsStagedDeleteNr from GitSignsDeleteNr
0.82 D derive: Deriving GitSignsStagedChangedeleteNr from GitSignsChangedeleteNr
0.86 D derive: Deriving GitSignsStagedTopdeleteNr from GitSignsTopdeleteNr
0.88 D derive: Deriving GitSignsStagedUntrackedNr from GitSignsUntrackedNr
0.89 D derive: Deriving GitSignsStagedAddLn from GitSignsAddLn
0.91 D derive: Deriving GitSignsStagedChangeLn from GitSignsChangeLn
0.92 D derive: Deriving GitSignsStagedChangedeleteLn from GitSignsChangedeleteLn
0.95 D derive: Could not derive GitSignsStagedTopdeleteLn
0.96 D derive: Deriving GitSignsStagedUntrackedLn from GitSignsUntrackedLn
1.00 D derive: Deriving GitSignsStagedAddCul from GitSignsAddCul
1.01 D derive: Deriving GitSignsStagedChangeCul from GitSignsChangeCul
1.03 D derive: Deriving GitSignsStagedDeleteCul from GitSignsDeleteCul
1.04 D derive: Deriving GitSignsStagedChangedeleteCul from GitSignsChangedeleteCul
1.05 D derive: Deriving GitSignsStagedTopdeleteCul from GitSignsTopdeleteCul
1.07 D derive: Deriving GitSignsStagedUntrackedCul from GitSignsUntrackedCul
1.08 D derive: Deriving GitSignsAddPreview from DiffAdd
1.10 D derive: Deriving GitSignsDeletePreview from DiffDelete
1.11 D derive: Deriving GitSignsCurrentLineBlame from NonText
1.13 D derive: Deriving GitSignsAddInline from TermCursor
1.17 D derive: Deriving GitSignsDeleteInline from TermCursor
1.18 D derive: Deriving GitSignsChangeInline from TermCursor
1.20 D derive: Deriving GitSignsAddLnInline from GitSignsAddInline
1.21 D derive: Deriving GitSignsChangeLnInline from GitSignsChangeInline
1.25 D derive: Deriving GitSignsDeleteLnInline from GitSignsDeleteInline
1.28 D derive: Deriving GitSignsDeleteVirtLn from DiffDelete
1.30 D derive: Deriving GitSignsDeleteVirtLnInLine from GitSignsDeleteLnInline
1.32 D derive: Deriving GitSignsVirtLnum from GitSignsDeleteVirtLn
28.55 D attach(2): Attaching (trigger=BufFilePost)
28.61 D git: git --version
54.07 D detach(3): Detached
54.08 D detach(3): Cache was nil
54.19 D attach(3): Attaching (trigger=BufFilePost)
58.47 D detach(4): Detached
58.48 D detach(4): Cache was nil
58.61 D attach(4): Attaching (trigger=BufFilePost)
63.02 D detach(5): Detached
63.03 D detach(5): Cache was nil
63.08 D attach(5): Attaching (trigger=BufFilePost)
69.53 D : Highlight GitSignsAdd is already defined
69.55 D : Highlight GitSignsChange is already defined
69.56 D : Highlight GitSignsDelete is already defined
69.58 D : Highlight GitSignsChangedelete is already defined
69.59 D : Highlight GitSignsTopdelete is already defined
69.63 D : Highlight GitSignsUntracked is already defined
69.64 D : Highlight GitSignsAddNr is already defined
69.66 D : Highlight GitSignsChangeNr is already defined
69.67 D : Highlight GitSignsDeleteNr is already defined
69.75 D : Highlight GitSignsChangedeleteNr is already defined
69.80 D : Highlight GitSignsTopdeleteNr is already defined
69.82 D : Highlight GitSignsUntrackedNr is already defined
69.84 D : Highlight GitSignsAddLn is already defined
69.85 D : Highlight GitSignsChangeLn is already defined
69.86 D : Highlight GitSignsChangedeleteLn is already defined
69.88 D : Highlight GitSignsTopdeleteLn is already defined
69.89 D : Highlight GitSignsUntrackedLn is already defined
69.91 D : Highlight GitSignsAddCul is already defined
69.92 D : Highlight GitSignsChangeCul is already defined
69.94 D : Highlight GitSignsDeleteCul is already defined
69.95 D : Highlight GitSignsChangedeleteCul is already defined
69.97 D : Highlight GitSignsTopdeleteCul is already defined
69.98 D : Highlight GitSignsUntrackedCul is already defined
70.01 D derive: Deriving GitSignsStagedAdd from GitSignsAdd
70.02 D derive: Deriving GitSignsStagedChange from GitSignsChange
70.04 D derive: Deriving GitSignsStagedDelete from GitSignsDelete
70.06 D derive: Deriving GitSignsStagedChangedelete from GitSignsChangedelete
70.08 D derive: Deriving GitSignsStagedTopdelete from GitSignsTopdelete
70.10 D derive: Deriving GitSignsStagedUntracked from GitSignsUntracked
70.11 D derive: Deriving GitSignsStagedAddNr from GitSignsAddNr
70.13 D derive: Deriving GitSignsStagedChangeNr from GitSignsChangeNr
70.15 D derive: Deriving GitSignsStagedDeleteNr from GitSignsDeleteNr
70.16 D derive: Deriving GitSignsStagedChangedeleteNr from GitSignsChangedeleteNr
70.18 D derive: Deriving GitSignsStagedTopdeleteNr from GitSignsTopdeleteNr
70.19 D derive: Deriving GitSignsStagedUntrackedNr from GitSignsUntrackedNr
70.21 D derive: Deriving GitSignsStagedAddLn from GitSignsAddLn
70.22 D derive: Deriving GitSignsStagedChangeLn from GitSignsChangeLn
70.24 D derive: Deriving GitSignsStagedChangedeleteLn from GitSignsChangedeleteLn
70.25 D derive: Deriving GitSignsStagedTopdeleteLn from GitSignsTopdeleteLn
70.27 D derive: Deriving GitSignsStagedUntrackedLn from GitSignsUntrackedLn
70.28 D derive: Deriving GitSignsStagedAddCul from GitSignsAddCul
70.30 D derive: Deriving GitSignsStagedChangeCul from GitSignsChangeCul
70.31 D derive: Deriving GitSignsStagedDeleteCul from GitSignsDeleteCul
70.33 D derive: Deriving GitSignsStagedChangedeleteCul from GitSignsChangedeleteCul
70.35 D derive: Deriving GitSignsStagedTopdeleteCul from GitSignsTopdeleteCul
70.36 D derive: Deriving GitSignsStagedUntrackedCul from GitSignsUntrackedCul
70.38 D : Highlight GitSignsAddPreview is already defined
70.39 D : Highlight GitSignsDeletePreview is already defined
70.41 D : Highlight GitSignsCurrentLineBlame is already defined
70.42 D : Highlight GitSignsAddInline is already defined
70.44 D : Highlight GitSignsDeleteInline is already defined
70.45 D : Highlight GitSignsChangeInline is already defined
70.47 D : Highlight GitSignsAddLnInline is already defined
70.49 D : Highlight GitSignsChangeLnInline is already defined
70.51 D : Highlight GitSignsDeleteLnInline is already defined
70.52 D : Highlight GitSignsDeleteVirtLn is already defined
70.54 D : Highlight GitSignsDeleteVirtLnInLine is already defined
70.55 D : Highlight GitSignsVirtLnum is already defined
71.41 D git: git rev-parse --show-toplevel --absolute-git-dir --abbrev-ref HEAD
74.50 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD config user.name
76.87 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD  ls-files --stage --others --exclude-standard --eol $CWD/[Cmd]
78.11 D git: git rev-parse --show-toplevel --absolute-git-dir --abbrev-ref HEAD
79.67 D attach(2): Cannot resolve file in repo
80.74 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD  ls-files --stage --others --exclude-standard --eol $CWD/[Dialog]
81.93 D git: git rev-parse --show-toplevel --absolute-git-dir --abbrev-ref HEAD
83.34 D attach(3): Cannot resolve file in repo
84.48 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD  ls-files --stage --others --exclude-standard --eol $CWD/[Msg]
85.66 D git: git rev-parse --show-toplevel --absolute-git-dir --abbrev-ref HEAD
87.16 D attach(4): Cannot resolve file in repo
88.17 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD  ls-files --stage --others --exclude-standard --eol $CWD/[Pager]
90.78 D attach(5): Cannot resolve file in repo
100.49 D git: git rev-parse --show-toplevel --absolute-git-dir --abbrev-ref HEAD
|
1716.08 D attach(1): Attaching (trigger=BufReadPost)
1729.14 D git: git rev-parse --show-toplevel --absolute-git-dir --abbrev-ref HEAD
1733.51 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD  ls-files --stage --others --exclude-standard --eol $CWD/after/queries/make/indents.scm
1739.25 D attach(1): Watching git dir
1739.36 D get_show_text: no revision or object_name
1740.52 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD show HEAD:after/queries/make/indents.scm
1744.23 D get_show_text: after/queries/make/indents.scm not found in HEAD looking for renames
1744.38 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD log --follow --name-status --diff-filter=R --format= HEAD..HEAD -- after/queries/make/indents.scm
1749.50 D attach(1): attach complete
|
11179.75 D attach(1): Already attached
|
158865.33 D attach(1): Already attached
|
263139.16 D attach(1): Already attached
|
360524.42 D attach(1): Already attached
|
366352.83 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD add --intent-to-add $CWD/after/queries/make/indents.scm
366363.34 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD  ls-files --stage --others --exclude-standard --eol $CWD/after/queries/make/indents.scm
366368.02 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD apply --whitespace=nowarn --cached --unidiff-zero -
366474.28 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD show e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
366486.95 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD show HEAD:after/queries/make/indents.scm
366499.05 D get_show_text: after/queries/make/indents.scm not found in HEAD looking for renames
366499.52 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD log --follow --name-status --diff-filter=R --format= HEAD..HEAD -- after/queries/make/indents.scm
|
372863.49 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD apply --whitespace=nowarn --cached --unidiff-zero -
372978.48 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD show e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
372991.83 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD show HEAD:after/queries/make/indents.scm
373004.06 D get_show_text: after/queries/make/indents.scm not found in HEAD looking for renames
373004.36 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD log --follow --name-status --diff-filter=R --format= HEAD..HEAD -- after/queries/make/indents.scm
|
383444.90 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD apply --whitespace=nowarn --cached --unidiff-zero -
383564.13 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD show e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
383573.49 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD show HEAD:after/queries/make/indents.scm
383578.13 D get_show_text: after/queries/make/indents.scm not found in HEAD looking for renames
383578.23 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD log --follow --name-status --diff-filter=R --format= HEAD..HEAD -- after/queries/make/indents.scm
|
385041.73 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD apply --whitespace=nowarn --cached --unidiff-zero -
385156.18 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD show e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
385162.54 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD show HEAD:after/queries/make/indents.scm
385167.26 D get_show_text: after/queries/make/indents.scm not found in HEAD looking for renames
385167.31 D git: git --git-dir $HOME/.git/modules/.../arctgx --work-tree $CWD log --follow --name-status --diff-filter=R --format= HEAD..HEAD -- after/queries/make/indents.scm
|
412182.57 D cli.run: Running action 'debug_messages' with arguments {}

I don't know if it may be relevant: this time it occurred on a submodule with "absorbed" git dir.

@lewis6991
Copy link
Owner Author

Doesn't look like the file watcher triggered even once.

To confirm your issue is getting signs not applied when doing git operations outside of the editor?

@przepompownia
Copy link
Contributor

przepompownia commented Sep 22, 2025

To confirm your issue is getting signs not applied when doing git operations outside of the editor?

Not this time, but I keep in mind that it's a separate case (also hard to catch in any repeatable way), usually by vim.system calls or similar (diffview f.e.).

Debian Sid was used here as usually.

@przepompownia
Copy link
Contributor

Another offtopic comment related to extui: disabled history in nvim_echo makes copying debug messages harder.

vim.api.nvim_echo(build_msg(m), false, {})

@lewis6991
Copy link
Owner Author

This pr only changes the code for the file system watcher. I don't know what your issue is, as the info provided so far is quite vague, but it seems it's unlikely related to what is attempted to be fixed here.

If you notice something more concrete, please raise it as a separate issue. Incorrectly attributing it to other issues, makes it extremely difficult to debug anything.

@lewis6991
Copy link
Owner Author

Another offtopic comment related to extui: disabled history in nvim_echo makes copying debug messages harder.

vim.api.nvim_echo(build_msg(m), false, {})

The debug messages can also be retrieved as a Lua object.

@justinmk
Copy link

Driving this locally, going well so far 🎉 ❤️

@lewis6991 lewis6991 merged commit 23ae90a into main Sep 26, 2025
7 checks passed
@lewis6991 lewis6991 deleted the feat/watcheroverhau branch September 26, 2025 15:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants