From: John Keeping <john@keeping.me.uk>
To: Kevin Bracey <kevin@bracey.fi>
Cc: git@vger.kernel.org, Junio C Hamano <gitster@pobox.com>,
Jeff King <peff@peff.net>, Jonathan Nieder <jrnieder@gmail.com>,
Michael J Gruber <git@drmicha.warpmail.net>
Subject: Re: [RFC/PATCH 0/2] merge-base: add --merge-child option
Date: Sun, 12 May 2013 17:28:24 +0100 [thread overview]
Message-ID: <20130512162823.GK2299@serenity.lan> (raw)
In-Reply-To: <518FB8DE.7070004@bracey.fi>
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.
> 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.
next prev parent reply other threads:[~2013-05-12 16:28 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-11 12:23 [RFC/PATCH 0/2] merge-base: add --merge-child option John Keeping
2013-05-11 12:23 ` [RFC/PATCH 1/2] commit: add commit_list_contains function John Keeping
2013-05-11 12:23 ` [RFC/PATCH 2/2] merge-base: add --merge-child option John Keeping
2013-05-11 17:54 ` [RFC/PATCH 0/2] " Junio C Hamano
2013-05-11 18:48 ` John Keeping
2013-05-12 15:44 ` Kevin Bracey
2013-05-12 16:28 ` John Keeping [this message]
2013-05-12 16:33 ` John Keeping
2013-05-12 17:14 ` Kevin Bracey
2013-05-12 22:22 ` Junio C Hamano
2013-05-13 14:26 ` Kevin Bracey
2013-05-13 14:45 ` Michael J Gruber
2013-05-19 12:40 ` log --cherry and merges (was [RFC/PATCH 0/2] merge-base: add --merge-child option) John Keeping
2013-05-20 6:43 ` Jonathan Nieder
2013-05-13 15:00 ` [PATCH 0/2] Make --ancestry-path A...B work Kevin Bracey
2013-05-13 15:00 ` [PATCH 1/2] t6019: demonstrate --ancestry-path A...B breakage Kevin Bracey
2013-05-13 15:00 ` [PATCH 2/2] revision.c: treat A...B merge bases as if manually specified Kevin Bracey
2013-05-13 16:04 ` Junio C Hamano
2013-05-12 16:58 ` [RFC/PATCH 0/2] merge-base: add --merge-child option John Keeping
2013-05-12 17:29 ` Kevin Bracey
2013-05-13 5:02 ` Junio C Hamano
2013-05-13 7:52 ` John Keeping
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130512162823.GK2299@serenity.lan \
--to=john@keeping.me.uk \
--cc=git@drmicha.warpmail.net \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jrnieder@gmail.com \
--cc=kevin@bracey.fi \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).