Merge branch 'jc/revision-range-unpeel' into maint
"git rev-list --objects ^v1.0^ v1.0" gave v1.0 tag itself in the output, but "git rev-list --objects v1.0^..v1.0" did not. * jc/revision-range-unpeel: revision: do not peel tags used in range notation
This commit is contained in:
commit
0faff47d7b
59
revision.c
59
revision.c
@ -1420,26 +1420,40 @@ int handle_revision_arg(const char *arg_, struct rev_info *revs, int flags, unsi
|
|||||||
}
|
}
|
||||||
if (!get_sha1_committish(this, from_sha1) &&
|
if (!get_sha1_committish(this, from_sha1) &&
|
||||||
!get_sha1_committish(next, sha1)) {
|
!get_sha1_committish(next, sha1)) {
|
||||||
struct commit *a, *b;
|
struct object *a_obj, *b_obj;
|
||||||
struct commit_list *exclude;
|
|
||||||
|
|
||||||
a = lookup_commit_reference(from_sha1);
|
|
||||||
b = lookup_commit_reference(sha1);
|
|
||||||
if (!a || !b) {
|
|
||||||
if (revs->ignore_missing)
|
|
||||||
return 0;
|
|
||||||
die(symmetric ?
|
|
||||||
"Invalid symmetric difference expression %s...%s" :
|
|
||||||
"Invalid revision range %s..%s",
|
|
||||||
arg, next);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!cant_be_filename) {
|
if (!cant_be_filename) {
|
||||||
*dotdot = '.';
|
*dotdot = '.';
|
||||||
verify_non_filename(revs->prefix, arg);
|
verify_non_filename(revs->prefix, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (symmetric) {
|
a_obj = parse_object(from_sha1);
|
||||||
|
b_obj = parse_object(sha1);
|
||||||
|
if (!a_obj || !b_obj) {
|
||||||
|
missing:
|
||||||
|
if (revs->ignore_missing)
|
||||||
|
return 0;
|
||||||
|
die(symmetric
|
||||||
|
? "Invalid symmetric difference expression %s"
|
||||||
|
: "Invalid revision range %s", arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!symmetric) {
|
||||||
|
/* just A..B */
|
||||||
|
a_flags = flags_exclude;
|
||||||
|
} else {
|
||||||
|
/* A...B -- find merge bases between the two */
|
||||||
|
struct commit *a, *b;
|
||||||
|
struct commit_list *exclude;
|
||||||
|
|
||||||
|
a = (a_obj->type == OBJ_COMMIT
|
||||||
|
? (struct commit *)a_obj
|
||||||
|
: lookup_commit_reference(a_obj->sha1));
|
||||||
|
b = (b_obj->type == OBJ_COMMIT
|
||||||
|
? (struct commit *)b_obj
|
||||||
|
: lookup_commit_reference(b_obj->sha1));
|
||||||
|
if (!a || !b)
|
||||||
|
goto missing;
|
||||||
exclude = get_merge_bases(a, b, 1);
|
exclude = get_merge_bases(a, b, 1);
|
||||||
add_rev_cmdline_list(revs, exclude,
|
add_rev_cmdline_list(revs, exclude,
|
||||||
REV_CMD_MERGE_BASE,
|
REV_CMD_MERGE_BASE,
|
||||||
@ -1447,17 +1461,18 @@ int handle_revision_arg(const char *arg_, struct rev_info *revs, int flags, unsi
|
|||||||
add_pending_commit_list(revs, exclude,
|
add_pending_commit_list(revs, exclude,
|
||||||
flags_exclude);
|
flags_exclude);
|
||||||
free_commit_list(exclude);
|
free_commit_list(exclude);
|
||||||
|
|
||||||
a_flags = flags | SYMMETRIC_LEFT;
|
a_flags = flags | SYMMETRIC_LEFT;
|
||||||
} else
|
}
|
||||||
a_flags = flags_exclude;
|
|
||||||
a->object.flags |= a_flags;
|
a_obj->flags |= a_flags;
|
||||||
b->object.flags |= flags;
|
b_obj->flags |= flags;
|
||||||
add_rev_cmdline(revs, &a->object, this,
|
add_rev_cmdline(revs, a_obj, this,
|
||||||
REV_CMD_LEFT, a_flags);
|
REV_CMD_LEFT, a_flags);
|
||||||
add_rev_cmdline(revs, &b->object, next,
|
add_rev_cmdline(revs, b_obj, next,
|
||||||
REV_CMD_RIGHT, flags);
|
REV_CMD_RIGHT, flags);
|
||||||
add_pending_object(revs, &a->object, this);
|
add_pending_object(revs, a_obj, this);
|
||||||
add_pending_object(revs, &b->object, next);
|
add_pending_object(revs, b_obj, next);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
*dotdot = '.';
|
*dotdot = '.';
|
||||||
|
@ -48,4 +48,12 @@ test_expect_success 'rev-list --objects with pathspecs and copied files' '
|
|||||||
! grep one output
|
! grep one output
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'rev-list A..B and rev-list ^A B are the same' '
|
||||||
|
git commit --allow-empty -m another &&
|
||||||
|
git tag -a -m "annotated" v1.0 &&
|
||||||
|
git rev-list --objects ^v1.0^ v1.0 >expect &&
|
||||||
|
git rev-list --objects v1.0^..v1.0 >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user