On Thu, May 10, 2018 at 12:43:03PM +0000, Ævar Arnfjörð Bjarmason wrote: > The SHA1 prefix 06fa currently matches no blobs in git.git. When > disambiguating short SHA1s we've been quietly ignoring the user's type > selector as a fallback mechanism, this was intentionally added in > 1ffa26c461 ("get_short_sha1: list ambiguous objects on error", > 2016-09-26). > > I think that behavior makes sense, it's not very useful to just show > nothing because a preference has been expressed via core.disambiguate, > but it's bad that we're quietly doing this. The user might thing that > we just didn't understand what e.g 06fa^{blob} meant. I had to read this through a few times to figure out what problem you were solving. Possibly because you lead with 06fa, which is really just an example (and also, I have an 06fa blob in my clone ;) ). Maybe: If the short-sha1 disambiguation code is told to use a particular hint (e.g., treeish or blob) but no objects with that short-sha1 match that hint, we end up ignoring the hint. This can result in either: 1. We choose the non-matching object if there is only one. This will typically result in an error later up the stack (since whatever gave us the hint is expecting a particular type). 2. We list all objects with that short-sha1, including those with non-matching types. This second case can be confusing to the user, who might think that we didn't apply the hint properly (especially if the hint came from them). For example, in git.git there is no blob with the prefix 06fa. So the user may see: $ git rev-parse 06fa^{blob} hint: The candidates are: hint: 06fa2b7c2b tag v2.1.4 hint: 06faf6ba64 tree 06fa^{blob} fatal: ambiguous argument '06fa^{blob}': unknown revision or path not in the working tree. Let's help them out by issuing a warning whenever the hint is ignored. So that at least explains it in a way that makes sense to me. But now that I've propped up my strawman, let me take a few swings... Your patch just covers case 2, I think. And for the error case, that's probably OK: $ git rev-parse 06faf^{blob} error: 06faf^{blob}: expected blob type, but the object dereferences to tree type 06faf^{blob} error: 06faf^{blob}: expected blob type, but the object dereferences to tree type fatal: ambiguous argument '06faf^{blob}': unknown revision or path not in the working tree. (though there is a separate bug in showing the error twice). But some cases _don't_ issue an error. For example, try this: $ git log ..06faf which returns an empty output! We return the single matching tree, even though the ".." triggers the commit hint. The revision machinery just queues the tree, and then later when we see we're not doing an --objects traversal, it just gets ignored. (That's a separate issue, but it shows that the hints are just that: hints. The code that runs after does not necessarily require a matching type). And that example shows another issue, which is that the user does not necessarily feed us the hint explicitly. We're using a committish hint there, but I'm not sure if mentioning that would confuse the user or not. Certainly this warning: > warning: Your hint (via core.disambiguate or peel syntax) was ignored, we fell > back to showing all object types since no object of the requested type > matched the provide short SHA1 06fa is not accurate, because the hint came from neither of those places. ;) So all that said together, I kind of wonder if we should consider issuing the warning earlier, doing so for all cases, and being a bit less chatty. Like: $ git rev-parse 06fa^{blob} warning: short object id 06fa did not match any objects of type 'blob' If that were followed by any of: 1. error: short SHA1 06fa is ambiguous, then a bunch of non-blobs 2. error: expected blob but I got a tree 3. the command proceeds and silently ignores the matched object I think it would be helpful. We'd need to add in an extra mapping of GET_OID_* back to a human-readable string, but I think that should be pretty easy. And finally, your 06fa example for me shows behavior that's either buggy, or I'm just confused. I get: $ git rev-parse 06fa^{blob} error: short SHA1 06fa is ambiguous hint: The candidates are: hint: 06fa2b7c2b tag v2.1.4 hint: 06faa52353 commit 2005-10-18 - 2005-10-18 midnight hint: 06fac427af blob hint: 06faf6ba64 tree (That 06fac blob comes Junio's refs/notes/amlog). Shouldn't the blob disambiguator show me just that object? -Peff