Re: [PATCH 1/4] rebase -i: demonstrate obscure loose object cache bug
- From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- Date
- Mar 13, 2019, 16:11 UTC
- Message-ID
- <87k1h2bvpb.fsf@evledraar.gmail.com>
- In-Reply-To
- <b3fcd377652103584b6f307c6ee209980b44529f.1552472189.git.gitgitgadget@gmail.com>
On Wed, Mar 13 2019, Johannes Schindelin via GitGitGadget wrote:
Show 19 quoted lines
> From: Johannes Schindelin <johannes.schindelin@gmx.de> > > We specifically support `exec` commands in `git rebase -i`'s todo lists > to rewrite the very same todo list. Of course, we need to validate that > todo list when re-reading it. > > It is also totally legitimate to extend the todo list by `pick` lines > using short names of commits that were created only after the rebase > started. > > And this is where the loose object cache interferes with this feature: > if *some* loose object was read whose hash shares the same first two > digits with a commit that was not yet created when that loose object was > created, then we fail to find that new commit by its short name in > `get_oid()`, and the interactive rebase fails with an obscure error > message like: > > error: invalid line 1: pick 6568fef > error: please fix this using 'git rebase --edit-todo'.
As a further improvement, is there a good reason for why we wouldn't pass something down to the oid machinery to say "we're only interested in commits". I have a WIP series somewhere to generalize that more, but e.g. here locally:
$ git rev-parse 80b06
error: short SHA1 80b06 is ambiguous
hint: The candidates are:
hint: 80b06b942e commit 2019-03-13 - Revert "this patch fail whales"
hint: 80b063bb9b blob
hint: 80b06f0714 blob
80b06
$ git rev-parse 80b06^{commit}
80b06b942ed33e597a0152b3e6ba45b7d8ead94bI can't remember if there's some caveat with that particular peel syntax I meant to fix, but I mean if we could pass something down to say "no blobs or trees" shouldn't we?
Then stuff like this wouldn't die:
$ git rebase -i
hint: Waiting for your editor to close the file... Waiting for Emacs...
error: short SHA1 80b06 is ambiguous
hint: The candidates are:
hint: 80b06b942e commit 2019-03-13 - Revert "this patch fail whales"
hint: 80b063bb9b blob
hint: 80b06f0714 blob
error: invalid line 2: p 80b06 Revert "this patch fail whales"
You can fix this with 'git rebase --edit-todo' and then run 'git rebase --continue'.Show 24 quoted lines
> [...] > +test_expect_failure SHA1 'loose object cache vs re-reading todo list' ' > + GIT_REBASE_TODO=.git/rebase-merge/git-rebase-todo && > + export GIT_REBASE_TODO && > + write_script append-todo.sh <<-\EOS && > + # For values 5 and 6, this yields SHA-1s with the same first two digits > + echo "pick $(git rev-parse --short \ > + $(printf "%s\\n" \ > + "tree $EMPTY_TREE" \ > + "author A U Thor <author@example.org> $1 +0000" \ > + "committer A U Thor <author@example.org> $1 +0000" \ > + "" \ > + "$1" | > + git hash-object -t commit -w --stdin))" >>$GIT_REBASE_TODO > + > + shift > + test -z "$*" || > + echo "exec $0 $*" >>$GIT_REBASE_TODO > + EOS > + > + git rebase HEAD -x "./append-todo.sh 5 6" > +' > + > test_done
This is a test for rebase, but perhaps it would be best put in t1512-rev-parse-disambiguation.sh. Then when we finally port that somehow to SHA256 we'll have all this SHA-1 golfing in the same file & can fix it at once. Just a thought...