895c5ba3c1
A range notation "A..B" means exactly the same thing as what "^A B" means, i.e. the set of commits that are reachable from B but not from A. But the internal representation after the revision parser parsed these two notations are subtly different. - "rev-list ^A B" leaves A and B in the revs->pending.objects[] array, with the former marked as UNINTERESTING and the revision traversal machinery propagates the mark to underlying commit objects A^0 and B^0. - "rev-list A..B" peels tags and leaves A^0 (marked as UNINTERESTING) and B^0 in revs->pending.objects[] array before the traversal machinery kicks in. This difference usually does not matter, but starts to matter when the --objects option is used. For example, we see this: $ git rev-list --objects v1.8.4^1..v1.8.4 | grep $(git rev-parse v1.8.4) $ git rev-list --objects v1.8.4 ^v1.8.4^1 | grep $(git rev-parse v1.8.4) 04f013dc38d7512eadb915eba22efc414f18b869 v1.8.4 With the former invocation, the revision traversal machinery never hears about the tag v1.8.4 (it only sees the result of peeling it, i.e. the commit v1.8.4^0), and the tag itself does not appear in the output. The latter does send the tag object itself to the output. Make the range notation keep the unpeeled objects and feed them to the traversal machinery to fix this inconsistency. Signed-off-by: Junio C Hamano <gitster@pobox.com>
60 lines
1.4 KiB
Bash
Executable File
60 lines
1.4 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
test_description='miscellaneous rev-list tests'
|
|
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success setup '
|
|
echo content1 >wanted_file &&
|
|
echo content2 >unwanted_file &&
|
|
git add wanted_file unwanted_file &&
|
|
git commit -m one
|
|
'
|
|
|
|
test_expect_success 'rev-list --objects heeds pathspecs' '
|
|
git rev-list --objects HEAD -- wanted_file >output &&
|
|
grep wanted_file output &&
|
|
! grep unwanted_file output
|
|
'
|
|
|
|
test_expect_success 'rev-list --objects with pathspecs and deeper paths' '
|
|
mkdir foo &&
|
|
>foo/file &&
|
|
git add foo/file &&
|
|
git commit -m two &&
|
|
|
|
git rev-list --objects HEAD -- foo >output &&
|
|
grep foo/file output &&
|
|
|
|
git rev-list --objects HEAD -- foo/file >output &&
|
|
grep foo/file output &&
|
|
! grep unwanted_file output
|
|
'
|
|
|
|
test_expect_success 'rev-list --objects with pathspecs and copied files' '
|
|
git checkout --orphan junio-testcase &&
|
|
git rm -rf . &&
|
|
|
|
mkdir two &&
|
|
echo frotz >one &&
|
|
cp one two/three &&
|
|
git add one two/three &&
|
|
test_tick &&
|
|
git commit -m that &&
|
|
|
|
ONE=$(git rev-parse HEAD:one)
|
|
git rev-list --objects HEAD two >output &&
|
|
grep "$ONE two/three" 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
|