2005-06-26 15:29:18 +04:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# Copyright (c) 2005 Junio C Hamano
|
|
|
|
#
|
|
|
|
|
2008-09-03 12:59:29 +04:00
|
|
|
test_description='git pack-object
|
2005-06-26 15:29:18 +04:00
|
|
|
|
|
|
|
'
|
|
|
|
. ./test-lib.sh
|
|
|
|
|
t5300: modernize basic tests
The first set of tests in t5300 goes back to 2005, and doesn't use some
of our customary style and tools these days. In preparation for touching
them, let's modernize a few things:
- titles go on the line with test_expect_success, with a hanging
open-quote to start the test body
- test bodies should be indented with tabs
- opening braces for shell blocks in &&-chains go on their own line
- no space between redirect operators and files (">foo", not "> foo")
- avoid doing work outside of test blocks; in this case, we can stick
the setup of ".git2" into the appropriate blocks
- avoid modifying and then cleaning up the environment or current
directory by using subshells and "git -C"
- this test does a curious thing when testing the unpacking: it sets
GIT_OBJECT_DIRECTORY, and then does a "git init" in the _original_
directory, creating a weird mixed situation. Instead, it's much
simpler to just "git init --bare" a new repository to unpack into,
and check the results there. I renamed this "git2" instead of
".git2" to make it more clear it's a separate repo.
- we can observe that the bodies of the no-delta, ref_delta, and
ofs_delta cases are all virtually identical except for the pack
creation, and factor out shared helper functions. I collapsed "do
the unpack" and "check the results of the unpack" into a single
test, since that makes the expected lifetime of the "git2" temporary
directory more clear (that also lets us use test_when_finished to
clean it up). This does make the "-v" output slightly less useful,
but the improvement in reading the actual test code makes it worth
it.
- I dropped the "pwd" calls from some tests. These don't do anything
functional, and I suspect may have been an aid for debugging when
the script was more cavalier about leaving the working directory
changed between tests.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-05-01 17:02:59 +03:00
|
|
|
test_expect_success 'setup' '
|
|
|
|
rm -f .git/index* &&
|
|
|
|
perl -e "print \"a\" x 4096;" >a &&
|
|
|
|
perl -e "print \"b\" x 4096;" >b &&
|
|
|
|
perl -e "print \"c\" x 4096;" >c &&
|
|
|
|
test-tool genrandom "seed a" 2097152 >a_big &&
|
|
|
|
test-tool genrandom "seed b" 2097152 >b_big &&
|
|
|
|
git update-index --add a a_big b b_big c &&
|
|
|
|
cat c >d && echo foo >>d && git update-index --add d &&
|
|
|
|
tree=$(git write-tree) &&
|
|
|
|
commit=$(git commit-tree $tree </dev/null) &&
|
|
|
|
{
|
|
|
|
echo $tree &&
|
|
|
|
echo $commit &&
|
|
|
|
git ls-tree $tree | sed -e "s/.* \\([0-9a-f]*\\) .*/\\1/"
|
|
|
|
} >obj-list &&
|
|
|
|
{
|
|
|
|
git diff-tree --root -p $commit &&
|
|
|
|
while read object
|
|
|
|
do
|
|
|
|
t=$(git cat-file -t $object) &&
|
|
|
|
git cat-file $t $object || return 1
|
|
|
|
done <obj-list
|
|
|
|
} >expect
|
|
|
|
'
|
2005-06-26 15:29:18 +04:00
|
|
|
|
t5300: modernize basic tests
The first set of tests in t5300 goes back to 2005, and doesn't use some
of our customary style and tools these days. In preparation for touching
them, let's modernize a few things:
- titles go on the line with test_expect_success, with a hanging
open-quote to start the test body
- test bodies should be indented with tabs
- opening braces for shell blocks in &&-chains go on their own line
- no space between redirect operators and files (">foo", not "> foo")
- avoid doing work outside of test blocks; in this case, we can stick
the setup of ".git2" into the appropriate blocks
- avoid modifying and then cleaning up the environment or current
directory by using subshells and "git -C"
- this test does a curious thing when testing the unpacking: it sets
GIT_OBJECT_DIRECTORY, and then does a "git init" in the _original_
directory, creating a weird mixed situation. Instead, it's much
simpler to just "git init --bare" a new repository to unpack into,
and check the results there. I renamed this "git2" instead of
".git2" to make it more clear it's a separate repo.
- we can observe that the bodies of the no-delta, ref_delta, and
ofs_delta cases are all virtually identical except for the pack
creation, and factor out shared helper functions. I collapsed "do
the unpack" and "check the results of the unpack" into a single
test, since that makes the expected lifetime of the "git2" temporary
directory more clear (that also lets us use test_when_finished to
clean it up). This does make the "-v" output slightly less useful,
but the improvement in reading the actual test code makes it worth
it.
- I dropped the "pwd" calls from some tests. These don't do anything
functional, and I suspect may have been an aid for debugging when
the script was more cavalier about leaving the working directory
changed between tests.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-05-01 17:02:59 +03:00
|
|
|
test_expect_success 'pack without delta' '
|
|
|
|
packname_1=$(git pack-objects --window=0 test-1 <obj-list)
|
|
|
|
'
|
2005-06-26 15:29:18 +04:00
|
|
|
|
t5300: modernize basic tests
The first set of tests in t5300 goes back to 2005, and doesn't use some
of our customary style and tools these days. In preparation for touching
them, let's modernize a few things:
- titles go on the line with test_expect_success, with a hanging
open-quote to start the test body
- test bodies should be indented with tabs
- opening braces for shell blocks in &&-chains go on their own line
- no space between redirect operators and files (">foo", not "> foo")
- avoid doing work outside of test blocks; in this case, we can stick
the setup of ".git2" into the appropriate blocks
- avoid modifying and then cleaning up the environment or current
directory by using subshells and "git -C"
- this test does a curious thing when testing the unpacking: it sets
GIT_OBJECT_DIRECTORY, and then does a "git init" in the _original_
directory, creating a weird mixed situation. Instead, it's much
simpler to just "git init --bare" a new repository to unpack into,
and check the results there. I renamed this "git2" instead of
".git2" to make it more clear it's a separate repo.
- we can observe that the bodies of the no-delta, ref_delta, and
ofs_delta cases are all virtually identical except for the pack
creation, and factor out shared helper functions. I collapsed "do
the unpack" and "check the results of the unpack" into a single
test, since that makes the expected lifetime of the "git2" temporary
directory more clear (that also lets us use test_when_finished to
clean it up). This does make the "-v" output slightly less useful,
but the improvement in reading the actual test code makes it worth
it.
- I dropped the "pwd" calls from some tests. These don't do anything
functional, and I suspect may have been an aid for debugging when
the script was more cavalier about leaving the working directory
changed between tests.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-05-01 17:02:59 +03:00
|
|
|
test_expect_success 'pack-objects with bogus arguments' '
|
|
|
|
test_must_fail git pack-objects --window=0 test-1 blah blah <obj-list
|
|
|
|
'
|
2005-06-26 15:29:18 +04:00
|
|
|
|
t5300: modernize basic tests
The first set of tests in t5300 goes back to 2005, and doesn't use some
of our customary style and tools these days. In preparation for touching
them, let's modernize a few things:
- titles go on the line with test_expect_success, with a hanging
open-quote to start the test body
- test bodies should be indented with tabs
- opening braces for shell blocks in &&-chains go on their own line
- no space between redirect operators and files (">foo", not "> foo")
- avoid doing work outside of test blocks; in this case, we can stick
the setup of ".git2" into the appropriate blocks
- avoid modifying and then cleaning up the environment or current
directory by using subshells and "git -C"
- this test does a curious thing when testing the unpacking: it sets
GIT_OBJECT_DIRECTORY, and then does a "git init" in the _original_
directory, creating a weird mixed situation. Instead, it's much
simpler to just "git init --bare" a new repository to unpack into,
and check the results there. I renamed this "git2" instead of
".git2" to make it more clear it's a separate repo.
- we can observe that the bodies of the no-delta, ref_delta, and
ofs_delta cases are all virtually identical except for the pack
creation, and factor out shared helper functions. I collapsed "do
the unpack" and "check the results of the unpack" into a single
test, since that makes the expected lifetime of the "git2" temporary
directory more clear (that also lets us use test_when_finished to
clean it up). This does make the "-v" output slightly less useful,
but the improvement in reading the actual test code makes it worth
it.
- I dropped the "pwd" calls from some tests. These don't do anything
functional, and I suspect may have been an aid for debugging when
the script was more cavalier about leaving the working directory
changed between tests.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-05-01 17:02:59 +03:00
|
|
|
check_unpack () {
|
|
|
|
test_when_finished "rm -rf git2" &&
|
|
|
|
git init --bare git2 &&
|
|
|
|
git -C git2 unpack-objects -n <"$1".pack &&
|
|
|
|
git -C git2 unpack-objects <"$1".pack &&
|
|
|
|
(cd .git && find objects -type f -print) |
|
|
|
|
while read path
|
|
|
|
do
|
|
|
|
cmp git2/$path .git/$path || {
|
|
|
|
echo $path differs.
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
test_expect_success 'unpack without delta' '
|
|
|
|
check_unpack test-1-${packname_1}
|
|
|
|
'
|
2005-06-26 15:29:18 +04:00
|
|
|
|
t5300: modernize basic tests
The first set of tests in t5300 goes back to 2005, and doesn't use some
of our customary style and tools these days. In preparation for touching
them, let's modernize a few things:
- titles go on the line with test_expect_success, with a hanging
open-quote to start the test body
- test bodies should be indented with tabs
- opening braces for shell blocks in &&-chains go on their own line
- no space between redirect operators and files (">foo", not "> foo")
- avoid doing work outside of test blocks; in this case, we can stick
the setup of ".git2" into the appropriate blocks
- avoid modifying and then cleaning up the environment or current
directory by using subshells and "git -C"
- this test does a curious thing when testing the unpacking: it sets
GIT_OBJECT_DIRECTORY, and then does a "git init" in the _original_
directory, creating a weird mixed situation. Instead, it's much
simpler to just "git init --bare" a new repository to unpack into,
and check the results there. I renamed this "git2" instead of
".git2" to make it more clear it's a separate repo.
- we can observe that the bodies of the no-delta, ref_delta, and
ofs_delta cases are all virtually identical except for the pack
creation, and factor out shared helper functions. I collapsed "do
the unpack" and "check the results of the unpack" into a single
test, since that makes the expected lifetime of the "git2" temporary
directory more clear (that also lets us use test_when_finished to
clean it up). This does make the "-v" output slightly less useful,
but the improvement in reading the actual test code makes it worth
it.
- I dropped the "pwd" calls from some tests. These don't do anything
functional, and I suspect may have been an aid for debugging when
the script was more cavalier about leaving the working directory
changed between tests.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-05-01 17:02:59 +03:00
|
|
|
test_expect_success 'pack with REF_DELTA' '
|
|
|
|
packname_2=$(git pack-objects test-2 <obj-list)
|
|
|
|
'
|
2005-06-26 15:29:18 +04:00
|
|
|
|
t5300: modernize basic tests
The first set of tests in t5300 goes back to 2005, and doesn't use some
of our customary style and tools these days. In preparation for touching
them, let's modernize a few things:
- titles go on the line with test_expect_success, with a hanging
open-quote to start the test body
- test bodies should be indented with tabs
- opening braces for shell blocks in &&-chains go on their own line
- no space between redirect operators and files (">foo", not "> foo")
- avoid doing work outside of test blocks; in this case, we can stick
the setup of ".git2" into the appropriate blocks
- avoid modifying and then cleaning up the environment or current
directory by using subshells and "git -C"
- this test does a curious thing when testing the unpacking: it sets
GIT_OBJECT_DIRECTORY, and then does a "git init" in the _original_
directory, creating a weird mixed situation. Instead, it's much
simpler to just "git init --bare" a new repository to unpack into,
and check the results there. I renamed this "git2" instead of
".git2" to make it more clear it's a separate repo.
- we can observe that the bodies of the no-delta, ref_delta, and
ofs_delta cases are all virtually identical except for the pack
creation, and factor out shared helper functions. I collapsed "do
the unpack" and "check the results of the unpack" into a single
test, since that makes the expected lifetime of the "git2" temporary
directory more clear (that also lets us use test_when_finished to
clean it up). This does make the "-v" output slightly less useful,
but the improvement in reading the actual test code makes it worth
it.
- I dropped the "pwd" calls from some tests. These don't do anything
functional, and I suspect may have been an aid for debugging when
the script was more cavalier about leaving the working directory
changed between tests.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-05-01 17:02:59 +03:00
|
|
|
test_expect_success 'unpack with REF_DELTA' '
|
|
|
|
check_unpack test-2-${packname_2}
|
|
|
|
'
|
2007-03-16 20:50:18 +03:00
|
|
|
|
t5300: modernize basic tests
The first set of tests in t5300 goes back to 2005, and doesn't use some
of our customary style and tools these days. In preparation for touching
them, let's modernize a few things:
- titles go on the line with test_expect_success, with a hanging
open-quote to start the test body
- test bodies should be indented with tabs
- opening braces for shell blocks in &&-chains go on their own line
- no space between redirect operators and files (">foo", not "> foo")
- avoid doing work outside of test blocks; in this case, we can stick
the setup of ".git2" into the appropriate blocks
- avoid modifying and then cleaning up the environment or current
directory by using subshells and "git -C"
- this test does a curious thing when testing the unpacking: it sets
GIT_OBJECT_DIRECTORY, and then does a "git init" in the _original_
directory, creating a weird mixed situation. Instead, it's much
simpler to just "git init --bare" a new repository to unpack into,
and check the results there. I renamed this "git2" instead of
".git2" to make it more clear it's a separate repo.
- we can observe that the bodies of the no-delta, ref_delta, and
ofs_delta cases are all virtually identical except for the pack
creation, and factor out shared helper functions. I collapsed "do
the unpack" and "check the results of the unpack" into a single
test, since that makes the expected lifetime of the "git2" temporary
directory more clear (that also lets us use test_when_finished to
clean it up). This does make the "-v" output slightly less useful,
but the improvement in reading the actual test code makes it worth
it.
- I dropped the "pwd" calls from some tests. These don't do anything
functional, and I suspect may have been an aid for debugging when
the script was more cavalier about leaving the working directory
changed between tests.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-05-01 17:02:59 +03:00
|
|
|
test_expect_success 'pack with OFS_DELTA' '
|
|
|
|
packname_3=$(git pack-objects --delta-base-offset test-3 <obj-list)
|
|
|
|
'
|
2007-03-16 20:50:18 +03:00
|
|
|
|
t5300: modernize basic tests
The first set of tests in t5300 goes back to 2005, and doesn't use some
of our customary style and tools these days. In preparation for touching
them, let's modernize a few things:
- titles go on the line with test_expect_success, with a hanging
open-quote to start the test body
- test bodies should be indented with tabs
- opening braces for shell blocks in &&-chains go on their own line
- no space between redirect operators and files (">foo", not "> foo")
- avoid doing work outside of test blocks; in this case, we can stick
the setup of ".git2" into the appropriate blocks
- avoid modifying and then cleaning up the environment or current
directory by using subshells and "git -C"
- this test does a curious thing when testing the unpacking: it sets
GIT_OBJECT_DIRECTORY, and then does a "git init" in the _original_
directory, creating a weird mixed situation. Instead, it's much
simpler to just "git init --bare" a new repository to unpack into,
and check the results there. I renamed this "git2" instead of
".git2" to make it more clear it's a separate repo.
- we can observe that the bodies of the no-delta, ref_delta, and
ofs_delta cases are all virtually identical except for the pack
creation, and factor out shared helper functions. I collapsed "do
the unpack" and "check the results of the unpack" into a single
test, since that makes the expected lifetime of the "git2" temporary
directory more clear (that also lets us use test_when_finished to
clean it up). This does make the "-v" output slightly less useful,
but the improvement in reading the actual test code makes it worth
it.
- I dropped the "pwd" calls from some tests. These don't do anything
functional, and I suspect may have been an aid for debugging when
the script was more cavalier about leaving the working directory
changed between tests.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-05-01 17:02:59 +03:00
|
|
|
test_expect_success 'unpack with OFS_DELTA' '
|
|
|
|
check_unpack test-3-${packname_3}
|
|
|
|
'
|
2007-03-16 20:50:18 +03:00
|
|
|
|
2007-04-07 03:49:03 +04:00
|
|
|
test_expect_success 'compare delta flavors' '
|
2013-10-29 05:23:03 +04:00
|
|
|
perl -e '\''
|
2007-04-07 03:49:03 +04:00
|
|
|
defined($_ = -s $_) or die for @ARGV;
|
|
|
|
exit 1 if $ARGV[0] <= $ARGV[1];
|
|
|
|
'\'' test-2-$packname_2.pack test-3-$packname_3.pack
|
|
|
|
'
|
2007-03-16 20:50:18 +03:00
|
|
|
|
t5300: modernize basic tests
The first set of tests in t5300 goes back to 2005, and doesn't use some
of our customary style and tools these days. In preparation for touching
them, let's modernize a few things:
- titles go on the line with test_expect_success, with a hanging
open-quote to start the test body
- test bodies should be indented with tabs
- opening braces for shell blocks in &&-chains go on their own line
- no space between redirect operators and files (">foo", not "> foo")
- avoid doing work outside of test blocks; in this case, we can stick
the setup of ".git2" into the appropriate blocks
- avoid modifying and then cleaning up the environment or current
directory by using subshells and "git -C"
- this test does a curious thing when testing the unpacking: it sets
GIT_OBJECT_DIRECTORY, and then does a "git init" in the _original_
directory, creating a weird mixed situation. Instead, it's much
simpler to just "git init --bare" a new repository to unpack into,
and check the results there. I renamed this "git2" instead of
".git2" to make it more clear it's a separate repo.
- we can observe that the bodies of the no-delta, ref_delta, and
ofs_delta cases are all virtually identical except for the pack
creation, and factor out shared helper functions. I collapsed "do
the unpack" and "check the results of the unpack" into a single
test, since that makes the expected lifetime of the "git2" temporary
directory more clear (that also lets us use test_when_finished to
clean it up). This does make the "-v" output slightly less useful,
but the improvement in reading the actual test code makes it worth
it.
- I dropped the "pwd" calls from some tests. These don't do anything
functional, and I suspect may have been an aid for debugging when
the script was more cavalier about leaving the working directory
changed between tests.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-05-01 17:02:59 +03:00
|
|
|
check_use_objects () {
|
|
|
|
test_when_finished "rm -rf git2" &&
|
|
|
|
git init --bare git2 &&
|
|
|
|
cp "$1".pack "$1".idx git2/objects/pack &&
|
|
|
|
(
|
|
|
|
cd git2 &&
|
|
|
|
git diff-tree --root -p $commit &&
|
|
|
|
while read object
|
|
|
|
do
|
|
|
|
t=$(git cat-file -t $object) &&
|
|
|
|
git cat-file $t $object || exit 1
|
|
|
|
done
|
|
|
|
) <obj-list >current &&
|
|
|
|
cmp expect current
|
|
|
|
}
|
|
|
|
|
|
|
|
test_expect_success 'use packed objects' '
|
|
|
|
check_use_objects test-1-${packname_1}
|
|
|
|
'
|
2005-06-27 14:35:33 +04:00
|
|
|
|
t5300: modernize basic tests
The first set of tests in t5300 goes back to 2005, and doesn't use some
of our customary style and tools these days. In preparation for touching
them, let's modernize a few things:
- titles go on the line with test_expect_success, with a hanging
open-quote to start the test body
- test bodies should be indented with tabs
- opening braces for shell blocks in &&-chains go on their own line
- no space between redirect operators and files (">foo", not "> foo")
- avoid doing work outside of test blocks; in this case, we can stick
the setup of ".git2" into the appropriate blocks
- avoid modifying and then cleaning up the environment or current
directory by using subshells and "git -C"
- this test does a curious thing when testing the unpacking: it sets
GIT_OBJECT_DIRECTORY, and then does a "git init" in the _original_
directory, creating a weird mixed situation. Instead, it's much
simpler to just "git init --bare" a new repository to unpack into,
and check the results there. I renamed this "git2" instead of
".git2" to make it more clear it's a separate repo.
- we can observe that the bodies of the no-delta, ref_delta, and
ofs_delta cases are all virtually identical except for the pack
creation, and factor out shared helper functions. I collapsed "do
the unpack" and "check the results of the unpack" into a single
test, since that makes the expected lifetime of the "git2" temporary
directory more clear (that also lets us use test_when_finished to
clean it up). This does make the "-v" output slightly less useful,
but the improvement in reading the actual test code makes it worth
it.
- I dropped the "pwd" calls from some tests. These don't do anything
functional, and I suspect may have been an aid for debugging when
the script was more cavalier about leaving the working directory
changed between tests.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-05-01 17:02:59 +03:00
|
|
|
test_expect_success 'use packed deltified (REF_DELTA) objects' '
|
|
|
|
check_use_objects test-2-${packname_2}
|
|
|
|
'
|
2005-06-27 14:35:33 +04:00
|
|
|
|
t5300: modernize basic tests
The first set of tests in t5300 goes back to 2005, and doesn't use some
of our customary style and tools these days. In preparation for touching
them, let's modernize a few things:
- titles go on the line with test_expect_success, with a hanging
open-quote to start the test body
- test bodies should be indented with tabs
- opening braces for shell blocks in &&-chains go on their own line
- no space between redirect operators and files (">foo", not "> foo")
- avoid doing work outside of test blocks; in this case, we can stick
the setup of ".git2" into the appropriate blocks
- avoid modifying and then cleaning up the environment or current
directory by using subshells and "git -C"
- this test does a curious thing when testing the unpacking: it sets
GIT_OBJECT_DIRECTORY, and then does a "git init" in the _original_
directory, creating a weird mixed situation. Instead, it's much
simpler to just "git init --bare" a new repository to unpack into,
and check the results there. I renamed this "git2" instead of
".git2" to make it more clear it's a separate repo.
- we can observe that the bodies of the no-delta, ref_delta, and
ofs_delta cases are all virtually identical except for the pack
creation, and factor out shared helper functions. I collapsed "do
the unpack" and "check the results of the unpack" into a single
test, since that makes the expected lifetime of the "git2" temporary
directory more clear (that also lets us use test_when_finished to
clean it up). This does make the "-v" output slightly less useful,
but the improvement in reading the actual test code makes it worth
it.
- I dropped the "pwd" calls from some tests. These don't do anything
functional, and I suspect may have been an aid for debugging when
the script was more cavalier about leaving the working directory
changed between tests.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-05-01 17:02:59 +03:00
|
|
|
test_expect_success 'use packed deltified (OFS_DELTA) objects' '
|
|
|
|
check_use_objects test-3-${packname_3}
|
|
|
|
'
|
2005-06-29 13:51:27 +04:00
|
|
|
|
2009-02-25 10:11:29 +03:00
|
|
|
test_expect_success 'survive missing objects/pack directory' '
|
|
|
|
(
|
|
|
|
rm -fr missing-pack &&
|
|
|
|
mkdir missing-pack &&
|
|
|
|
cd missing-pack &&
|
|
|
|
git init &&
|
2018-07-02 03:24:01 +03:00
|
|
|
GOP=.git/objects/pack &&
|
2009-02-25 10:11:29 +03:00
|
|
|
rm -fr $GOP &&
|
|
|
|
git index-pack --stdin --keep=test <../test-3-${packname_3}.pack &&
|
|
|
|
test -f $GOP/pack-${packname_3}.pack &&
|
2013-10-26 23:17:14 +04:00
|
|
|
cmp $GOP/pack-${packname_3}.pack ../test-3-${packname_3}.pack &&
|
2009-02-25 10:11:29 +03:00
|
|
|
test -f $GOP/pack-${packname_3}.idx &&
|
2013-10-26 23:17:14 +04:00
|
|
|
cmp $GOP/pack-${packname_3}.idx ../test-3-${packname_3}.idx &&
|
2009-02-25 10:11:29 +03:00
|
|
|
test -f $GOP/pack-${packname_3}.keep
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
2005-06-29 13:51:27 +04:00
|
|
|
test_expect_success \
|
|
|
|
'verify pack' \
|
2007-07-03 09:52:14 +04:00
|
|
|
'git verify-pack test-1-${packname_1}.idx \
|
2007-03-16 20:50:18 +03:00
|
|
|
test-2-${packname_2}.idx \
|
|
|
|
test-3-${packname_3}.idx'
|
2005-06-29 13:51:27 +04:00
|
|
|
|
2008-08-22 23:45:53 +04:00
|
|
|
test_expect_success \
|
|
|
|
'verify pack -v' \
|
|
|
|
'git verify-pack -v test-1-${packname_1}.idx \
|
|
|
|
test-2-${packname_2}.idx \
|
|
|
|
test-3-${packname_3}.idx'
|
|
|
|
|
2005-06-29 13:51:27 +04:00
|
|
|
test_expect_success \
|
2007-11-13 23:04:56 +03:00
|
|
|
'verify-pack catches mismatched .idx and .pack files' \
|
2007-04-23 05:59:34 +04:00
|
|
|
'cat test-1-${packname_1}.idx >test-3.idx &&
|
|
|
|
cat test-2-${packname_2}.pack >test-3.pack &&
|
2007-07-03 09:52:14 +04:00
|
|
|
if git verify-pack test-3.idx
|
2005-06-29 13:51:27 +04:00
|
|
|
then false
|
|
|
|
else :;
|
2007-11-13 23:04:56 +03:00
|
|
|
fi'
|
2005-06-29 13:51:27 +04:00
|
|
|
|
2007-11-13 23:04:56 +03:00
|
|
|
test_expect_success \
|
|
|
|
'verify-pack catches a corrupted pack signature' \
|
|
|
|
'cat test-1-${packname_1}.pack >test-3.pack &&
|
2008-11-17 11:21:30 +03:00
|
|
|
echo | dd of=test-3.pack count=1 bs=1 conv=notrunc seek=2 &&
|
2007-07-03 09:52:14 +04:00
|
|
|
if git verify-pack test-3.idx
|
2005-06-29 13:51:27 +04:00
|
|
|
then false
|
|
|
|
else :;
|
2007-11-13 23:04:56 +03:00
|
|
|
fi'
|
2005-06-29 13:51:27 +04:00
|
|
|
|
2007-11-13 23:04:56 +03:00
|
|
|
test_expect_success \
|
|
|
|
'verify-pack catches a corrupted pack version' \
|
|
|
|
'cat test-1-${packname_1}.pack >test-3.pack &&
|
2008-11-17 11:21:30 +03:00
|
|
|
echo | dd of=test-3.pack count=1 bs=1 conv=notrunc seek=7 &&
|
2007-07-03 09:52:14 +04:00
|
|
|
if git verify-pack test-3.idx
|
2005-06-29 13:51:27 +04:00
|
|
|
then false
|
|
|
|
else :;
|
2007-11-13 23:04:56 +03:00
|
|
|
fi'
|
2005-06-29 13:51:27 +04:00
|
|
|
|
2007-11-13 23:04:56 +03:00
|
|
|
test_expect_success \
|
|
|
|
'verify-pack catches a corrupted type/size of the 1st packed object data' \
|
|
|
|
'cat test-1-${packname_1}.pack >test-3.pack &&
|
2008-11-17 11:21:30 +03:00
|
|
|
echo | dd of=test-3.pack count=1 bs=1 conv=notrunc seek=12 &&
|
2007-07-03 09:52:14 +04:00
|
|
|
if git verify-pack test-3.idx
|
2005-06-29 13:51:27 +04:00
|
|
|
then false
|
|
|
|
else :;
|
2007-11-13 23:04:56 +03:00
|
|
|
fi'
|
2005-06-29 13:51:27 +04:00
|
|
|
|
2007-11-13 23:04:56 +03:00
|
|
|
test_expect_success \
|
|
|
|
'verify-pack catches a corrupted sum of the index file itself' \
|
2015-12-22 18:27:51 +03:00
|
|
|
'l=$(wc -c <test-3.idx) &&
|
|
|
|
l=$(expr $l - 20) &&
|
2007-04-23 05:59:34 +04:00
|
|
|
cat test-1-${packname_1}.pack >test-3.pack &&
|
2008-11-17 11:21:30 +03:00
|
|
|
printf "%20s" "" | dd of=test-3.idx count=20 bs=1 conv=notrunc seek=$l &&
|
2007-07-03 09:52:14 +04:00
|
|
|
if git verify-pack test-3.pack
|
2005-12-23 09:57:20 +03:00
|
|
|
then false
|
|
|
|
else :;
|
2007-11-13 23:04:56 +03:00
|
|
|
fi'
|
2005-06-29 13:51:27 +04:00
|
|
|
|
2005-10-12 23:01:31 +04:00
|
|
|
test_expect_success \
|
|
|
|
'build pack index for an existing pack' \
|
2007-04-23 05:59:34 +04:00
|
|
|
'cat test-1-${packname_1}.pack >test-3.pack &&
|
2008-09-03 12:59:29 +04:00
|
|
|
git index-pack -o tmp.idx test-3.pack &&
|
2005-10-12 23:01:31 +04:00
|
|
|
cmp tmp.idx test-1-${packname_1}.idx &&
|
|
|
|
|
2008-09-03 12:59:29 +04:00
|
|
|
git index-pack test-3.pack &&
|
2005-10-12 23:01:31 +04:00
|
|
|
cmp test-3.idx test-1-${packname_1}.idx &&
|
|
|
|
|
2007-04-23 05:59:34 +04:00
|
|
|
cat test-2-${packname_2}.pack >test-3.pack &&
|
2008-09-03 12:59:29 +04:00
|
|
|
git index-pack -o tmp.idx test-2-${packname_2}.pack &&
|
2005-10-12 23:01:31 +04:00
|
|
|
cmp tmp.idx test-2-${packname_2}.idx &&
|
|
|
|
|
2008-09-03 12:59:29 +04:00
|
|
|
git index-pack test-3.pack &&
|
2005-10-12 23:01:31 +04:00
|
|
|
cmp test-3.idx test-2-${packname_2}.idx &&
|
|
|
|
|
2007-04-23 05:59:34 +04:00
|
|
|
cat test-3-${packname_3}.pack >test-3.pack &&
|
2008-09-03 12:59:29 +04:00
|
|
|
git index-pack -o tmp.idx test-3-${packname_3}.pack &&
|
2007-03-16 20:50:18 +03:00
|
|
|
cmp tmp.idx test-3-${packname_3}.idx &&
|
|
|
|
|
2008-09-03 12:59:29 +04:00
|
|
|
git index-pack test-3.pack &&
|
2007-03-16 20:50:18 +03:00
|
|
|
cmp test-3.idx test-3-${packname_3}.idx &&
|
|
|
|
|
2016-03-03 21:52:53 +03:00
|
|
|
cat test-1-${packname_1}.pack >test-4.pack &&
|
|
|
|
rm -f test-4.keep &&
|
|
|
|
git index-pack --keep=why test-4.pack &&
|
|
|
|
cmp test-1-${packname_1}.idx test-4.idx &&
|
|
|
|
test -f test-4.keep &&
|
|
|
|
|
2005-10-12 23:01:31 +04:00
|
|
|
:'
|
|
|
|
|
2008-03-05 10:46:51 +03:00
|
|
|
test_expect_success 'unpacking with --strict' '
|
2008-03-05 11:14:32 +03:00
|
|
|
|
|
|
|
for j in a b c d e f g
|
|
|
|
do
|
|
|
|
for i in 0 1 2 3 4 5 6 7 8 9
|
|
|
|
do
|
|
|
|
o=$(echo $j$i | git hash-object -w --stdin) &&
|
|
|
|
echo "100644 $o 0 $j$i"
|
|
|
|
done
|
|
|
|
done >LIST &&
|
|
|
|
rm -f .git/index &&
|
|
|
|
git update-index --index-info <LIST &&
|
|
|
|
LIST=$(git write-tree) &&
|
|
|
|
rm -f .git/index &&
|
|
|
|
head -n 10 LIST | git update-index --index-info &&
|
|
|
|
LI=$(git write-tree) &&
|
|
|
|
rm -f .git/index &&
|
|
|
|
tail -n 10 LIST | git update-index --index-info &&
|
|
|
|
ST=$(git write-tree) &&
|
2018-03-27 20:31:37 +03:00
|
|
|
git rev-list --objects "$LIST" "$LI" "$ST" >actual &&
|
|
|
|
PACK5=$( git pack-objects test-5 <actual ) &&
|
2008-03-05 11:14:32 +03:00
|
|
|
PACK6=$( (
|
|
|
|
echo "$LIST"
|
|
|
|
echo "$LI"
|
|
|
|
echo "$ST"
|
|
|
|
) | git pack-objects test-6 ) &&
|
|
|
|
test_create_repo test-5 &&
|
|
|
|
(
|
|
|
|
cd test-5 &&
|
|
|
|
git unpack-objects --strict <../test-5-$PACK5.pack &&
|
|
|
|
git ls-tree -r $LIST &&
|
|
|
|
git ls-tree -r $LI &&
|
|
|
|
git ls-tree -r $ST
|
|
|
|
) &&
|
|
|
|
test_create_repo test-6 &&
|
|
|
|
(
|
|
|
|
# tree-only into empty repo -- many unreachables
|
|
|
|
cd test-6 &&
|
|
|
|
test_must_fail git unpack-objects --strict <../test-6-$PACK6.pack
|
|
|
|
) &&
|
|
|
|
(
|
|
|
|
# already populated -- no unreachables
|
|
|
|
cd test-5 &&
|
|
|
|
git unpack-objects --strict <../test-6-$PACK6.pack
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
2008-03-07 10:39:53 +03:00
|
|
|
test_expect_success 'index-pack with --strict' '
|
|
|
|
|
|
|
|
for j in a b c d e f g
|
|
|
|
do
|
|
|
|
for i in 0 1 2 3 4 5 6 7 8 9
|
|
|
|
do
|
|
|
|
o=$(echo $j$i | git hash-object -w --stdin) &&
|
|
|
|
echo "100644 $o 0 $j$i"
|
|
|
|
done
|
|
|
|
done >LIST &&
|
|
|
|
rm -f .git/index &&
|
|
|
|
git update-index --index-info <LIST &&
|
|
|
|
LIST=$(git write-tree) &&
|
|
|
|
rm -f .git/index &&
|
|
|
|
head -n 10 LIST | git update-index --index-info &&
|
|
|
|
LI=$(git write-tree) &&
|
|
|
|
rm -f .git/index &&
|
|
|
|
tail -n 10 LIST | git update-index --index-info &&
|
|
|
|
ST=$(git write-tree) &&
|
2018-03-27 20:31:37 +03:00
|
|
|
git rev-list --objects "$LIST" "$LI" "$ST" >actual &&
|
|
|
|
PACK5=$( git pack-objects test-5 <actual ) &&
|
2008-03-07 10:39:53 +03:00
|
|
|
PACK6=$( (
|
|
|
|
echo "$LIST"
|
|
|
|
echo "$LI"
|
|
|
|
echo "$ST"
|
|
|
|
) | git pack-objects test-6 ) &&
|
|
|
|
test_create_repo test-7 &&
|
|
|
|
(
|
|
|
|
cd test-7 &&
|
|
|
|
git index-pack --strict --stdin <../test-5-$PACK5.pack &&
|
|
|
|
git ls-tree -r $LIST &&
|
|
|
|
git ls-tree -r $LI &&
|
|
|
|
git ls-tree -r $ST
|
|
|
|
) &&
|
|
|
|
test_create_repo test-8 &&
|
|
|
|
(
|
|
|
|
# tree-only into empty repo -- many unreachables
|
|
|
|
cd test-8 &&
|
|
|
|
test_must_fail git index-pack --strict --stdin <../test-6-$PACK6.pack
|
|
|
|
) &&
|
|
|
|
(
|
|
|
|
# already populated -- no unreachables
|
|
|
|
cd test-7 &&
|
|
|
|
git index-pack --strict --stdin <../test-6-$PACK6.pack
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
2010-02-04 06:48:26 +03:00
|
|
|
test_expect_success 'honor pack.packSizeLimit' '
|
2010-02-04 06:48:28 +03:00
|
|
|
git config pack.packSizeLimit 3m &&
|
2010-02-04 06:48:26 +03:00
|
|
|
packname_10=$(git pack-objects test-10 <obj-list) &&
|
2010-02-04 06:48:28 +03:00
|
|
|
test 2 = $(ls test-10-*.pack | wc -l)
|
2010-02-04 06:48:26 +03:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'verify resulting packs' '
|
|
|
|
git verify-pack test-10-*.pack
|
|
|
|
'
|
|
|
|
|
2010-02-04 06:48:28 +03:00
|
|
|
test_expect_success 'tolerate packsizelimit smaller than biggest object' '
|
|
|
|
git config pack.packSizeLimit 1 &&
|
2010-02-04 06:48:26 +03:00
|
|
|
packname_11=$(git pack-objects test-11 <obj-list) &&
|
2010-02-08 18:39:01 +03:00
|
|
|
test 5 = $(ls test-11-*.pack | wc -l)
|
2008-11-12 21:23:58 +03:00
|
|
|
'
|
|
|
|
|
2010-02-04 06:48:26 +03:00
|
|
|
test_expect_success 'verify resulting packs' '
|
|
|
|
git verify-pack test-11-*.pack
|
|
|
|
'
|
|
|
|
|
2016-12-16 05:30:59 +03:00
|
|
|
test_expect_success 'set up pack for non-repo tests' '
|
|
|
|
# make sure we have a pack with no matching index file
|
|
|
|
cp test-1-*.pack foo.pack
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'index-pack --stdin complains of non-repo' '
|
2020-06-19 20:55:59 +03:00
|
|
|
nongit test_must_fail git index-pack --object-format=$(test_oid algo) --stdin <foo.pack &&
|
2016-12-16 05:30:59 +03:00
|
|
|
test_path_is_missing non-repo/.git
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'index-pack <pack> works in non-repo' '
|
2020-06-19 20:55:59 +03:00
|
|
|
nongit git index-pack --object-format=$(test_oid algo) ../foo.pack &&
|
2016-12-16 05:30:59 +03:00
|
|
|
test_path_is_file foo.idx
|
|
|
|
'
|
|
|
|
|
prepare_commit_graft: treat non-repository as a noop
The parse_commit_buffer() function consults lookup_commit_graft()
to see if we need to rewrite parents. The latter will look
at $GIT_DIR/info/grafts. If you're outside of a repository,
then this will trigger a BUG() as of b1ef400eec (setup_git_env:
avoid blind fall-back to ".git", 2016-10-20).
It's probably uncommon to actually parse a commit outside of
a repository, but you can see it in action with:
cd /not/a/git/repo
git index-pack --strict /some/file.pack
This works fine without --strict, but the fsck checks will
try to parse any commits, triggering the BUG(). We can fix
that by teaching the graft code to behave as if there are no
grafts when we aren't in a repository.
Arguably index-pack (and fsck) are wrong to consider grafts
at all. So another solution is to disable grafts entirely
for those commands. But given that the graft feature is
deprecated anyway, it's not worth even thinking through the
ramifications that might have.
There is one other corner case I considered here. What
should:
cd /not/a/git/repo
export GIT_GRAFT_FILE=/file/with/grafts
git index-pack --strict /some/file.pack
do? We don't have a repository, but the user has pointed us
directly at a graft file, which we could respect. I believe
this case did work that way prior to b1ef400eec. However,
fixing it now would be pretty invasive. Back then we would
just call into setup_git_env() even without a repository.
But these days it actually takes a git_dir argument. So
there would be a fair bit of refactoring of the setup code
involved.
Given the obscurity of this case, plus the fact that grafts
are deprecated and probably shouldn't work under index-pack
anyway, it's not worth pursuing further. This patch at least
un-breaks the common case where you're _not_ using grafts,
but we BUG() anyway trying to even find that out.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-06-01 01:42:53 +03:00
|
|
|
test_expect_success 'index-pack --strict <pack> works in non-repo' '
|
|
|
|
rm -f foo.idx &&
|
2020-06-19 20:55:59 +03:00
|
|
|
nongit git index-pack --strict --object-format=$(test_oid algo) ../foo.pack &&
|
prepare_commit_graft: treat non-repository as a noop
The parse_commit_buffer() function consults lookup_commit_graft()
to see if we need to rewrite parents. The latter will look
at $GIT_DIR/info/grafts. If you're outside of a repository,
then this will trigger a BUG() as of b1ef400eec (setup_git_env:
avoid blind fall-back to ".git", 2016-10-20).
It's probably uncommon to actually parse a commit outside of
a repository, but you can see it in action with:
cd /not/a/git/repo
git index-pack --strict /some/file.pack
This works fine without --strict, but the fsck checks will
try to parse any commits, triggering the BUG(). We can fix
that by teaching the graft code to behave as if there are no
grafts when we aren't in a repository.
Arguably index-pack (and fsck) are wrong to consider grafts
at all. So another solution is to disable grafts entirely
for those commands. But given that the graft feature is
deprecated anyway, it's not worth even thinking through the
ramifications that might have.
There is one other corner case I considered here. What
should:
cd /not/a/git/repo
export GIT_GRAFT_FILE=/file/with/grafts
git index-pack --strict /some/file.pack
do? We don't have a repository, but the user has pointed us
directly at a graft file, which we could respect. I believe
this case did work that way prior to b1ef400eec. However,
fixing it now would be pretty invasive. Back then we would
just call into setup_git_env() even without a repository.
But these days it actually takes a git_dir argument. So
there would be a fair bit of refactoring of the setup code
involved.
Given the obscurity of this case, plus the fact that grafts
are deprecated and probably shouldn't work under index-pack
anyway, it's not worth pursuing further. This patch at least
un-breaks the common case where you're _not_ using grafts,
but we BUG() anyway trying to even find that out.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-06-01 01:42:53 +03:00
|
|
|
test_path_is_file foo.idx
|
|
|
|
'
|
|
|
|
|
2021-03-18 01:47:03 +03:00
|
|
|
test_expect_success !PTHREADS,!FAIL_PREREQS \
|
|
|
|
'index-pack --threads=N or pack.threads=N warns when no pthreads' '
|
2017-05-25 22:45:32 +03:00
|
|
|
test_must_fail git index-pack --threads=2 2>err &&
|
|
|
|
grep ^warning: err >warnings &&
|
|
|
|
test_line_count = 1 warnings &&
|
|
|
|
grep -F "no threads support, ignoring --threads=2" err &&
|
|
|
|
|
|
|
|
test_must_fail git -c pack.threads=2 index-pack 2>err &&
|
|
|
|
grep ^warning: err >warnings &&
|
|
|
|
test_line_count = 1 warnings &&
|
|
|
|
grep -F "no threads support, ignoring pack.threads" err &&
|
|
|
|
|
|
|
|
test_must_fail git -c pack.threads=2 index-pack --threads=4 2>err &&
|
|
|
|
grep ^warning: err >warnings &&
|
|
|
|
test_line_count = 2 warnings &&
|
|
|
|
grep -F "no threads support, ignoring --threads=4" err &&
|
|
|
|
grep -F "no threads support, ignoring pack.threads" err
|
|
|
|
'
|
|
|
|
|
2021-03-18 01:47:03 +03:00
|
|
|
test_expect_success !PTHREADS,!FAIL_PREREQS \
|
|
|
|
'pack-objects --threads=N or pack.threads=N warns when no pthreads' '
|
2017-05-25 22:45:32 +03:00
|
|
|
git pack-objects --threads=2 --stdout --all </dev/null >/dev/null 2>err &&
|
|
|
|
grep ^warning: err >warnings &&
|
|
|
|
test_line_count = 1 warnings &&
|
|
|
|
grep -F "no threads support, ignoring --threads" err &&
|
|
|
|
|
|
|
|
git -c pack.threads=2 pack-objects --stdout --all </dev/null >/dev/null 2>err &&
|
|
|
|
grep ^warning: err >warnings &&
|
2017-05-25 22:45:33 +03:00
|
|
|
test_line_count = 1 warnings &&
|
2017-05-25 22:45:32 +03:00
|
|
|
grep -F "no threads support, ignoring pack.threads" err &&
|
|
|
|
|
|
|
|
git -c pack.threads=2 pack-objects --threads=4 --stdout --all </dev/null >/dev/null 2>err &&
|
|
|
|
grep ^warning: err >warnings &&
|
|
|
|
test_line_count = 2 warnings &&
|
|
|
|
grep -F "no threads support, ignoring --threads" err &&
|
|
|
|
grep -F "no threads support, ignoring pack.threads" err
|
|
|
|
'
|
|
|
|
|
2018-04-14 18:35:05 +03:00
|
|
|
test_expect_success 'pack-objects in too-many-packs mode' '
|
|
|
|
GIT_TEST_FULL_IN_PACK_ARRAY=1 git repack -ad &&
|
|
|
|
git fsck
|
|
|
|
'
|
|
|
|
|
2018-10-30 21:43:30 +03:00
|
|
|
test_expect_success 'setup: fake a SHA1 hash collision' '
|
|
|
|
git init corrupt &&
|
|
|
|
(
|
|
|
|
cd corrupt &&
|
|
|
|
long_a=$(git hash-object -w ../a | sed -e "s!^..!&/!") &&
|
|
|
|
long_b=$(git hash-object -w ../b | sed -e "s!^..!&/!") &&
|
|
|
|
test -f .git/objects/$long_b &&
|
|
|
|
cp -f .git/objects/$long_a \
|
|
|
|
.git/objects/$long_b
|
|
|
|
)
|
2018-10-30 21:43:29 +03:00
|
|
|
'
|
2010-02-04 06:48:26 +03:00
|
|
|
|
2018-10-30 21:43:29 +03:00
|
|
|
test_expect_success 'make sure index-pack detects the SHA1 collision' '
|
2018-10-30 21:43:30 +03:00
|
|
|
(
|
|
|
|
cd corrupt &&
|
|
|
|
test_must_fail git index-pack -o ../bad.idx ../test-3.pack 2>msg &&
|
|
|
|
test_i18ngrep "SHA1 COLLISION FOUND" msg
|
|
|
|
)
|
2018-10-30 21:43:29 +03:00
|
|
|
'
|
2010-02-04 06:48:26 +03:00
|
|
|
|
2018-10-30 21:43:29 +03:00
|
|
|
test_expect_success 'make sure index-pack detects the SHA1 collision (large blobs)' '
|
2018-10-30 21:43:30 +03:00
|
|
|
(
|
|
|
|
cd corrupt &&
|
|
|
|
test_must_fail git -c core.bigfilethreshold=1 index-pack -o ../bad.idx ../test-3.pack 2>msg &&
|
|
|
|
test_i18ngrep "SHA1 COLLISION FOUND" msg
|
|
|
|
)
|
2018-10-30 21:43:29 +03:00
|
|
|
'
|
2012-05-24 17:55:44 +04:00
|
|
|
|
2020-07-21 03:21:44 +03:00
|
|
|
test_expect_success 'prefetch objects' '
|
|
|
|
rm -rf server client &&
|
|
|
|
|
|
|
|
git init server &&
|
|
|
|
test_config -C server uploadpack.allowanysha1inwant 1 &&
|
|
|
|
test_config -C server uploadpack.allowfilter 1 &&
|
|
|
|
test_config -C server protocol.version 2 &&
|
|
|
|
|
|
|
|
echo one >server/one &&
|
|
|
|
git -C server add one &&
|
|
|
|
git -C server commit -m one &&
|
|
|
|
git -C server branch one_branch &&
|
|
|
|
|
|
|
|
echo two_a >server/two_a &&
|
|
|
|
echo two_b >server/two_b &&
|
|
|
|
git -C server add two_a two_b &&
|
|
|
|
git -C server commit -m two &&
|
|
|
|
|
|
|
|
echo three >server/three &&
|
|
|
|
git -C server add three &&
|
|
|
|
git -C server commit -m three &&
|
|
|
|
git -C server branch three_branch &&
|
|
|
|
|
|
|
|
# Clone, fetch "two" with blobs excluded, and re-push it. This requires
|
|
|
|
# the client to have the blobs of "two" - verify that these are
|
|
|
|
# prefetched in one batch.
|
|
|
|
git clone --filter=blob:none --single-branch -b one_branch \
|
|
|
|
"file://$(pwd)/server" client &&
|
|
|
|
test_config -C client protocol.version 2 &&
|
|
|
|
TWO=$(git -C server rev-parse three_branch^) &&
|
|
|
|
git -C client fetch --filter=blob:none origin "$TWO" &&
|
|
|
|
GIT_TRACE_PACKET=$(pwd)/trace git -C client push origin "$TWO":refs/heads/two_branch &&
|
2020-08-18 07:01:36 +03:00
|
|
|
grep "fetch> done" trace >donelines &&
|
2020-07-21 03:21:44 +03:00
|
|
|
test_line_count = 1 donelines
|
|
|
|
'
|
|
|
|
|
builtin/pack-objects.c: add '--stdin-packs' option
In an upcoming commit, 'git repack' will want to create a pack comprised
of all of the objects in some packs (the included packs) excluding any
objects in some other packs (the excluded packs).
This caller could iterate those packs themselves and feed the objects it
finds to 'git pack-objects' directly over stdin, but this approach has a
few downsides:
- It requires every caller that wants to drive 'git pack-objects' in
this way to implement pack iteration themselves. This forces the
caller to think about details like what order objects are fed to
pack-objects, which callers would likely rather not do.
- If the set of objects in included packs is large, it requires
sending a lot of data over a pipe, which is inefficient.
- The caller is forced to keep track of the excluded objects, too, and
make sure that it doesn't send any objects that appear in both
included and excluded packs.
But the biggest downside is the lack of a reachability traversal.
Because the caller passes in a list of objects directly, those objects
don't get a namehash assigned to them, which can have a negative impact
on the delta selection process, causing 'git pack-objects' to fail to
find good deltas even when they exist.
The caller could formulate a reachability traversal themselves, but the
only way to drive 'git pack-objects' in this way is to do a full
traversal, and then remove objects in the excluded packs after the
traversal is complete. This can be detrimental to callers who care
about performance, especially in repositories with many objects.
Introduce 'git pack-objects --stdin-packs' which remedies these four
concerns.
'git pack-objects --stdin-packs' expects a list of pack names on stdin,
where 'pack-xyz.pack' denotes that pack as included, and
'^pack-xyz.pack' denotes it as excluded. The resulting pack includes all
objects that are present in at least one included pack, and aren't
present in any excluded pack.
To address the delta selection problem, 'git pack-objects --stdin-packs'
works as follows. First, it assembles a list of objects that it is going
to pack, as above. Then, a reachability traversal is started, whose tips
are any commits mentioned in included packs. Upon visiting an object, we
find its corresponding object_entry in the to_pack list, and set its
namehash parameter appropriately.
To avoid the traversal visiting more objects than it needs to, the
traversal is halted upon encountering an object which can be found in an
excluded pack (by marking the excluded packs as kept in-core, and
passing --no-kept-objects=in-core to the revision machinery).
This can cause the traversal to halt early, for example if an object in
an included pack is an ancestor of ones in excluded packs. But stopping
early is OK, since filling in the namehash fields of objects in the
to_pack list is only additive (i.e., having it helps the delta selection
process, but leaving it blank doesn't impact the correctness of the
resulting pack).
Even still, it is unlikely that this hurts us much in practice, since
the 'git repack --geometric' caller (which is introduced in a later
commit) marks small packs as included, and large ones as excluded.
During ordinary use, the small packs usually represent pushes after a
large repack, and so are unlikely to be ancestors of objects that
already exist in the repository.
(I found it convenient while developing this patch to have 'git
pack-objects' report the number of objects which were visited and got
their namehash fields filled in during traversal. This is also included
in the below patch via trace2 data lines).
Suggested-by: Jeff King <peff@peff.net>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
Reviewed-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-02-23 05:25:10 +03:00
|
|
|
test_expect_success 'setup for --stdin-packs tests' '
|
|
|
|
git init stdin-packs &&
|
|
|
|
(
|
|
|
|
cd stdin-packs &&
|
|
|
|
|
|
|
|
test_commit A &&
|
|
|
|
test_commit B &&
|
|
|
|
test_commit C &&
|
|
|
|
|
|
|
|
for id in A B C
|
|
|
|
do
|
|
|
|
git pack-objects .git/objects/pack/pack-$id \
|
|
|
|
--incremental --revs <<-EOF
|
|
|
|
refs/tags/$id
|
|
|
|
EOF
|
|
|
|
done &&
|
|
|
|
|
|
|
|
ls -la .git/objects/pack
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--stdin-packs with excluded packs' '
|
|
|
|
(
|
|
|
|
cd stdin-packs &&
|
|
|
|
|
|
|
|
PACK_A="$(basename .git/objects/pack/pack-A-*.pack)" &&
|
|
|
|
PACK_B="$(basename .git/objects/pack/pack-B-*.pack)" &&
|
|
|
|
PACK_C="$(basename .git/objects/pack/pack-C-*.pack)" &&
|
|
|
|
|
|
|
|
git pack-objects test --stdin-packs <<-EOF &&
|
|
|
|
$PACK_A
|
|
|
|
^$PACK_B
|
|
|
|
$PACK_C
|
|
|
|
EOF
|
|
|
|
|
|
|
|
(
|
|
|
|
git show-index <$(ls .git/objects/pack/pack-A-*.idx) &&
|
|
|
|
git show-index <$(ls .git/objects/pack/pack-C-*.idx)
|
|
|
|
) >expect.raw &&
|
|
|
|
git show-index <$(ls test-*.idx) >actual.raw &&
|
|
|
|
|
|
|
|
cut -d" " -f2 <expect.raw | sort >expect &&
|
|
|
|
cut -d" " -f2 <actual.raw | sort >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--stdin-packs is incompatible with --filter' '
|
|
|
|
(
|
|
|
|
cd stdin-packs &&
|
|
|
|
test_must_fail git pack-objects --stdin-packs --stdout \
|
|
|
|
--filter=blob:none </dev/null 2>err &&
|
|
|
|
test_i18ngrep "cannot use --filter with --stdin-packs" err
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--stdin-packs is incompatible with --revs' '
|
|
|
|
(
|
|
|
|
cd stdin-packs &&
|
|
|
|
test_must_fail git pack-objects --stdin-packs --revs out \
|
|
|
|
</dev/null 2>err &&
|
|
|
|
test_i18ngrep "cannot use internal rev list with --stdin-packs" err
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--stdin-packs with loose objects' '
|
|
|
|
(
|
|
|
|
cd stdin-packs &&
|
|
|
|
|
|
|
|
PACK_A="$(basename .git/objects/pack/pack-A-*.pack)" &&
|
|
|
|
PACK_B="$(basename .git/objects/pack/pack-B-*.pack)" &&
|
|
|
|
PACK_C="$(basename .git/objects/pack/pack-C-*.pack)" &&
|
|
|
|
|
|
|
|
test_commit D && # loose
|
|
|
|
|
|
|
|
git pack-objects test2 --stdin-packs --unpacked <<-EOF &&
|
|
|
|
$PACK_A
|
|
|
|
^$PACK_B
|
|
|
|
$PACK_C
|
|
|
|
EOF
|
|
|
|
|
|
|
|
(
|
|
|
|
git show-index <$(ls .git/objects/pack/pack-A-*.idx) &&
|
|
|
|
git show-index <$(ls .git/objects/pack/pack-C-*.idx) &&
|
|
|
|
git rev-list --objects --no-object-names \
|
|
|
|
refs/tags/C..refs/tags/D
|
|
|
|
|
|
|
|
) >expect.raw &&
|
|
|
|
ls -la . &&
|
|
|
|
git show-index <$(ls test2-*.idx) >actual.raw &&
|
|
|
|
|
|
|
|
cut -d" " -f2 <expect.raw | sort >expect &&
|
|
|
|
cut -d" " -f2 <actual.raw | sort >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
2021-03-19 18:40:52 +03:00
|
|
|
test_expect_success '--stdin-packs with broken links' '
|
|
|
|
(
|
|
|
|
cd stdin-packs &&
|
|
|
|
|
|
|
|
# make an unreachable object with a bogus parent
|
|
|
|
git cat-file -p HEAD >commit &&
|
|
|
|
sed "s/$(git rev-parse HEAD^)/$(test_oid zero)/" <commit |
|
|
|
|
git hash-object -w -t commit --stdin >in &&
|
|
|
|
|
|
|
|
git pack-objects .git/objects/pack/pack-D <in &&
|
|
|
|
|
|
|
|
PACK_A="$(basename .git/objects/pack/pack-A-*.pack)" &&
|
|
|
|
PACK_B="$(basename .git/objects/pack/pack-B-*.pack)" &&
|
|
|
|
PACK_C="$(basename .git/objects/pack/pack-C-*.pack)" &&
|
|
|
|
PACK_D="$(basename .git/objects/pack/pack-D-*.pack)" &&
|
|
|
|
|
|
|
|
git pack-objects test3 --stdin-packs --unpacked <<-EOF &&
|
|
|
|
$PACK_A
|
|
|
|
^$PACK_B
|
|
|
|
$PACK_C
|
|
|
|
$PACK_D
|
|
|
|
EOF
|
|
|
|
|
|
|
|
(
|
|
|
|
git show-index <$(ls .git/objects/pack/pack-A-*.idx) &&
|
|
|
|
git show-index <$(ls .git/objects/pack/pack-C-*.idx) &&
|
|
|
|
git show-index <$(ls .git/objects/pack/pack-D-*.idx) &&
|
|
|
|
git rev-list --objects --no-object-names \
|
|
|
|
refs/tags/C..refs/tags/D
|
|
|
|
) >expect.raw &&
|
|
|
|
git show-index <$(ls test3-*.idx) >actual.raw &&
|
|
|
|
|
|
|
|
cut -d" " -f2 <expect.raw | sort >expect &&
|
|
|
|
cut -d" " -f2 <actual.raw | sort >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
2005-06-26 15:29:18 +04:00
|
|
|
test_done
|