From: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
To: Linus Torvalds <torvalds@osdl.org>
Cc: Junio C Hamano <junkio@cox.net>, git@vger.kernel.org
Subject: Re: A note on merging conflicts..
Date: Sat, 1 Jul 2006 17:09:26 +0200 [thread overview]
Message-ID: <20060701150926.GA25800@lsrfire.ath.cx> (raw)
In-Reply-To: <Pine.LNX.4.64.0606302046230.12404@g5.osdl.org>
On Fri, Jun 30, 2006 at 08:54:33PM -0700, Linus Torvalds wrote:
> Now, the expression
>
> A...B == B...A == A B --not $(git-merge-base --all A B)
>
> is meaningful (and the one I want for merges), but it's largely useless
> for anything else. It just means "the set of all commits that aren't
> trivially in both" (it's not strictly a valid set operation, but it
> approaches being an "xor" instead of a union or an intersection or a
> difference).
You mean something like the following patch on top of the 'next' branch?
It also documents the --not switch because I needed it for the example.
TODO: There are still a few undocumented options left and setup_revisions()
is fat and ugly. Any volunteers? I'd clean it up if I only could
write comprehensible documentation and wasn't that lazy..
Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
diff --git a/Documentation/git-rev-list.txt b/Documentation/git-rev-list.txt
index ad6d14c..ffbf0c9 100644
--- a/Documentation/git-rev-list.txt
+++ b/Documentation/git-rev-list.txt
@@ -15,6 +15,7 @@ SYNOPSIS
[ \--sparse ]
[ \--no-merges ]
[ \--remove-empty ]
+ [ \--not ]
[ \--all ]
[ \--topo-order ]
[ \--parents ]
@@ -37,6 +38,14 @@ not in 'baz'".
A special notation <commit1>..<commit2> can be used as a
short-hand for {caret}<commit1> <commit2>.
+Another special notation is <commit1>...<commit2> which is useful for
+merges. The resulting set of commits is the symmetric difference
+between the two operands. The following two commands are equivalent:
+
+------------
+$ git-rev-list A B --not $(git-merge-base --all A B)
+$ git-rev-list A...B
+------------
OPTIONS
-------
@@ -93,6 +102,11 @@ OPTIONS
--remove-empty::
Stop when a given path disappears from the tree.
+--not::
+ Reverses the meaning of the '{caret}' prefix (or lack
+ thereof) for all following revision specifiers, up to
+ the next `--not`.
+
--all::
Pretend as if all the refs in `$GIT_DIR/refs/` are
listed on the command line as <commit>.
diff --git a/revision.c b/revision.c
index ae4ca82..d4224a1 100644
--- a/revision.c
+++ b/revision.c
@@ -766,6 +766,47 @@ int setup_revisions(int argc, const char
left++;
continue;
}
+ dotdot = strstr(arg, "...");
+ if (dotdot) {
+ unsigned char other_sha1[20];
+ const char *one = arg;
+ const char *two = dotdot + 3;
+ *dotdot = '\0';
+ if (dotdot == arg)
+ one = "HEAD";
+ if (!*two)
+ two = "HEAD";
+ if (!get_sha1(one, sha1) &&
+ !get_sha1(two, other_sha1)) {
+ struct commit *a, *b;
+ struct commit_list *exclude;
+
+ a = lookup_commit_reference(sha1);
+ b = lookup_commit_reference(other_sha1);
+ if (!a || !b)
+ die("Invalid symmetric difference expression %s...%s", arg, two);
+
+ if (!seen_dashdash) {
+ *dotdot = '.';
+ verify_non_filename(revs->prefix, arg);
+
+ }
+ exclude = get_merge_bases(a, b);
+ while (exclude) {
+ struct object *object =
+ &exclude->item->object;
+ object->flags |= flags ^ UNINTERESTING;
+ add_pending_object(revs, object, sha1_to_hex(object->sha1));
+ exclude = exclude->next;
+ }
+ a->object.flags |= flags;
+ add_pending_object(revs, &a->object, one);
+ b->object.flags |= flags;
+ add_pending_object(revs, &b->object, two);
+ continue;
+ }
+ *dotdot = '.';
+ }
dotdot = strstr(arg, "..");
if (dotdot) {
unsigned char from_sha1[20];
next prev parent reply other threads:[~2006-07-01 15:11 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-07-01 2:44 A note on merging conflicts Linus Torvalds
2006-07-01 3:08 ` Junio C Hamano
2006-07-01 3:54 ` Linus Torvalds
2006-07-01 3:59 ` Linus Torvalds
2006-07-01 15:09 ` Rene Scharfe [this message]
2006-07-01 15:23 ` Johannes Schindelin
2006-07-01 16:25 ` Linus Torvalds
2006-07-01 18:13 ` Rene Scharfe
2006-07-01 18:01 ` J. Bruce Fields
2006-07-01 18:20 ` Linus Torvalds
2006-07-01 22:24 ` Daniel Barkalow
2006-07-01 22:57 ` Linus Torvalds
2006-07-01 23:25 ` Daniel Barkalow
2006-07-01 23:45 ` Daniel Barkalow
2006-07-02 11:31 ` Rene Scharfe
2006-07-02 21:42 ` Daniel Barkalow
2006-07-02 0:08 ` Linus Torvalds
2006-07-01 18:22 ` Jakub Narebski
2006-07-01 18:52 ` Linus Torvalds
2006-07-01 18:37 ` Junio C Hamano
2006-07-01 19:29 ` Rene Scharfe
2006-07-01 19:56 ` Junio C Hamano
2006-07-01 23:01 ` Johannes Schindelin
2006-07-01 20:04 ` Linus Torvalds
2006-07-01 20:07 ` Junio C Hamano
2006-07-01 20:14 ` Junio C Hamano
2006-07-01 23:29 ` [PATCH 1/3] Add get_merge_bases_clean() Rene Scharfe
2006-07-01 23:43 ` Johannes Schindelin
2006-07-01 23:29 ` [PATCH 2/3] Add '...' operator for revisions Rene Scharfe
2006-07-01 23:29 ` [PATCH 3/3] Make clear_commit_marks() clean harder Rene Scharfe
2006-07-03 9:32 ` Junio C Hamano
2006-07-03 13:56 ` Johannes Schindelin
2006-07-03 17:05 ` Linus Torvalds
2006-07-03 21:08 ` Johannes Schindelin
2006-07-03 19:47 ` Junio C Hamano
2006-07-03 21:12 ` Johannes Schindelin
2006-07-03 22:55 ` Linus Torvalds
2006-07-04 7:53 ` Johannes Schindelin
2006-07-04 8:20 ` Junio C Hamano
2006-07-02 9:49 ` [PATCH 4/3] Fold get_merge_bases_clean() into get_merge_bases() Rene Scharfe
2006-07-02 9:56 ` Johannes Schindelin
2006-07-02 16:43 ` Linus Torvalds
2006-07-02 17:40 ` Rene Scharfe
2006-07-02 18:28 ` Junio C Hamano
2006-07-02 20:59 ` Rene Scharfe
2006-07-02 21:15 ` Rene Scharfe
2006-07-02 21:17 ` Linus Torvalds
2006-07-02 20:44 ` Linus Torvalds
2006-07-07 8:26 ` A note on merging conflicts Junio C Hamano
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=20060701150926.GA25800@lsrfire.ath.cx \
--to=rene.scharfe@lsrfire.ath.cx \
--cc=git@vger.kernel.org \
--cc=junkio@cox.net \
--cc=torvalds@osdl.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.