Jonathan Nieder [off-list ref] writes:
quoted hunk
Junio C Hamano wrote:
quoted
quoted
So maybe we are doing a favor by
calling out the problem; if they want a rev, they should be using
"--verify" (or "--").
I tend to agree with the reasoning in the last sentence. Let's cook
it for a while and see what happens.
Isn't this essentially breaking a contract that would have been relied
on by any script that used "git rev-parse HEAD~3..HEAD"? Worse, it's
breaking that contract in a way that no one would notice until they
are asked to manipulate a worktree with a file named 'HEAD~3..HEAD'
--- in other words, the breakage it introduces is painfully subtle.
I agree that "git rev-parse HEAD" is better written as "git rev-parse
--verify HEAD" and hence not so much worth worrying about,
I do not share the "with --verify is better hence no problem"
reasoning. My "not so much worth worrying about" comes solely from
a hunch that nobody has "HEAD~3..HEAD" in their working directory,
and if somebody has one, then they must be using "--verify" (or a
clarifying "--"), because their "git log" and whatever they use "git
rev-parse HEAD~3..HEAD" for would behave very differently otherwise.
So it is not merely "--verify is better"---in a situation where the
backward incompatibility matters, I doubt the existing behaves
sensibly in the first place.
But if we cook it for a while, I suspect that we will find more and
more breakages of expectations in the existing scripts in and out of
the tree; in general, I hate _any_ change, and I do not mind
dropping it ;-).
Junio C Hamano wrote:
I do not share the "with --verify is better hence no problem"
reasoning. My "not so much worth worrying about" comes solely from
a hunch that nobody has "HEAD~3..HEAD" in their working directory,
That's what makes it a problem. This change makes it very easy to
make a general-purpose script that breaks in an edge case that the
script's author is not likely to run into. Then as soon as someone
adds a file with such a name to the test data in their repo, their
favorite general-purpose repo munger just breaks.
If we wanted to forbid git from tracking files named HEAD~3..HEAD
altogether, that would be a different story.
and if somebody has one, then they must be using "--verify" (or a
clarifying "--"), because their "git log" and whatever they use "git
rev-parse HEAD~3..HEAD" for would behave very differently otherwise.
Isn't protecting against this kind of thing the reason we ask authors
of general-purpose scripts to use "simple, do what I say and not what
I mean" plumbing commands?
Another relevant detail is that using rev-parse with "--" is more
painful than without, since it includes the "--" in its output.
Without this change, it seems much more likely to me that someone
would do
git rev-parse <commits> |
while read commit
do
...
done
than
git rev-parse <commits> -- |
while read commit
do
if test "$commit" = "--"
then
continue
fi
...
done
So it is not merely "--verify is better"---in a situation where the
backward incompatibility matters, I doubt the existing behaves
sensibly in the first place.
What in the former of the above two loops is broken?
But if we cook it for a while, I suspect that we will find more and
more breakages of expectations in the existing scripts in and out of
the tree;
Alas, probably no, because nobody has "HEAD~3..HEAD" in their working
directory. That's exactly the problem --- it creates an edge case
that nobody is likely to test until the once-in-a-few-years moment
when they need it.
Jonathan