From: Michael J Gruber <git@drmicha.warpmail.net>
To: unlisted-recipients:; (no To-header on input)
Cc: git@vger.kernel.org, Junio C Hamano <gitster@pobox.com>,
Jeff King <peff@peff.net>, Jonathan Nieder <jrnieder@gmail.com>
Subject: Re: [PATCHv2 2/3] revision.c: introduce --min-parents and --max-parents
Date: Mon, 21 Mar 2011 15:04:53 +0100 [thread overview]
Message-ID: <4D875B05.50401@drmicha.warpmail.net> (raw)
In-Reply-To: <41d12c53966faa9c9cb5acc7646e9098dcd911ea.1300702130.git.git@drmicha.warpmail.net>
Michael J Gruber venit, vidit, dixit 21.03.2011 11:14:
> --merges and --no-merges are named confusingly and cannot be overridden
> by each other, but they are there to stay for plumbers' sake.
>
> Introduce --min-parents and --max-parents which limit the revisions to
> those commits which have at least resp. at most that many commits, where
> negative arguments for --max-parents= denote infinity (i.e. no upper
> limit).
>
> In particular:
>
> --max-parents=1: no merges
> --min-parents=2: merges only
> --max-parents=0: only roots
> --min-parents=3: only octopusses
>
> --min-parents=n --max-parents=m with n>m gives you what you ask for
> (nothing) just like --merges --no-merges does, but at least for an
> obvious reason.
>
> Implementation note:
>
> We compute the number of parents only when we limit by that, so there
> is no performance impact when there are no limiters.
>
> Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net>
> ---
> builtin/log.c | 2 +-
> builtin/rev-list.c | 2 ++
> builtin/rev-parse.c | 2 ++
> revision.c | 24 +++++++++++++++++-------
> revision.h | 4 ++--
> 5 files changed, 24 insertions(+), 10 deletions(-)
...
> @@ -2029,10 +2034,15 @@ enum commit_action get_commit_action(struct rev_info *revs, struct commit *commi
> return commit_ignore;
> if (revs->min_age != -1 && (commit->date > revs->min_age))
> return commit_ignore;
> - if (revs->no_merges && commit->parents && commit->parents->next)
> - return commit_ignore;
> - if (revs->merges_only && !(commit->parents && commit->parents->next))
> - return commit_ignore;
> + if (revs->min_parents || (revs->max_parents >= 0)) {
> + int n = 0;
> + struct commit_list *p;
> + for (p = commit->parents; p; p = p->next)
> + n++;
> + if ((n < revs->min_parents) ||
> + ((revs->max_parents >= 0) && (n > revs->max_parents)))
> + return commit_ignore;
> + }
> if (!commit_match(commit, revs))
> return commit_ignore;
> if (revs->prune && revs->dense) {
BTW: Version v2-eps had this conditional:
(n < revs->min_parents) || (n > (unsigned int) revs->max_parents)
I actually compared runs of "git rev-list origin/next >/dev/null"
without options and with "--merges" or "--no-merges" for git without
this patch and with it (v2) and do not see any measurable difference
(between without or with the patch; the runs with limiting options are
faster, so I redid it with --count, again no difference with or without
patch).
So, the clearer version above should be preferred over the unsigned
trick, and special casing seems not worth it.
Michael
next prev parent reply other threads:[~2011-03-21 14:08 UTC|newest]
Thread overview: 67+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-17 11:33 [PATCH/RFD 0/2] revision.c: --merges, --no-merges and --merges-only Michael J Gruber
2011-03-17 11:33 ` [PATCH/RFD 1/2] revision.c: rename --merges to --merges-only Michael J Gruber
2011-03-17 11:33 ` [PATCH/RFD 2/2] revision.c: introduce --merges to undo --no-merges Michael J Gruber
2011-03-17 19:23 ` [PATCH/RFD 0/2] revision.c: --merges, --no-merges and --merges-only Junio C Hamano
2011-03-17 19:59 ` Jeff King
2011-03-18 7:56 ` Michael J Gruber
2011-03-18 8:22 ` Junio C Hamano
2011-03-18 8:41 ` Michael J Gruber
2011-03-18 8:56 ` Jeff King
2011-03-18 14:50 ` [PATCH 0/3] rev-list and friends: --min-parents, --max-parents Michael J Gruber
2011-03-18 14:50 ` [PATCH 1/3] revision.c: introduce --min-parents and --max-parents Michael J Gruber
2011-03-18 19:34 ` Jeff King
2011-03-21 7:31 ` Michael J Gruber
2011-03-18 20:48 ` Jonathan Nieder
2011-03-18 21:21 ` Junio C Hamano
2011-03-21 9:26 ` Michael J Gruber
2011-03-18 14:50 ` [PATCH 2/3] t6009: use test_commit() from test-lib.sh Michael J Gruber
2011-03-18 14:50 ` [PATCH 3/3] rev-list --min-parents,--max-parents: doc and test and completion Michael J Gruber
2011-03-18 19:48 ` Jeff King
2011-03-21 9:01 ` Michael J Gruber
2011-03-21 10:54 ` Jeff King
2011-03-21 12:06 ` Michael J Gruber
2011-03-21 14:54 ` Junio C Hamano
2011-03-21 14:56 ` Michael J Gruber
2011-03-21 16:47 ` Junio C Hamano
2011-03-18 21:14 ` Jonathan Nieder
2011-03-21 8:52 ` Michael J Gruber
2011-03-21 17:49 ` Jonathan Nieder
2011-03-22 7:38 ` Michael J Gruber
2011-03-18 14:54 ` [PATCH 0/3] rev-list and friends: --min-parents, --max-parents Michael J Gruber
2011-03-18 19:41 ` Jeff King
2011-03-21 7:42 ` Michael J Gruber
2011-03-21 10:14 ` [PATCHv2 " Michael J Gruber
2011-03-21 10:14 ` [PATCHv2 1/3] t6009: use test_commit() from test-lib.sh Michael J Gruber
2011-03-21 10:14 ` [PATCHv2 2/3] revision.c: introduce --min-parents and --max-parents Michael J Gruber
2011-03-21 14:04 ` Michael J Gruber [this message]
2011-03-21 17:45 ` Junio C Hamano
2011-03-21 17:58 ` Jonathan Nieder
2011-03-21 10:14 ` [PATCHv2 3/3] rev-list --min-parents,--max-parents: doc and test and completion Michael J Gruber
2011-03-21 18:45 ` Jonathan Nieder
2011-03-22 7:55 ` Michael J Gruber
2011-03-23 0:47 ` Jonathan Nieder
2011-03-21 10:56 ` [PATCHv2 0/3] rev-list and friends: --min-parents, --max-parents Jeff King
2011-03-23 9:38 ` [PATCHv3 0/5]rev-list " Michael J Gruber
2011-03-23 9:38 ` [PATCHv3 1/5] t6009: use test_commit() from test-lib.sh Michael J Gruber
2011-03-23 9:38 ` [PATCHv3 2/5] revision.c: introduce --min-parents and --max-parents Michael J Gruber
2011-03-23 9:38 ` [PATCHv3 3/5] squash! " Michael J Gruber
2011-03-23 9:38 ` [PATCHv3 4/5] rev-list --min-parents,--max-parents: doc, test and completion Michael J Gruber
2011-03-23 9:38 ` [PATCHv3 5/5] fixup! " Michael J Gruber
2011-03-23 14:48 ` [PATCHv3 0/5]rev-list and friends: --min-parents, --max-parents Jeff King
2011-03-23 17:12 ` Junio C Hamano
2011-03-23 18:06 ` Junio C Hamano
2011-03-24 8:21 ` Jonathan Nieder
2011-03-24 8:55 ` Michael J Gruber
2011-03-24 9:42 ` Jonathan Nieder
2011-08-08 1:13 ` [PATCH/RFC 0/2] test_when_finished and returning early Jonathan Nieder
2011-08-08 1:15 ` [PATCH 1/2] test: simplify return value of test_run_ Jonathan Nieder
2011-08-08 1:17 ` [PATCH 2/2] test: cope better with use of return for errors Jonathan Nieder
2011-08-09 8:46 ` Johannes Sixt
2011-08-09 15:36 ` Jeff King
2011-08-11 7:05 ` [PATCH v2] t3900: do not reference numbered arguments from the test script Johannes Sixt
2011-08-11 7:11 ` Jonathan Nieder
2011-08-11 21:49 ` Junio C Hamano
2011-08-08 1:26 ` [PATCH/RFC 0/2] test_when_finished and returning early Jeff King
2011-03-18 9:07 ` [PATCH/RFD 0/2] revision.c: --merges, --no-merges and --merges-only Jeff King
2011-03-18 9:42 ` Michael J Gruber
2011-03-18 9:54 ` Jeff King
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=4D875B05.50401@drmicha.warpmail.net \
--to=git@drmicha.warpmail.net \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jrnieder@gmail.com \
--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).