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

Re: [RFC/PATCH 0/2] merge-base: add --merge-child option

From
John Keeping <john@keeping.me.uk>
Date
May 12, 2013, 16:33 UTC
Message-ID
<20130512163317.GL2299@serenity.lan>
In-Reply-To
<20130512162823.GK2299@serenity.lan>
On Sun, May 12, 2013 at 05:28:24PM +0100, John Keeping wrote:
Show 70 quoted lines
> On Sun, May 12, 2013 at 06:44:30PM +0300, Kevin Bracey wrote:
> > On 11/05/2013 15:23, John Keeping wrote:
> > > This is helpful when examining branches with disjoint roots, for example
> > > because one is periodically merged into a subtree of the other.
> > >
> > >
> > >
> > >          $ git log --left-right F...E --not $(git merge-base --merge-child F E)
> > >          < F
> > >          > E
> > >
> > 
> > Wouldn't "--left-right --ancestry-path F...E" do the job? I can't 
> > immediately see how that differs.
> > 
> > Unfortunately, that syntax doesn't currently work - I just stumbled 
> > across this problem, and my "history traversal refinements" series in pu 
> > fixes it, somewhat incidentally to the main subject in there.
> 
> You're right (and I was wrong in my reply to Junio's parallel message)
> ancestry path does seem to be what I want:
> 
>     $ git rev-list --left-right --count master...git-gui/master
>     31959   5
> 
>     $ git rev-list --ancestry-path --left-right --count \
>             master...git-gui/master
>     2056    5
> 
>     $ git rev-list --ancestry-path --left-right --count \
>             master...git-gui/master \
>             --not $(git merge-base --all master git-gui/master)
>     2056    5
> 
> However, this doesn't seem to make a difference to the time taken when I
> add in --cherry-mark (which is why I was partially correct in the
> parallel thread - it doesn't have the effect on cherry-mark that I want
> it to):
> 
>     $ time git rev-list --ancestry-path --left-right --count --cherry-mark \
>             origin/master...git-gui/master 
>     2056    5       0
> 
>     real    0m32.266s
>     user    0m31.522s
>     sys     0m0.749s
> 
>     $ time git rev-list  --left-right --count --cherry-mark \
>             origin/master...git-gui/master
>     31959   5       0
> 
>     real    0m32.140s
>     user    0m31.337s
>     sys     0m0.807s
> 
> This seems to be caused by the code in revision.c::limit_list() which
> does the cherry detection then limits to left/right and only then
> applies the ancestry path.  I haven't looked further than that, but is
> there any reason not to apply the ancestry path restriction before
> looking for patch-identical commits?
> 
> > However, without that patch, the alternative way of expressing it:
> > 
> > "--left-right --ancestry path F E --not $(git merge-base --all F E)"
> > 
> > should still work. Unless --left-right is magic for "..."? If it is, 
> > then my patch is more significant than I thought.
> 
> Yes, --left-right only applies to symmetric differences ("...").  But I
> get the results above both on master and on pu.

No I didn't. I forgot to update my $PATH when I built on master - those results are from pu. master says:

    fatal: --ancestry-path given but there are no bottom commits
Show 14 quoted lines
> > My series will also be better at optimising away D too, through a 
> > combination of my and Junio's efforts. Try it out.
> > 
> > On this subject, is there any way to exclude a path from a log query? Is 
> > there a "not" operator for paths? Might be another way of doing this - 
> > disjoint histories probably have disjoint paths...
> 
> That relates to another idea I had about optimizing the detection of
> patch-identical commits.  If the smaller side of a symmetric difference
> is quite small (as it is likely to be if it's a topic branch), would it
> be a good idea to calculate the set of paths touched by commits on that
> side and then skip calculating the patch ID for any commits that touch
> paths outside that set.  The tree comparison is a lot cheaper than doing
> a diff on all of the files.
Previous: John KeepingNext: Kevin Bracey
Message 8 of 22 in “merge-base: add --merge-child option”
  1. 0/2 merge-base: add --merge-child optionJohn Keeping, May 11, 2013
  2. 1/2 commit: add commit_list_contains functionJohn Keeping, May 11, 2013
  3. 2/2 merge-base: add --merge-child optionJohn Keeping, May 11, 2013
  4. Junio C HamanoMay 11, 2013
  5. John KeepingMay 11, 2013
  6. Kevin BraceyMay 12, 2013
  7. John KeepingMay 12, 2013
  8. John KeepingMay 12, 2013
  9. Kevin BraceyMay 12, 2013
  10. Junio C HamanoMay 12, 2013
  11. Kevin BraceyMay 13, 2013
  12. Michael J GruberMay 13, 2013
  13. log --cherry and merges (was [RFC/PATCH 0/2] merge-base: add --merge-child option)John Keeping, May 19, 2013
  14. Jonathan NiederMay 20, 2013
  15. 0/2 Make --ancestry-path A...B workKevin Bracey, May 13, 2013
  16. 1/2 t6019: demonstrate --ancestry-path A...B breakageKevin Bracey, May 13, 2013
  17. 2/2 revision.c: treat A...B merge bases as if manually specifiedKevin Bracey, May 13, 2013
  18. Junio C HamanoMay 13, 2013
  19. John KeepingMay 12, 2013
  20. Kevin BraceyMay 12, 2013
  21. Junio C HamanoMay 13, 2013
  22. John KeepingMay 13, 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.