This commit is contained in:
Joey Hess 2025-06-25 11:41:56 -04:00
parent 185a9f931f
commit 64263a8410
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38

View file

@ -0,0 +1,84 @@
With git 2.50, there are several test suite failures, all involving
`git-annex sync` run in a situation with a conflict.
git pull or merge fails with "fatal: stash failed"
git has a known bug with the same symptom, that affected older versions too,
and was reported upstream with a test case, but never fixed.
See [[bugs/resolvemerge_fails_when_unlocked_empty_files_exist]].
That bug only affects unlocked empty annexed files.
The failing parts of the test suite use unlocked files, but not empty
files.
To run one of the failing tests, without running the rest of the test
suite:
git-annex test -p '$0=="Tests.Repo Tests v10 unlocked.conflict resolution"'
The failure is somewhat intermittent.
Comparing with the same test case run with git 2.47.2, with `GIT_TRACE=1`
and `--test-debug`, the new git has this:
[2025-06-25 10:55:00.363063271] (Utility.Process) process [3665269] call: git ["--git-dir=.git","--work-tree=.","-c","merge.directoryRenames=false","--literal-pathspecs","-c","annex.debug=true","merge","--no-edit","refs/remotes/r2/master"]
...
10:55:00.492909 run-command.c:673 trace: run_command: git stash create
10:55:00.492924 run-command.c:765 trace: start_command: /usr/lib/git-core/git stash create
10:55:00.494550 git.c:476 trace: built-in: git stash create
10:55:00.495283 run-command.c:673 trace: run_command: 'git-annex smudge --clean -- '\''conflictor'\'''
10:55:00.495304 run-command.c:765 trace: start_command: /bin/sh -c 'git-annex smudge --clean -- '\''conflictor'\''' 'git-annex smudge --clean -- '\''conflictor'\'''
10:55:00.510128 git.c:476 trace: built-in: git config --null --list
[2025-06-25 10:55:00.514560172] (Utility.Process) process [3665339] chat: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","cat-file","--batch-check=%(objectname) %(objecttype) %(objectsize)"]
10:55:00.514833 git.c:476 trace: built-in: git cat-file '--batch-check=%(objectname) %(objecttype) %(objectsize)'
10:55:00.517739 git.c:476 trace: built-in: git cat-file --batch
[2025-06-25 10:55:00.519817243] (Utility.Process) process [3665342] chat: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","cat-file","--batch"]
[2025-06-25 10:55:00.524719227] (Utility.Process) process [3665344] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","-c","filter.annex.smudge=","-c","filter.annex.clean=","-c","filter.annex.process=","write-tree"]
[2025-06-25 10:55:00.525956861] (Utility.Process) process [3665344] done ExitFailure 128
[2025-06-25 10:55:00.526033972] (Database.Keys) reconcileStaged start (in conflict)
[2025-06-25 10:55:00.529125922] (Utility.Process) process [3665346] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--hash","refs/annex/last-index"]
10:55:00.530711 git.c:476 trace: built-in: git show-ref --hash refs/annex/last-index
[2025-06-25 10:55:00.531264053] (Utility.Process) process [3665346] done ExitSuccess
[2025-06-25 10:55:00.531808824] (Utility.Process) process [3665347] chat: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","cat-file","--batch-check=%(objectname) %(objecttype) %(objectsize)","--buffer"]
[2025-06-25 10:55:00.534102268] (Utility.Process) process [3665348] chat: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","cat-file","--batch=%(objectname) %(objecttype) %(objectsize)","--buffer"]
10:55:00.534260 git.c:476 trace: built-in: git cat-file '--batch-check=%(objectname) %(objecttype) %(objectsize)' --buffer
[2025-06-25 10:55:00.537040154] (Utility.Process) process [3665349] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","-c","filter.annex.smudge=","-c","filter.annex.clean=","-c","filter.annex.process=","-c","diff.external=","diff","0fbd88293710b6a33cda68626d317e6ee0e991d5","--staged","--raw","-z","--no-abbrev","-G/annex/objects/","--no-renames","--ignore-submodules=all","--no-textconv","--no-ext-diff"]
10:55:00.537633 git.c:476 trace: built-in: git cat-file '--batch=%(objectname) %(objecttype) %(objectsize)' --buffer
10:55:00.537839 git.c:476 trace: built-in: git diff 0fbd88293710b6a33cda68626d317e6ee0e991d5 --staged --raw -z --no-abbrev-G/annex/objects/ --no-renames --ignore-submodules=all --no-textconv --no-ext-diff
[2025-06-25 10:55:00.539717016] (Utility.Process) process [3665349] done ExitSuccess
[2025-06-25 10:55:00.540326407] (Utility.Process) process [3665348] done ExitSuccess
[2025-06-25 10:55:00.540404379] (Utility.Process) process [3665347] done ExitSuccess
[2025-06-25 10:55:00.540459121] (Database.Keys) reconcileStaged end
[2025-06-25 10:55:00.541662584] (Utility.Process) process [3665342] done ExitSuccess
[2025-06-25 10:55:00.542107582] (Utility.Process) process [3665339] done ExitSuccess
fatal: stash failed
[2025-06-25 10:55:00.555752855] (Utility.Process) process [3665269] done ExitFailure 128
The old git has:
10:52:18.580330 run-command.c:666 trace: run_command: git stash create
10:52:18.580348 run-command.c:758 trace: start_command: /usr/lib/git-core/git stash create
10:52:18.581939 git.c:479 trace: built-in: git stash create
10:52:18.583737 run-command.c:666 trace: run_command: 'git-annex smudge -- '\''conflictor'\'''
10:52:18.583751 run-command.c:758 trace: start_command: /bin/sh -c 'git-annex smudge -- '\''conflictor'\''' 'git-annex smudge -- '\''conflictor'\'''
10:52:18.589604 git.c:479 trace: built-in: git config --null --list
Auto-merging conflictor
So, `git merge` has changed to run the smudge clean hook, on the conflicted
file.
It seemed possible that git is feeding in a different version of the file
than the one in the working tree, which would make git-annex's smudge clean
filter use the working tree version of the file, which would not be good.
(Why that would cause git to explode I don't know.) So, I instrumented
`git-annex smudge`, and verified that in each case where it uses the
content of the file on disk, that is the same as the file content that was
provided to it on stdin. So that seems to rule out this theory.
Noticing that `reconcileStaged` is getting run in the new log and not in
the old log, I replaced it with a noop. **That avoids the problem.**
So, something that reconcileStaged does is making git unhappy when it
runs the smudge clean filter while creating a stash. It seems logical that
the problem would involve the index file, which `reconcileStaged` touches,
and which gets updated when stashing..