git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Michael J Gruber <git@drmicha.warpmail.net>
To: git@vger.kernel.org
Subject: [WIP PATCH] revision-walk: --parent option to find children of a parent
Date: Thu, 30 Sep 2010 12:30:46 +0200	[thread overview]
Message-ID: <99aa4cd5a60b2b2d3eae962acb8a49c2a62a8f77.1285842569.git.git@drmicha.warpmail.net> (raw)

Introduce a new --parent=<commit> option for the revision walker which
limits the commits to those which have <commit> as one of their parents.

This allows to check, e.g., whether <commit> is a fork point.

Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net>
---
This is heavily WIP/RFC for the obvious reasons, but also these:

Currently, multiple --parent options are ORed. I'm still unsure whether that or ANDing
is more useful. ANDing can always be done cheaply by rev-listing with one
--parent and then checking the result commits. ORing, otoh can be achieved only
by doing multiple rev-list runs (unless it is implemented as it is, of course)..

As a consequence (of the decision for ORing), I don't limit automatically by
^<commit>. I should probably do that automatically for the single --parent
option case, it's a huge speed-up.

 revision.c |   18 ++++++++++++++++++
 revision.h |    3 +++
 2 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/revision.c b/revision.c
index b1c1890..db56cf6 100644
--- a/revision.c
+++ b/revision.c
@@ -1149,6 +1149,7 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
 {
 	const char *arg = argv[0];
 	const char *optarg;
+	unsigned char sha1[20];
 	int argcount;
 
 	/* pseudo revision arguments */
@@ -1247,6 +1248,15 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
 	} else if (!strcmp(arg, "--parents")) {
 		revs->rewrite_parents = 1;
 		revs->print_parents = 1;
+	} else if ((argcount = parse_long_opt("parent", argv, &optarg))) {
+		struct commit *a;
+		if (get_sha1(optarg, sha1))
+			return error("Not a valid object name: %s", optarg);
+		a = lookup_commit_reference(sha1);
+		if (!a)
+			return error("Couldn't look up commit object for '%s'", optarg);
+		commit_list_insert(a, &(revs->parent_list));
+		return argcount;
 	} else if (!strcmp(arg, "--dense")) {
 		revs->dense = 1;
 	} else if (!strcmp(arg, "--sparse")) {
@@ -1989,6 +1999,14 @@ enum commit_action get_commit_action(struct rev_info *revs, struct commit *commi
 		return commit_ignore;
 	if (revs->merges_only && !(commit->parents && commit->parents->next))
 		return commit_ignore;
+	if (revs->parent_list) {
+		struct commit_list *a, *b;
+		for (b = revs->parent_list; b; b = b->next)
+			for (a = commit->parents; a; a = a->next)
+				if (!hashcmp(b->item->object.sha1, a->item->object.sha1))
+					return commit_show;
+		return commit_ignore;
+	}
 	if (!commit_match(commit, revs))
 		return commit_ignore;
 	if (revs->prune && revs->dense) {
diff --git a/revision.h b/revision.h
index 05659c6..e424a53 100644
--- a/revision.h
+++ b/revision.h
@@ -111,6 +111,9 @@ struct rev_info {
 	int		no_inline;
 	int		show_log_size;
 
+	/* Filter by parents */
+	struct commit_list *parent_list;
+
 	/* Filter by commit log message */
 	struct grep_opt	grep_filter;
 
-- 
1.7.3.98.g5ad7d

             reply	other threads:[~2010-09-30 10:30 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-09-30 10:30 Michael J Gruber [this message]
2010-09-30 14:32 ` [WIP PATCH] revision-walk: --parent option to find children of a parent Jonathan Nieder
2010-09-30 15:12   ` Michael J Gruber

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=99aa4cd5a60b2b2d3eae962acb8a49c2a62a8f77.1285842569.git.git@drmicha.warpmail.net \
    --to=git@drmicha.warpmail.net \
    --cc=git@vger.kernel.org \
    /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).