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

Re: [PATCH 2/3] teach sha1_name to look in graveyard reflogs

From
Junio C Hamano <gitster@pobox.com>
Date
Jul 19, 2012, 22:39 UTC
Message-ID
<7vtxx3tlyb.fsf@alter.siamese.dyndns.org>
In-Reply-To
<20120719213326.GB20385@sigill.intra.peff.net>
Jeff King <peff@peff.net> writes:
Show 40 quoted lines
> The previous commit introduced graveyard reflogs, where the
> reflog for a deleted branch "foo" appears in
> "logs/graveyard/refs/heads/foo~".
>
> This patch teaches dwim_log to search for these logs if the
> ref does not exist, and teaches read_ref_at to fall back to
> them when the literal reflog does not exist.  This allows
> "deleted@{1}" to refer to the final commit of a deleted
> branch (either to view or to re-create the branch).  You can
> also go further back, or refer to the deleted reflog entries
> by time. Accessing deleted@{0} will yield the null sha1.
>
> Similarly, for_each_reflog_ent learns to fallback to
> graveyard refs, which allows the reflog walker to work.
> However, this is slightly less friendly, as the revision
> parser expects the matching ref to exist before it realizes
> that we are interested in the reflog. Therefore you must use
> "git log -g deleted@{1}" insted of "git log -g deleted" to
> walk a deleted reflog.
>
> In both cases, we also tighten up the mode-checking when
> opening the reflogs. dwim_log checks that the entry we found
> is a regular file (not a directory) to avoid D/F confusion
> (e.g., you ask for "foo" but "foo/bar" exists and we find
> the "foo" but it is a directory).
>
> However, read_ref_at and for_each_reflog_ent did not do this
> check, and relied on earlier parts of the code to have
> verified the log they are about to open. This meant that
> even before this patch, a race condition in changing refs
> between dwim_log and the actual read could cause bizarre
> errors (e.g., read_ref_at would open and try to mmap a
> directory). This patch makes it even easier to trigger those
> conditions (because the ref namespace and the fallback
> graveyard namespace can have D/F ambiguity for a certain
> path). To solve this, we check the mode of the file we open
> and treat it as if it did not exist if it is not a regular
> file (this is the same way dwim_log handles it).
>
> Signed-off-by: Jeff King <peff@peff.net>

This may or may not be related, but I vaguely recall that "log -g" traversal hack had a corner case where the walking stops prematurely upon seeing a gap (or creation/deletion that has 0{40})? Do you recall if we have ever dealt with that?

The patch seems fine from a cursory look.  Thanks.
Previous: Jeff KingNext: Jeff King
Message 49 of 52 in “Feature request: fetch --prune by default”
  1. Alexey MuranovJul 19, 2012
  2. Jeff KingJul 19, 2012
  3. Dan JohnsonJul 19, 2012
  4. Stefan HallerJul 19, 2012
  5. Junio C HamanoAug 16, 2012
  6. Jeff KingAug 21, 2012
  7. Sam RobertsJun 20, 2013
  8. Alexey MuranovJul 19, 2012
  9. Konstantin KhomoutovJul 19, 2012
  10. Alexey MuranovJul 19, 2012
  11. Alexey MuranovJul 19, 2012
  12. Johannes SixtJul 20, 2012
  13. Alexey MuranovJul 20, 2012
  14. Junio C HamanoAug 16, 2012
  15. Alexey MuranovJul 19, 2012
  16. Dan JohnsonJul 19, 2012
  17. Alexey MuranovJul 19, 2012
  18. 0/3 reflog graveyardJeff King, Jul 19, 2012
  19. 1/3 retain reflogs for deleted refsJeff King, Jul 19, 2012
  20. Alexey MuranovJul 19, 2012
  21. Jeff KingJul 20, 2012
  22. Alexey MuranovJul 20, 2012
  23. Junio C HamanoJul 19, 2012
  24. Jeff KingJul 20, 2012
  25. Jeff KingJul 20, 2012
  26. Junio C HamanoJul 20, 2012
  27. Junio C HamanoJul 20, 2012
  28. Jeff KingJul 20, 2012
  29. Junio C HamanoAug 16, 2012
  30. Michael HaggertyJul 20, 2012
  31. Jeff KingJul 20, 2012
  32. Johannes SixtJul 20, 2012
  33. Jeff KingJul 20, 2012
  34. Alexey MuranovJul 22, 2012
  35. Nguyen Thai Ngoc DuyJul 26, 2012
  36. Alexey MuranovJul 26, 2012
  37. Matthieu MoyJul 26, 2012
  38. Jeff KingJul 26, 2012
  39. Alexey MuranovJul 26, 2012
  40. Junio C HamanoJul 26, 2012
  41. Jeff KingJul 26, 2012
  42. Alexey MuranovJul 22, 2012
  43. Alexey MuranovJul 22, 2012
  44. Jeff KingJul 22, 2012
  45. Alexey MuranovJul 22, 2012
  46. Jeff KingJul 22, 2012
  47. Johannes SixtJul 20, 2012
  48. 2/3 teach sha1_name to look in graveyard reflogsJeff King, Jul 19, 2012
  49. Junio C HamanoJul 19, 2012
  50. Jeff KingJul 20, 2012
  51. Junio C HamanoJul 22, 2012
  52. 3/3 add tests for reflogs of deleted refsJeff King, Jul 19, 2012

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.