On Wed, Oct 09, 2019 at 11:28:51AM -0400, Joey Hess wrote: > > 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