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:
Junio C Hamano 2013-11-07 14:34:14 -08:00
commit 0faff47d7b
2 changed files with 45 additions and 22 deletions

View File

@ -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 = '.';

View File

@ -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