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

[PATCH/RFC v3 0/6] N-th last checked out branch

From
Thomas Rast <trast@student.ethz.ch>
Date
Jan 17, 2009, 03:30 UTC
Message-ID
<1232163011-20088-1-git-send-email-trast@student.ethz.ch>
In-Reply-To
<7v8wpcs38c.fsf@gitster.siamese.dyndns.org>
Junio C Hamano <gitster@pobox.com> writes:
> "cd -" is a very good analogy why your "-" shortcut is a short-sighted
> convenience feature that is too narrow and not well designed.  "cd -" can
> go back, but you cannot say "ls -" to list the contents of the previous
> directory.
True.
> Another reason is the one level limitation.
It shares that limitation with my mind ;-)

But well, since you all seem to want a more general solution, here's a draft.

I started poking around in refs.c for the backwards search, but the two reflog functions had a lot of functionality implemented very differently. So 1-4 are just cleanup and adding that backwards iterator. Note that 3/6 changes for_each_reflog_ent() to die() when it finds a format error, unlike the previous behaviour. No tests seemed to care, but maybe someone out there relies on having broken reflogs? ;-)

>  * The code read the reflog twice, first to count how many branch
>    switching there are and then to locate the N-th entry we are interested
>    in, because I was lazy.  We may want an API to enumerate reflog entries
>    in reverse.
So this might be settled.
>  * The reflog parser only parses "checkout" and not rebase action.  It
>    also does not notice "git checkout HEAD^" is not switching to a real
>    branch.

I don't handle this, but I'm not sure how much of a problem it is. It can correctly detach and re-attach even in cases such as HEAD^.

Ok, now that you mention it, it will probably put you on the parent of whatever you happened to be on, instead of the earlier value of HEAD^.

>      $ git checkout @{-1}

One problem with the syntax is that the assumption that there can only be a single @{} construct is quite entrenched in sha1_name.c. So if we want to support @{-1}@{1}, that'll need some extra work.

@{-1}~2 and similar work fine though.
Other things of note:

I changed the semantics to really only look at checkouts that "did something". If you keep saying 'git checkout master' over and over, those will not count towards the N.

I changed the parser to read the 'checkout: moving from $old' instead of the 'to $new'. The above semantics introduced too many extra conditions for my taste if we wanted to support the pre-1.5.3 reflog comment format. (You'd have to check if the $to was changed from the last [newer] entry, but then there's another border case when you do 'git init; git checkout -b side; git checkout -' because you never moved to master.)

The @{date} syntax will be marginally slower after the refactoring because the old parser carefully avoided parsing numbers where it could. (I guess it could actually be done as a bisection for an extra order of magnitude.)

It's far too early here to be sending mail.
Interactive rebase needs a "move hunk" feature.
Thomas Rast (6):
  reflog: refactor parsing and checking
  reflog: refactor log open+mmap
  reflog: make for_each_reflog_ent use mmap
  reflog: add backwards iterator
  sha1_name: implement @{-N} syntax for N-th last checked out
  checkout: implement '@{-N}' and '-' special abbreviations
 Documentation/git-checkout.txt  |    4 +
 Documentation/git-rev-parse.txt |    3 +
 builtin-checkout.c              |   15 ++-
 cache.h                         |    1 +
 refs.c                          |  285 +++++++++++++++++++++++----------------
 refs.h                          |    1 +
 sha1_name.c                     |   79 +++++++++++-
 t/t1505-rev-parse-last.sh       |   71 ++++++++++
 t/t2012-checkout-last.sh        |   50 +++++++
 9 files changed, 387 insertions(+), 122 deletions(-)
 create mode 100755 t/t1505-rev-parse-last.sh
 create mode 100755 t/t2012-checkout-last.sh
