Re: git cat-file --batch surprising carriage return behavior
- From
Jeff King <peff@peff.net>
- Date
- Oct 11, 2019, 06:21 UTC
- Message-ID
- <20191011062136.GA25741@sigill.intra.peff.net>
- In-Reply-To
- <20191009152851.GC19679@kitenet.net>
On Wed, Oct 09, 2019 at 11:28:51AM -0400, Joey Hess wrote:
Show 7 quoted lines
> > I suspect it's not entirely sufficient for clean input, though. You're
> > not feeding filenames but rather full "object names". I wouldn't be
> > surprised if we mis-parse "$rev:$path" when $path has "@{}" or similar
> > in it.
>
> Nothing I've tried along the lines of "HEAD:{yesterday}" has misparsed
> the part after the colon as anything but a filename.It's possible we've fixed them all. We definitely don't parse strictly left-to-right. The first thing we try to do is strip bits like ^{commit} off the end, before we even find the colon. But after doing so, we should generally be left with a resolvable name, and I think that uses the "basic" parser which will not allow colons. I.e., this:
mkdir subdir
echo whatever >subdir/file
git add subdir
git commit -m 'add directory'
git show HEAD:subdir^{tree}really does look for the file "subdir^{tree}" in HEAD, and not "HEAD:subdir" as a tree.
We have had bugs in the past; I'm thinking specifically of 8cd4249c4c (interpret_branch_name: always respect "namelen" parameter, 2014-01-15). But I couldn't find any problematic inputs after poking around for a few minutes.
> The one I can think of where there's a parse ambiguity is that while > :foo gets file foo, :1:foo does not get file "1:foo". Instead it's > treated as a stage number. Using either HEAD:1:foo or :./1:foo > will avoid that ambiguity.
Yeah, that makes sense.
-Peff