Extended SHA1 -- "rev^@" syntax to mean "all parents"
A short-hand "rev^@" is understood to be "all parents of the named commit" with this patch. So you can do git show v1.0.0^@ to view the parents of a merge commit, gitk ^v1.0.0^@ v1.0.4 to view the log between two revs (including the bottom one), and git diff --cc v1.1.0 v1.0.0^@ to inspect what got changed from the merge parents of v1.0.0 to v1.1.0. This might be just my shiny new toy that is not very useful in practice. I needed it to do the multi-tree diff on Len's infamous 12-way Octopus; typing "diff --cc funmerge funmerge^1 funmerge^2 funmerge^3 ..." was too painful. [jc: taking suggestions from Linus and Johannes to match expectations from shell users who are used to see $@ or $* either of which makes sense. I tend to write "$@" more often so...] Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
66ae0c7702
commit
ea4a19e172
37
revision.c
37
revision.c
@ -477,6 +477,36 @@ static void handle_all(struct rev_info *revs, unsigned flags)
|
|||||||
for_each_ref(handle_one_ref);
|
for_each_ref(handle_one_ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int add_parents_only(struct rev_info *revs, const char *arg, int flags)
|
||||||
|
{
|
||||||
|
unsigned char sha1[20];
|
||||||
|
struct object *it;
|
||||||
|
struct commit *commit;
|
||||||
|
struct commit_list *parents;
|
||||||
|
|
||||||
|
if (*arg == '^') {
|
||||||
|
flags ^= UNINTERESTING;
|
||||||
|
arg++;
|
||||||
|
}
|
||||||
|
if (get_sha1(arg, sha1))
|
||||||
|
return 0;
|
||||||
|
while (1) {
|
||||||
|
it = get_reference(revs, arg, sha1, 0);
|
||||||
|
if (strcmp(it->type, tag_type))
|
||||||
|
break;
|
||||||
|
memcpy(sha1, ((struct tag*)it)->tagged->sha1, 20);
|
||||||
|
}
|
||||||
|
if (strcmp(it->type, commit_type))
|
||||||
|
return 0;
|
||||||
|
commit = (struct commit *)it;
|
||||||
|
for (parents = commit->parents; parents; parents = parents->next) {
|
||||||
|
it = &parents->item->object;
|
||||||
|
it->flags |= flags;
|
||||||
|
add_pending_object(revs, it, arg);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
void init_revisions(struct rev_info *revs)
|
void init_revisions(struct rev_info *revs)
|
||||||
{
|
{
|
||||||
memset(revs, 0, sizeof(*revs));
|
memset(revs, 0, sizeof(*revs));
|
||||||
@ -746,6 +776,13 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
|
|||||||
}
|
}
|
||||||
*dotdot = '.';
|
*dotdot = '.';
|
||||||
}
|
}
|
||||||
|
dotdot = strstr(arg, "^@");
|
||||||
|
if (dotdot && !dotdot[2]) {
|
||||||
|
*dotdot = 0;
|
||||||
|
if (add_parents_only(revs, arg, flags))
|
||||||
|
continue;
|
||||||
|
*dotdot = '^';
|
||||||
|
}
|
||||||
local_flags = 0;
|
local_flags = 0;
|
||||||
if (*arg == '^') {
|
if (*arg == '^') {
|
||||||
local_flags = UNINTERESTING;
|
local_flags = UNINTERESTING;
|
||||||
|
Loading…
Reference in New Issue
Block a user