Next: Thomas Rast
Message 1 of 56 in “N-th last checked out branch”
  1. 0/6 N-th last checked out branchThomas Rast, Jan 17, 2009
  2. 1/6 reflog: refactor parsing and checkingThomas Rast, Jan 17, 2009
  3. 2/6 reflog: refactor log open+mmapThomas Rast, Jan 17, 2009
  4. 3/6 reflog: make for_each_reflog_ent use mmapThomas Rast, Jan 17, 2009
  5. 4/6 reflog: add backwards iteratorThomas Rast, Jan 17, 2009
  6. 5/6 sha1_name: implement @{-N} syntax for N-th last checked outThomas Rast, Jan 17, 2009
  7. 6/6 checkout: implement '@{-N}' and '-' special abbreviationsThomas Rast, Jan 17, 2009
  8. Johannes SchindelinJan 17, 2009
  9. Johannes SchindelinJan 17, 2009
  10. Johannes SchindelinJan 17, 2009
  11. Thomas RastJan 17, 2009
  12. 1/2 sha1_name: implement @{-N} syntax for N-th last checked outThomas Rast, Jan 17, 2009
  13. 2/2 checkout: implement '@{-N}' and '-' special abbreviationsThomas Rast, Jan 17, 2009
  14. interpret_nth_last_branch(): avoid traversing the reflogs twiceJohannes Schindelin, Jan 17, 2009
  15. 0/5 N-th last checked out branchThomas Rast, Jan 17, 2009
  16. 1/5 checkout: implement "@{-N}" shortcut name for N-th last branchThomas Rast, Jan 17, 2009
  17. 2/5 sha1_name: tweak @{-N} lookupThomas Rast, Jan 17, 2009
  18. 3/5 sha1_name: support @{-N} syntax in get_sha1()Thomas Rast, Jan 17, 2009
  19. 4/5 checkout: implement "-" abbreviation, add docs and testsThomas Rast, Jan 17, 2009
  20. 5/5 interpret_nth_last_branch(): avoid traversing the reflogs twiceThomas Rast, Jan 17, 2009
  21. 6/5 Fix parsing of @{-1}@{1}Johannes Schindelin, Jan 17, 2009
  22. Junio C HamanoJan 17, 2009
  23. Johannes SchindelinJan 17, 2009
  24. Junio C HamanoJan 17, 2009
  25. Johannes SchindelinJan 17, 2009
  26. Junio C HamanoJan 17, 2009
  27. Junio C HamanoJan 18, 2009
  28. Johannes SchindelinJan 17, 2009
  29. Junio C HamanoJan 17, 2009
  30. Johannes SchindelinJan 17, 2009
  31. Junio C HamanoJan 18, 2009
  32. Johannes SchindelinJan 18, 2009
  33. Junio C HamanoJan 18, 2009
  34. Johannes SchindelinJan 18, 2009
  35. Junio C HamanoJan 19, 2009
  36. Junio C HamanoJan 19, 2009
  37. Johannes SchindelinJan 19, 2009
  38. Thomas RastJan 20, 2009
  39. Johannes SchindelinJan 20, 2009
  40. Thomas RastJan 20, 2009
  41. interpret_nth_last_branch(): plug small memleakJunio C Hamano, Jan 20, 2009
  42. Johannes SchindelinJan 20, 2009
  43. Introduce for_each_recent_reflog_ent().Junio C Hamano, Jan 20, 2009
  44. Johannes SchindelinJan 20, 2009
  45. Junio C HamanoJan 20, 2009
  46. Fix invalid memory accessJohannes Schindelin, Jan 21, 2009
  47. Junio C HamanoJan 21, 2009
  48. Thomas RastJan 21, 2009
  49. Junio C HamanoJan 21, 2009
  50. Johannes SchindelinJan 21, 2009
  51. Thomas RastJan 24, 2009
  52. t1505: remove debugging cruftThomas Rast, Jan 24, 2009
  53. Junio C HamanoJan 25, 2009
  54. Johannes SchindelinJan 21, 2009
  55. @{-<n>}: avoid crash with corrupt reflogJohannes Schindelin, Jan 19, 2009
  56. Johannes SchindelinJan 19, 2009

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.