git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Bug in "git rev-parse --verify"

From
Junio C Hamano <gitster@pobox.com>
Date
Mar 30, 2013, 04:09 UTC
Message-ID
<7vk3opr0ke.fsf@alter.siamese.dyndns.org>
In-Reply-To
<51565F96.1020203@alum.mit.edu>
Michael Haggerty <mhagger@alum.mit.edu> writes:
Show 10 quoted lines
> 1. An SHA1 is a canonical representation of the argument, useful for
> example as the key in a hash map for for looking for the presence of a
> commit in a rev-list output.
>
> 2. An SHA1 is persistent.  For example, I use them when caching
> benchmark results across versions.  Moreover, they are safe for use in
> filenames.  The persistence also makes scripts more robust against
> simultaneous changes to the repo by other processes, whereas if I use a
> string like "branch^" multiple times, there is no guarantee that it
> always refers to the same commit.

These two are half-irrelevant; they only call for use of the current "rev-parse --verify" that always gives you 40-hex. The more important one is the next one.

> 3. Verifying arguments at one spot centralizes error-checking at the
> start of a script and eliminates one reason for random git commands to
> fail later (when error recovery is perhaps more difficult).

Not necessarily, unless your script is a very narrow corner case that is satisfied with "any kind of object goes". When a parameter has to be commit for some purpose and another parameter can be any tree-ish, you would want to validate them _with_ type requirement.

If you are using the "object name persistency" to create a cache of "how many times the word 'gogopuff' appears in the entire tree?", you want to cache the result keyed with the object name of the tree, whether your user gives you v1.8.0 (tag), v1.8.0^0 (commit), or v1.8.0^{tree} (tree), and you want to unwrap the user input down to tree object name to look up the pre-computed result for the cache to be any useful.

> 4. Converting once avoids the overhead of repeated conversion from a
> free-form committish into an object name if the argument needs to be
> passed to multiple git commands (though presumably the overhead is
> insignificant in most cases).
True.

So why not verify arguments while making sure of their type early with 'rev-parse --verify "$userinput^{desiredtype}"?

Previous: Michael HaggertyNext: Junio C Hamano
Message 10 of 22 in “Bug in "git rev-parse --verify"”
  1. Michael HaggertyMar 28, 2013
  2. Jeff KingMar 28, 2013
  3. Junio C HamanoMar 28, 2013
  4. Michael HaggertyMar 28, 2013
  5. Jeff KingMar 28, 2013
  6. Michael HaggertyMar 28, 2013
  7. Jeff KingMar 28, 2013
  8. Junio C HamanoMar 28, 2013
  9. Michael HaggertyMar 30, 2013
  10. Junio C HamanoMar 30, 2013
  11. Junio C HamanoMar 30, 2013
  12. Michael HaggertyMar 30, 2013
  13. Junio C HamanoMar 30, 2013
  14. Junio C HamanoMar 30, 2013
  15. Michael HaggertyMar 30, 2013
  16. Elia PintoMar 30, 2013
  17. 1/2 peel_onion: disambiguate to favor tree-ish when we want a tree-ishJunio C Hamano, Mar 31, 2013
  18. 2/2 peel_onion(): teach $foo^{object} peelerJunio C Hamano, Mar 31, 2013
  19. Michael HaggertyApr 2, 2013
  20. Junio C HamanoApr 2, 2013
  21. Michael HaggertyApr 2, 2013
  22. Junio C HamanoApr 2, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.