From: Junio C Hamano <junkio@cox.net>
To: Linus Torvalds <torvalds@osdl.org>
Cc: git@vger.kernel.org
Subject: Re: A note on merging conflicts..
Date: Fri, 07 Jul 2006 01:26:47 -0700 [thread overview]
Message-ID: <7vejwx3jnc.fsf@assigned-by-dhcp.cox.net> (raw)
In-Reply-To: Pine.LNX.4.64.0606301927260.12404@g5.osdl.org
Linus Torvalds <torvalds@osdl.org> writes:
> One thing that is _very_ useful to do is to do when you have a conflict is
> this:
>
> git log -p HEAD MERGE_BASE..MERGE_HEAD -- conflicting-filename
>
> so that I wouldn't have to type that by hand ever again, and doing a
>
> git log -p --merge drivers/
>
> would automatically give me exactly that for all the unmerged files in
> drivers/.
>
> Anybody want to try to make me happy, and learn some git internals at the
> same time?
I was hoping somebody else would come forward, but it's been a
week, so here it is.
-- >8 --
[PATCH] git log -p --merge [[--] paths...]
This adds Linus's wish, "--merge" flag, which makes the above
expand to a rough equivalent to:
git log -p HEAD MERGE_HEAD ^$(git-merge-base HEAD MERGE_HEAD) \
-- $(git-ls-files -u [paths...] | cut -f2 | uniq)
Signed-off-by: Junio C Hamano <junkio@cox.net>
---
revision.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/revision.c b/revision.c
index 27fc1e3..e7128f2 100644
--- a/revision.c
+++ b/revision.c
@@ -548,6 +548,49 @@ static void add_pending_commit_list(stru
}
}
+static void prepare_show_merge(struct rev_info *revs)
+{
+ struct commit_list *bases;
+ struct commit *head, *other;
+ unsigned char sha1[20];
+ const char **prune = NULL;
+ int i, prune_num = 1; /* counting terminating NULL */
+
+ if (get_sha1("HEAD", sha1) || !(head = lookup_commit(sha1)))
+ die("--merge without HEAD?");
+ if (get_sha1("MERGE_HEAD", sha1) || !(other = lookup_commit(sha1)))
+ die("--merge without MERGE_HEAD?");
+ add_pending_object(revs, &head->object, "HEAD");
+ add_pending_object(revs, &other->object, "MERGE_HEAD");
+ bases = get_merge_bases(head, other, 1);
+ while (bases) {
+ struct commit *it = bases->item;
+ struct commit_list *n = bases->next;
+ free(bases);
+ bases = n;
+ it->object.flags |= UNINTERESTING;
+ add_pending_object(revs, &it->object, "(merge-base)");
+ }
+
+ if (!active_nr)
+ read_cache();
+ for (i = 0; i < active_nr; i++) {
+ struct cache_entry *ce = active_cache[i];
+ if (!ce_stage(ce))
+ continue;
+ if (ce_path_match(ce, revs->prune_data)) {
+ prune_num++;
+ prune = xrealloc(prune, sizeof(*prune) * prune_num);
+ prune[prune_num-2] = ce->name;
+ prune[prune_num-1] = NULL;
+ }
+ while ((i+1 < active_nr) &&
+ ce_same_name(ce, active_cache[i+1]))
+ i++;
+ }
+ revs->prune_data = prune;
+}
+
/*
* Parse revision information, filling in the "rev_info" structure,
* and removing the used arguments from the argument list.
@@ -557,7 +600,7 @@ static void add_pending_commit_list(stru
*/
int setup_revisions(int argc, const char **argv, struct rev_info *revs, const char *def)
{
- int i, flags, seen_dashdash;
+ int i, flags, seen_dashdash, show_merge;
const char **unrecognized = argv + 1;
int left = 1;
@@ -574,7 +617,7 @@ int setup_revisions(int argc, const char
break;
}
- flags = 0;
+ flags = show_merge = 0;
for (i = 1; i < argc; i++) {
struct object *object;
const char *arg = argv[i];
@@ -641,6 +684,10 @@ int setup_revisions(int argc, const char
def = argv[i];
continue;
}
+ if (!strcmp(arg, "--merge")) {
+ show_merge = 1;
+ continue;
+ }
if (!strcmp(arg, "--topo-order")) {
revs->topo_order = 1;
continue;
@@ -861,6 +908,8 @@ int setup_revisions(int argc, const char
object = get_reference(revs, arg, sha1, flags ^ local_flags);
add_pending_object(revs, object, arg);
}
+ if (show_merge)
+ prepare_show_merge(revs);
if (def && !revs->pending.nr) {
unsigned char sha1[20];
struct object *object;
--
1.4.1.g4d2af
prev parent reply other threads:[~2006-07-07 8:26 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
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 ` Junio C Hamano [this message]
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=7vejwx3jnc.fsf@assigned-by-dhcp.cox.net \
--to=junkio@cox.net \
--cc=git@vger.kernel.org \
--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.