Merge branch 'ab/pack-stdin-packs-fix'
Input validation of "git pack-objects --stdin-packs" has been corrected. * ab/pack-stdin-packs-fix: pack-objects: fix segfault in --stdin-packs option pack-objects tests: cover blindspots in stdin handling
This commit is contained in:
commit
5c933f0155
@ -3311,9 +3311,26 @@ static void read_packs_list_from_stdin(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First handle all of the excluded packs, marking them as kept in-core
|
* Arguments we got on stdin may not even be packs. First
|
||||||
* so that later calls to add_object_entry() discards any objects that
|
* check that to avoid segfaulting later on in
|
||||||
* are also found in excluded packs.
|
* e.g. pack_mtime_cmp(), excluded packs are handled below.
|
||||||
|
*
|
||||||
|
* Since we first parsed our STDIN and then sorted the input
|
||||||
|
* lines the pack we error on will be whatever line happens to
|
||||||
|
* sort first. This is lazy, it's enough that we report one
|
||||||
|
* bad case here, we don't need to report the first/last one,
|
||||||
|
* or all of them.
|
||||||
|
*/
|
||||||
|
for_each_string_list_item(item, &include_packs) {
|
||||||
|
struct packed_git *p = item->util;
|
||||||
|
if (!p)
|
||||||
|
die(_("could not find pack '%s'"), item->string);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Then, handle all of the excluded packs, marking them as
|
||||||
|
* kept in-core so that later calls to add_object_entry()
|
||||||
|
* discards any objects that are also found in excluded packs.
|
||||||
*/
|
*/
|
||||||
for_each_string_list_item(item, &exclude_packs) {
|
for_each_string_list_item(item, &exclude_packs) {
|
||||||
struct packed_git *p = item->util;
|
struct packed_git *p = item->util;
|
||||||
|
@ -34,6 +34,110 @@ test_expect_success 'setup' '
|
|||||||
} >expect
|
} >expect
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'setup pack-object <stdin' '
|
||||||
|
git init pack-object-stdin &&
|
||||||
|
test_commit -C pack-object-stdin one &&
|
||||||
|
test_commit -C pack-object-stdin two
|
||||||
|
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'pack-object <stdin parsing: basic [|--revs]' '
|
||||||
|
cat >in <<-EOF &&
|
||||||
|
$(git -C pack-object-stdin rev-parse one)
|
||||||
|
EOF
|
||||||
|
|
||||||
|
git -C pack-object-stdin pack-objects basic-stdin <in &&
|
||||||
|
idx=$(echo pack-object-stdin/basic-stdin-*.idx) &&
|
||||||
|
git show-index <"$idx" >actual &&
|
||||||
|
test_line_count = 1 actual &&
|
||||||
|
|
||||||
|
git -C pack-object-stdin pack-objects --revs basic-stdin-revs <in &&
|
||||||
|
idx=$(echo pack-object-stdin/basic-stdin-revs-*.idx) &&
|
||||||
|
git show-index <"$idx" >actual &&
|
||||||
|
test_line_count = 3 actual
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'pack-object <stdin parsing: [|--revs] bad line' '
|
||||||
|
cat >in <<-EOF &&
|
||||||
|
$(git -C pack-object-stdin rev-parse one)
|
||||||
|
garbage
|
||||||
|
$(git -C pack-object-stdin rev-parse two)
|
||||||
|
EOF
|
||||||
|
|
||||||
|
sed "s/^> //g" >err.expect <<-EOF &&
|
||||||
|
fatal: expected object ID, got garbage:
|
||||||
|
> garbage
|
||||||
|
|
||||||
|
EOF
|
||||||
|
test_must_fail git -C pack-object-stdin pack-objects bad-line-stdin <in 2>err.actual &&
|
||||||
|
test_cmp err.expect err.actual &&
|
||||||
|
|
||||||
|
cat >err.expect <<-EOF &&
|
||||||
|
fatal: bad revision '"'"'garbage'"'"'
|
||||||
|
EOF
|
||||||
|
test_must_fail git -C pack-object-stdin pack-objects --revs bad-line-stdin-revs <in 2>err.actual &&
|
||||||
|
test_cmp err.expect err.actual
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'pack-object <stdin parsing: [|--revs] empty line' '
|
||||||
|
cat >in <<-EOF &&
|
||||||
|
$(git -C pack-object-stdin rev-parse one)
|
||||||
|
|
||||||
|
$(git -C pack-object-stdin rev-parse two)
|
||||||
|
EOF
|
||||||
|
|
||||||
|
sed -e "s/^> //g" -e "s/Z$//g" >err.expect <<-EOF &&
|
||||||
|
fatal: expected object ID, got garbage:
|
||||||
|
> Z
|
||||||
|
|
||||||
|
EOF
|
||||||
|
test_must_fail git -C pack-object-stdin pack-objects empty-line-stdin <in 2>err.actual &&
|
||||||
|
test_cmp err.expect err.actual &&
|
||||||
|
|
||||||
|
git -C pack-object-stdin pack-objects --revs empty-line-stdin-revs <in &&
|
||||||
|
idx=$(echo pack-object-stdin/empty-line-stdin-revs-*.idx) &&
|
||||||
|
git show-index <"$idx" >actual &&
|
||||||
|
test_line_count = 3 actual
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'pack-object <stdin parsing: [|--revs] with --stdin' '
|
||||||
|
cat >in <<-EOF &&
|
||||||
|
$(git -C pack-object-stdin rev-parse one)
|
||||||
|
$(git -C pack-object-stdin rev-parse two)
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# There is the "--stdin-packs is incompatible with --revs"
|
||||||
|
# test below, but we should make sure that the revision.c
|
||||||
|
# --stdin is not picked up
|
||||||
|
cat >err.expect <<-EOF &&
|
||||||
|
fatal: disallowed abbreviated or ambiguous option '"'"'stdin'"'"'
|
||||||
|
EOF
|
||||||
|
test_must_fail git -C pack-object-stdin pack-objects stdin-with-stdin-option --stdin <in 2>err.actual &&
|
||||||
|
test_cmp err.expect err.actual &&
|
||||||
|
|
||||||
|
test_must_fail git -C pack-object-stdin pack-objects --stdin --revs stdin-with-stdin-option-revs 2>err.actual <in &&
|
||||||
|
test_cmp err.expect err.actual
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'pack-object <stdin parsing: --stdin-packs handles garbage' '
|
||||||
|
cat >in <<-EOF &&
|
||||||
|
$(git -C pack-object-stdin rev-parse one)
|
||||||
|
$(git -C pack-object-stdin rev-parse two)
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# That we get "two" and not "one" has to do with OID
|
||||||
|
# ordering. It happens to be the same here under SHA-1 and
|
||||||
|
# SHA-256. See commentary in pack-objects.c
|
||||||
|
cat >err.expect <<-EOF &&
|
||||||
|
fatal: could not find pack '"'"'$(git -C pack-object-stdin rev-parse two)'"'"'
|
||||||
|
EOF
|
||||||
|
test_must_fail git \
|
||||||
|
-C pack-object-stdin \
|
||||||
|
pack-objects stdin-with-stdin-option --stdin-packs \
|
||||||
|
<in 2>err.actual &&
|
||||||
|
test_cmp err.expect err.actual
|
||||||
|
'
|
||||||
|
|
||||||
# usage: check_deltas <stderr_from_pack_objects> <cmp_op> <nr_deltas>
|
# usage: check_deltas <stderr_from_pack_objects> <cmp_op> <nr_deltas>
|
||||||
# e.g.: check_deltas stderr -gt 0
|
# e.g.: check_deltas stderr -gt 0
|
||||||
check_deltas() {
|
check_deltas() {
|
||||||
|
Loading…
Reference in New Issue
Block a user