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

[PATCH 0/8] use merge-base for tag --contains

From
Jeff King <peff@peff.net>
Date
Jun 25, 2014, 23:34 UTC
Message-ID
<20140625233429.GA20457@sigill.intra.peff.net>

Once upon a time we checked "tag --contains" by doing N merge-base traversals, one per tag. That turned out to be really slow.

Later, I added a single traversal in ffc4b80 (tag: speed up --contains calculation, 2011-06-11) that works in a depth-first way. That's fast for the common case of tags spread throughout history, but slow when all of the tags are close to the searched-for commit (which would be more likely with branches, since they advance). That, plus the general hacky-ness of the implementation, prevented it from being used for "git branch" or in other places.

Over a year ago, Junio and I worked on the commit-slab code. The original point of it[1] was to be able to do a merge-base traversal like this, where we kept one bit per tip in each commit (so that we know not only what the merge base is, but _which_ tip hit each commit). So now I finally got around to it. :)

Timings are in the final patch, but the short of it is: it's about as fast as the depth-first code for the normal tag case (tags spread out through history), but way faster for the branch-like case (tags close to the commit).

This series stops short of moving "git branch" over to it. My next goal once this is solid is to factor the logic out so that "tag -l", "branch -l", and "for-each-ref" all use the same code. I got stuck on that earlier because I just couldn't justify sharing the tag-contains implementation with the others.

  [1/8]: tag: allow --sort with -n
  [2/8]: tag: factor out decision to stream tags
  [3/8]: paint_down_to_common: use prio_queue
  [4/8]: add functions for memory-efficient bitmaps
  [5/8]: string-list: add pos to iterator callback
  [6/8]: commit: provide a fast multi-tip contains function
  [7/8]: tag: use commit_contains
  [8/8]: perf: add tests for tag --contains
-Peff
[1] http://article.gmane.org/gmane.comp.version-control.git/220545
Next: Jeff King
Message 1 of 26 in “use merge-base for tag --contains”
  1. 0/8 use merge-base for tag --containsJeff King, Jun 25, 2014
  2. 1/8 tag: allow --sort with -nJeff King, Jun 25, 2014
  3. 2/8 tag: factor out decision to stream tagsJeff King, Jun 25, 2014
  4. 3/8 paint_down_to_common: use prio_queueJeff King, Jun 25, 2014
  5. Junio C HamanoJul 1, 2014
  6. Jeff KingJul 1, 2014
  7. 4/8 add functions for memory-efficient bitmapsJeff King, Jun 25, 2014
  8. Torsten BögershausenJun 26, 2014
  9. Jeff KingJun 26, 2014
  10. Eric SunshineJun 29, 2014
  11. Jeff KingJun 30, 2014
  12. Junio C HamanoJul 1, 2014
  13. Jeff KingJul 1, 2014
  14. 5/8 string-list: add pos to iterator callbackJeff King, Jun 25, 2014
  15. Junio C HamanoJul 1, 2014
  16. Jeff KingJul 1, 2014
  17. 6/8 commit: provide a fast multi-tip contains functionJeff King, Jun 25, 2014
  18. Junio C HamanoJun 26, 2014
  19. Junio C HamanoJun 26, 2014
  20. Junio C HamanoJun 26, 2014
  21. Junio C HamanoJul 1, 2014
  22. Junio C HamanoJul 1, 2014
  23. 7/8 tag: use commit_containsJeff King, Jun 25, 2014
  24. 8/8 perf: add tests for tag --containsJeff King, Jun 25, 2014
  25. Jeff KingJun 26, 2014
  26. Jeff KingJun 26, 2014

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.