Skip to content

Commit

Permalink
pack-objects: add GIT_TEST_NAME_HASH_VERSION
Browse files Browse the repository at this point in the history
Add a new environment variable to opt-in to different values of the
--name-hash-version=<n> option in 'git pack-objects'. This allows for
extra testing of the feature without repeating all of the test
scenarios. Unlike many GIT_TEST_* variables, we are choosing to not add
this to the linux-TEST-vars CI build as that test run is already
overloaded. The behavior exposed by this test variable is of low risk
and should be sufficient to allow manual testing when an issue arises.

But this option isn't free. There are a few tests that change behavior
with the variable enabled.

First, there are a few tests that are very sensitive to certain delta
bases being picked. These are both involving the generation of thin
bundles and then counting their objects via 'git index-pack --fix-thin'
which pulls the delta base into the new packfile. For these tests,
disable the option as a decent long-term option.

Second, there are some tests that compare the exact output of a 'git
pack-objects' process when using bitmaps. The warning that ignores the
--name-hash-version=2 and forces version 1 causes these tests to fail.
Disable the environment variable to get around this issue.

Signed-off-by: Derrick Stolee <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
derrickstolee authored and gitster committed Jan 27, 2025
1 parent 928ef41 commit ce96113
Show file tree
Hide file tree
Showing 9 changed files with 41 additions and 10 deletions.
5 changes: 4 additions & 1 deletion builtin/pack-objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@ struct configured_exclusion {
static struct oidmap configured_exclusions;

static struct oidset excluded_by_config;
static int name_hash_version = 1;
static int name_hash_version = -1;

/**
* Check whether the name_hash_version chosen by user input is appropriate,
Expand Down Expand Up @@ -4616,6 +4616,9 @@ int cmd_pack_objects(int argc,
if (pack_to_stdout || !rev_list_all)
write_bitmap_index = 0;

if (name_hash_version < 0)
name_hash_version = (int)git_env_ulong("GIT_TEST_NAME_HASH_VERSION", 1);

validate_name_hash_version();

if (use_delta_islands)
Expand Down
4 changes: 4 additions & 0 deletions t/README
Original file line number Diff line number Diff line change
Expand Up @@ -492,6 +492,10 @@ a test and then fails then the whole test run will abort. This can help to make
sure the expected tests are executed and not silently skipped when their
dependency breaks or is simply not present in a new environment.

GIT_TEST_NAME_HASH_VERSION=<int>, when set, causes 'git pack-objects' to
assume '--name-hash-version=<n>'.


Naming Tests
------------

Expand Down
7 changes: 5 additions & 2 deletions t/t5300-pack-object.sh
Original file line number Diff line number Diff line change
Expand Up @@ -675,15 +675,18 @@ do
done

test_expect_success 'valid and invalid --name-hash-versions' '
sane_unset GIT_TEST_NAME_HASH_VERSION &&
# Valid values are hard to verify other than "do not fail".
# Performance tests will be more valuable to validate these versions.
for value in 1 2
# Negative values are converted to version 1.
for value in -1 1 2
do
git pack-objects base --all --name-hash-version=$value || return 1
done &&
# Invalid values have clear post-conditions.
for value in -1 0 3
for value in 0 3
do
test_must_fail git pack-objects base --all --name-hash-version=$value 2>err &&
test_grep "invalid --name-hash-version option" err || return 1
Expand Down
5 changes: 4 additions & 1 deletion t/t5310-pack-bitmaps.sh
Original file line number Diff line number Diff line change
Expand Up @@ -420,7 +420,10 @@ test_bitmap_cases () {
cat >expect <<-\EOF &&
error: missing value for '\''pack.preferbitmaptips'\''
EOF
git repack -adb 2>actual &&
# Disable name hash version adjustment due to stderr comparison.
GIT_TEST_NAME_HASH_VERSION=1 \
git repack -adb 2>actual &&
test_cmp expect actual
)
'
Expand Down
3 changes: 2 additions & 1 deletion t/t5333-pseudo-merge-bitmaps.sh
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,8 @@ test_expect_success 'bitmapPseudoMerge.stableThreshold creates stable groups' '
'

test_expect_success 'out of order thresholds are rejected' '
test_must_fail git \
# Disable the test var to remove a stderr message.
test_must_fail env GIT_TEST_NAME_HASH_VERSION=1 git \
-c bitmapPseudoMerge.test.pattern="refs/*" \
-c bitmapPseudoMerge.test.threshold=1.month.ago \
-c bitmapPseudoMerge.test.stableThreshold=1.week.ago \
Expand Down
7 changes: 6 additions & 1 deletion t/t5510-fetch.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1062,7 +1062,12 @@ test_expect_success 'all boundary commits are excluded' '
test_tick &&
git merge otherside &&
ad=$(git log --no-walk --format=%ad HEAD) &&
git bundle create twoside-boundary.bdl main --since="$ad" &&
# If the a different name hash function is used here, then no delta
# pair is found and the bundle does not expand to three objects
# when fixing the thin object.
GIT_TEST_NAME_HASH_VERSION=1 \
git bundle create twoside-boundary.bdl main --since="$ad" &&
test_bundle_object_count --thin twoside-boundary.bdl 3
'

Expand Down
6 changes: 5 additions & 1 deletion t/t6020-bundle-misc.sh
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,11 @@ test_expect_success 'create bundle with --since option' '
EOF
test_cmp expect actual &&
git bundle create since.bdl \
# If a different name hash function is used, then one fewer
# delta base is found and this counts a different number
# of objects after performing --fix-thin.
GIT_TEST_NAME_HASH_VERSION=1 \
git bundle create since.bdl \
--since "Thu Apr 7 15:27:00 2005 -0700" \
--all &&
Expand Down
4 changes: 3 additions & 1 deletion t/t7406-submodule-update.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1094,7 +1094,9 @@ test_expect_success 'submodule update --quiet passes quietness to fetch with a s
) &&
git clone super4 super5 &&
(cd super5 &&
git submodule update --quiet --init --depth=1 submodule3 >out 2>err &&
# This test var can mess with the stderr output checked in this test.
GIT_TEST_NAME_HASH_VERSION=1 \
git submodule update --quiet --init --depth=1 submodule3 >out 2>err &&
test_must_be_empty out &&
test_must_be_empty err
) &&
Expand Down
10 changes: 8 additions & 2 deletions t/t7700-repack.sh
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,10 @@ test_expect_success 'no bitmaps created if .keep files present' '
keep=${pack%.pack}.keep &&
test_when_finished "rm -f \"\$keep\"" &&
>"$keep" &&
git -C bare.git repack -ad 2>stderr &&
# Disable --name-hash-version test due to stderr comparison.
GIT_TEST_NAME_HASH_VERSION=1 \
git -C bare.git repack -ad 2>stderr &&
test_must_be_empty stderr &&
find bare.git/objects/pack/ -type f -name "*.bitmap" >actual &&
test_must_be_empty actual
Expand All @@ -320,7 +323,10 @@ test_expect_success 'auto-bitmaps do not complain if unavailable' '
blob=$(test-tool genrandom big $((1024*1024)) |
git -C bare.git hash-object -w --stdin) &&
git -C bare.git update-ref refs/tags/big $blob &&
git -C bare.git repack -ad 2>stderr &&
# Disable --name-hash-version test due to stderr comparison.
GIT_TEST_NAME_HASH_VERSION=1 \
git -C bare.git repack -ad 2>stderr &&
test_must_be_empty stderr &&
find bare.git/objects/pack -type f -name "*.bitmap" >actual &&
test_must_be_empty actual
Expand Down

0 comments on commit ce96113

Please sign in to comment.