revlist.c: introduce --left/right-only for unsymmetric picking
The existing "--cherry-pick" does not work with unsymmetric ranges (A..B) for obvious reasons. Introduce "--left-only" and "--right-only" which limit the output to commits on the respective sides of a symmetric range (i.e. only "<" resp. ">" commits as per "--left-right"). This is especially useful for things like git log --cherry-pick --right-only @{u}... which is much more flexible (and descriptive) than git cherry @{u} | sed -ne 's/^+ //p' and potentially more useful than git log --cherry-pick @{u}... Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
7ed863a85a
commit
60adf7d73e
24
revision.c
24
revision.c
|
@ -733,6 +733,23 @@ static struct commit_list *collect_bottom_commits(struct commit_list *list)
|
||||||
return bottom;
|
return bottom;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Assumes either left_only or right_only is set */
|
||||||
|
static void limit_left_right(struct commit_list *list, struct rev_info *revs)
|
||||||
|
{
|
||||||
|
struct commit_list *p;
|
||||||
|
|
||||||
|
for (p = list; p; p = p->next) {
|
||||||
|
struct commit *commit = p->item;
|
||||||
|
|
||||||
|
if (revs->right_only) {
|
||||||
|
if (commit->object.flags & SYMMETRIC_LEFT)
|
||||||
|
commit->object.flags |= SHOWN;
|
||||||
|
} else /* revs->left_only is set */
|
||||||
|
if (!(commit->object.flags & SYMMETRIC_LEFT))
|
||||||
|
commit->object.flags |= SHOWN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int limit_list(struct rev_info *revs)
|
static int limit_list(struct rev_info *revs)
|
||||||
{
|
{
|
||||||
int slop = SLOP;
|
int slop = SLOP;
|
||||||
|
@ -788,6 +805,9 @@ static int limit_list(struct rev_info *revs)
|
||||||
if (revs->cherry_pick)
|
if (revs->cherry_pick)
|
||||||
cherry_pick_list(newlist, revs);
|
cherry_pick_list(newlist, revs);
|
||||||
|
|
||||||
|
if (revs->left_only || revs->right_only)
|
||||||
|
limit_left_right(newlist, revs);
|
||||||
|
|
||||||
if (bottom) {
|
if (bottom) {
|
||||||
limit_to_ancestry(bottom, newlist);
|
limit_to_ancestry(bottom, newlist);
|
||||||
free_commit_list(bottom);
|
free_commit_list(bottom);
|
||||||
|
@ -1263,6 +1283,10 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
|
||||||
revs->boundary = 1;
|
revs->boundary = 1;
|
||||||
} else if (!strcmp(arg, "--left-right")) {
|
} else if (!strcmp(arg, "--left-right")) {
|
||||||
revs->left_right = 1;
|
revs->left_right = 1;
|
||||||
|
} else if (!strcmp(arg, "--left-only")) {
|
||||||
|
revs->left_only = 1;
|
||||||
|
} else if (!strcmp(arg, "--right-only")) {
|
||||||
|
revs->right_only = 1;
|
||||||
} else if (!strcmp(arg, "--count")) {
|
} else if (!strcmp(arg, "--count")) {
|
||||||
revs->count = 1;
|
revs->count = 1;
|
||||||
} else if (!strcmp(arg, "--cherry-pick")) {
|
} else if (!strcmp(arg, "--cherry-pick")) {
|
||||||
|
|
|
@ -59,6 +59,8 @@ struct rev_info {
|
||||||
boundary:2,
|
boundary:2,
|
||||||
count:1,
|
count:1,
|
||||||
left_right:1,
|
left_right:1,
|
||||||
|
left_only:1,
|
||||||
|
right_only:1,
|
||||||
rewrite_parents:1,
|
rewrite_parents:1,
|
||||||
print_parents:1,
|
print_parents:1,
|
||||||
show_source:1,
|
show_source:1,
|
||||||
|
|
Loading…
Reference in New Issue