commit-graph: fix bug around octopus merges
[gitweb.git] / t / t1700-split-index.sh
index b3b4d83eafc4a031618a3a89fd8ca50353f1a844..12a556884427b87e8f3d6784ba638a446f6bf7c2 100755 (executable)
@@ -6,21 +6,52 @@ test_description='split index mode tests'
 
 # We need total control of index splitting here
 sane_unset GIT_TEST_SPLIT_INDEX
-sane_unset GIT_FSMONITOR_TEST
+
+# Testing a hard coded SHA against an index with an extension
+# that can vary from run to run is problematic so we disable
+# those extensions.
+sane_unset GIT_TEST_FSMONITOR
+sane_unset GIT_TEST_INDEX_THREADS
+
+# Create a file named as $1 with content read from stdin.
+# Set the file's mtime to a few seconds in the past to avoid racy situations.
+create_non_racy_file () {
+       cat >"$1" &&
+       test-tool chmtime =-5 "$1"
+}
+
+test_expect_success 'setup' '
+       test_oid_cache <<-EOF
+       own_v3 sha1:8299b0bcd1ac364e5f1d7768efb62fa2da79a339
+       own_v3 sha256:38a6d2925e3eceec33ad7b34cbff4e0086caa0daf28f31e51f5bd94b4a7af86b
+
+       base_v3 sha1:39d890139ee5356c7ef572216cebcd27aa41f9df
+       base_v3 sha256:c9baeadf905112bf6c17aefbd7d02267afd70ded613c30cafed2d40cb506e1ed
+
+       own_v4 sha1:432ef4b63f32193984f339431fd50ca796493569
+       own_v4 sha256:6738ac6319c25b694afa7bcc313deb182d1a59b68bf7a47b4296de83478c0420
+
+       base_v4 sha1:508851a7f0dfa8691e9f69c7f055865389012491
+       base_v4 sha256:3177d4adfdd4b6904f7e921d91d715a471c0dde7cf6a4bba574927f02b699508
+       EOF
+'
 
 test_expect_success 'enable split index' '
        git config splitIndex.maxPercentChange 100 &&
        git update-index --split-index &&
        test-tool dump-split-index .git/index >actual &&
        indexversion=$(test-tool index-version <.git/index) &&
+
+       # NEEDSWORK: Stop hard-coding checksums.
        if test "$indexversion" = "4"
        then
-               own=432ef4b63f32193984f339431fd50ca796493569
-               base=508851a7f0dfa8691e9f69c7f055865389012491
+               own=$(test_oid own_v4)
+               base=$(test_oid base_v4)
        else
-               own=8299b0bcd1ac364e5f1d7768efb62fa2da79a339
-               base=39d890139ee5356c7ef572216cebcd27aa41f9df
+               own=$(test_oid own_v3)
+               base=$(test_oid base_v3)
        fi &&
+
        cat >expect <<-EOF &&
        own $own
        base $base
@@ -31,7 +62,7 @@ test_expect_success 'enable split index' '
 '
 
 test_expect_success 'add one file' '
-       : >one &&
+       create_non_racy_file one &&
        git update-index --add one &&
        git ls-files --stage >ls-files.actual &&
        cat >ls-files.expect <<-EOF &&
@@ -57,7 +88,7 @@ test_expect_success 'disable split index' '
        EOF
        test_cmp ls-files.expect ls-files.actual &&
 
-       BASE=$(test-tool dump-split-index .git/index | grep "^own" | sed "s/own/base/") &&
+       BASE=$(test-tool dump-split-index .git/index | sed -n "s/^own/base/p") &&
        test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
        cat >expect <<-EOF &&
        not a split index
@@ -83,18 +114,19 @@ test_expect_success 'enable split index again, "one" now belongs to base index"'
 '
 
 test_expect_success 'modify original file, base index untouched' '
-       echo modified >one &&
+       echo modified | create_non_racy_file one &&
+       file1_blob=$(git hash-object one) &&
        git update-index one &&
        git ls-files --stage >ls-files.actual &&
        cat >ls-files.expect <<-EOF &&
-       100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0       one
+       100644 $file1_blob 0    one
        EOF
        test_cmp ls-files.expect ls-files.actual &&
 
        test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
        q_to_tab >expect <<-EOF &&
        $BASE
-       100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
+       100644 $file1_blob 0Q
        replacements: 0
        deletions:
        EOF
@@ -102,11 +134,11 @@ test_expect_success 'modify original file, base index untouched' '
 '
 
 test_expect_success 'add another file, which stays index' '
-       : >two &&
+       create_non_racy_file two &&
        git update-index --add two &&
        git ls-files --stage >ls-files.actual &&
        cat >ls-files.expect <<-EOF &&
-       100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0       one
+       100644 $file1_blob 0    one
        100644 $EMPTY_BLOB 0    two
        EOF
        test_cmp ls-files.expect ls-files.actual &&
@@ -114,7 +146,7 @@ test_expect_success 'add another file, which stays index' '
        test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
        q_to_tab >expect <<-EOF &&
        $BASE
-       100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
+       100644 $file1_blob 0Q
        100644 $EMPTY_BLOB 0    two
        replacements: 0
        deletions:
@@ -126,14 +158,14 @@ test_expect_success 'remove file not in base index' '
        git update-index --force-remove two &&
        git ls-files --stage >ls-files.actual &&
        cat >ls-files.expect <<-EOF &&
-       100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0       one
+       100644 $file1_blob 0    one
        EOF
        test_cmp ls-files.expect ls-files.actual &&
 
        test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
        q_to_tab >expect <<-EOF &&
        $BASE
-       100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
+       100644 $file1_blob 0Q
        replacements: 0
        deletions:
        EOF
@@ -155,7 +187,7 @@ test_expect_success 'remove file in base index' '
 '
 
 test_expect_success 'add original file back' '
-       : >one &&
+       create_non_racy_file one &&
        git update-index --add one &&
        git ls-files --stage >ls-files.actual &&
        cat >ls-files.expect <<-EOF &&
@@ -174,7 +206,7 @@ test_expect_success 'add original file back' '
 '
 
 test_expect_success 'add new file' '
-       : >two &&
+       create_non_racy_file two &&
        git update-index --add two &&
        git ls-files --stage >actual &&
        cat >expect <<-EOF &&
@@ -218,13 +250,13 @@ test_expect_success 'rev-parse --shared-index-path' '
 
 test_expect_success 'set core.splitIndex config variable to true' '
        git config core.splitIndex true &&
-       : >three &&
+       create_non_racy_file three &&
        git update-index --add three &&
        git ls-files --stage >ls-files.actual &&
        cat >ls-files.expect <<-EOF &&
-       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       one
-       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       three
-       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       two
+       100644 $EMPTY_BLOB 0    one
+       100644 $EMPTY_BLOB 0    three
+       100644 $EMPTY_BLOB 0    two
        EOF
        test_cmp ls-files.expect ls-files.actual &&
        BASE=$(test-tool dump-split-index .git/index | grep "^base") &&
@@ -242,8 +274,8 @@ test_expect_success 'set core.splitIndex config variable to false' '
        git update-index --force-remove three &&
        git ls-files --stage >ls-files.actual &&
        cat >ls-files.expect <<-EOF &&
-       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       one
-       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       two
+       100644 $EMPTY_BLOB 0    one
+       100644 $EMPTY_BLOB 0    two
        EOF
        test_cmp ls-files.expect ls-files.actual &&
        test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
@@ -253,9 +285,9 @@ test_expect_success 'set core.splitIndex config variable to false' '
        test_cmp expect actual
 '
 
-test_expect_success 'set core.splitIndex config variable to true' '
+test_expect_success 'set core.splitIndex config variable back to true' '
        git config core.splitIndex true &&
-       : >three &&
+       create_non_racy_file three &&
        git update-index --add three &&
        BASE=$(test-tool dump-split-index .git/index | grep "^base") &&
        test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
@@ -265,12 +297,12 @@ test_expect_success 'set core.splitIndex config variable to true' '
        deletions:
        EOF
        test_cmp expect actual &&
-       : >four &&
+       create_non_racy_file four &&
        git update-index --add four &&
        test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
        cat >expect <<-EOF &&
        $BASE
-       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       four
+       100644 $EMPTY_BLOB 0    four
        replacements:
        deletions:
        EOF
@@ -279,7 +311,7 @@ test_expect_success 'set core.splitIndex config variable to true' '
 
 test_expect_success 'check behavior with splitIndex.maxPercentChange unset' '
        git config --unset splitIndex.maxPercentChange &&
-       : >five &&
+       create_non_racy_file five &&
        git update-index --add five &&
        BASE=$(test-tool dump-split-index .git/index | grep "^base") &&
        test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
@@ -289,12 +321,12 @@ test_expect_success 'check behavior with splitIndex.maxPercentChange unset' '
        deletions:
        EOF
        test_cmp expect actual &&
-       : >six &&
+       create_non_racy_file six &&
        git update-index --add six &&
        test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
        cat >expect <<-EOF &&
        $BASE
-       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       six
+       100644 $EMPTY_BLOB 0    six
        replacements:
        deletions:
        EOF
@@ -303,7 +335,7 @@ test_expect_success 'check behavior with splitIndex.maxPercentChange unset' '
 
 test_expect_success 'check splitIndex.maxPercentChange set to 0' '
        git config splitIndex.maxPercentChange 0 &&
-       : >seven &&
+       create_non_racy_file seven &&
        git update-index --add seven &&
        BASE=$(test-tool dump-split-index .git/index | grep "^base") &&
        test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
@@ -313,7 +345,7 @@ test_expect_success 'check splitIndex.maxPercentChange set to 0' '
        deletions:
        EOF
        test_cmp expect actual &&
-       : >eight &&
+       create_non_racy_file eight &&
        git update-index --add eight &&
        BASE=$(test-tool dump-split-index .git/index | grep "^base") &&
        test-tool dump-split-index .git/index | sed "/^own/d" >actual &&
@@ -326,17 +358,17 @@ test_expect_success 'check splitIndex.maxPercentChange set to 0' '
 '
 
 test_expect_success 'shared index files expire after 2 weeks by default' '
-       : >ten &&
+       create_non_racy_file ten &&
        git update-index --add ten &&
        test $(ls .git/sharedindex.* | wc -l) -gt 2 &&
        just_under_2_weeks_ago=$((5-14*86400)) &&
        test-tool chmtime =$just_under_2_weeks_ago .git/sharedindex.* &&
-       : >eleven &&
+       create_non_racy_file eleven &&
        git update-index --add eleven &&
        test $(ls .git/sharedindex.* | wc -l) -gt 2 &&
        just_over_2_weeks_ago=$((-1-14*86400)) &&
        test-tool chmtime =$just_over_2_weeks_ago .git/sharedindex.* &&
-       : >twelve &&
+       create_non_racy_file twelve &&
        git update-index --add twelve &&
        test $(ls .git/sharedindex.* | wc -l) -le 2
 '
@@ -344,12 +376,12 @@ test_expect_success 'shared index files expire after 2 weeks by default' '
 test_expect_success 'check splitIndex.sharedIndexExpire set to 16 days' '
        git config splitIndex.sharedIndexExpire "16.days.ago" &&
        test-tool chmtime =$just_over_2_weeks_ago .git/sharedindex.* &&
-       : >thirteen &&
+       create_non_racy_file thirteen &&
        git update-index --add thirteen &&
        test $(ls .git/sharedindex.* | wc -l) -gt 2 &&
        just_over_16_days_ago=$((-1-16*86400)) &&
        test-tool chmtime =$just_over_16_days_ago .git/sharedindex.* &&
-       : >fourteen &&
+       create_non_racy_file fourteen &&
        git update-index --add fourteen &&
        test $(ls .git/sharedindex.* | wc -l) -le 2
 '
@@ -358,17 +390,37 @@ test_expect_success 'check splitIndex.sharedIndexExpire set to "never" and "now"
        git config splitIndex.sharedIndexExpire never &&
        just_10_years_ago=$((-365*10*86400)) &&
        test-tool chmtime =$just_10_years_ago .git/sharedindex.* &&
-       : >fifteen &&
+       create_non_racy_file fifteen &&
        git update-index --add fifteen &&
        test $(ls .git/sharedindex.* | wc -l) -gt 2 &&
        git config splitIndex.sharedIndexExpire now &&
        just_1_second_ago=-1 &&
        test-tool chmtime =$just_1_second_ago .git/sharedindex.* &&
-       : >sixteen &&
+       create_non_racy_file sixteen &&
        git update-index --add sixteen &&
        test $(ls .git/sharedindex.* | wc -l) -le 2
 '
 
+test_expect_success POSIXPERM 'same mode for index & split index' '
+       git init same-mode &&
+       (
+               cd same-mode &&
+               test_commit A &&
+               test_modebits .git/index >index_mode &&
+               test_must_fail git config core.sharedRepository &&
+               git -c core.splitIndex=true status &&
+               shared=$(ls .git/sharedindex.*) &&
+               case "$shared" in
+               *" "*)
+                       # we have more than one???
+                       false ;;
+               *)
+                       test_modebits "$shared" >split_index_mode &&
+                       test_cmp index_mode split_index_mode ;;
+               esac
+       )
+'
+
 while read -r mode modebits
 do
        test_expect_success POSIXPERM "split index respects core.sharedrepository $mode" '
@@ -379,7 +431,7 @@ do
                # Create one new shared index file
                git config core.sharedrepository "$mode" &&
                git config core.splitIndex true &&
-               : >one &&
+               create_non_racy_file one &&
                git update-index --add one &&
                echo "$modebits" >expect &&
                test_modebits .git/index >actual &&
@@ -437,4 +489,22 @@ test_expect_success 'writing split index with null sha1 does not write cache tre
        test_line_count = 0 cache-tree.out
 '
 
+test_expect_success 'do not refresh null base index' '
+       test_create_repo merge &&
+       (
+               cd merge &&
+               test_commit initial &&
+               git checkout -b side-branch &&
+               test_commit extra &&
+               git checkout master &&
+               git update-index --split-index &&
+               test_commit more &&
+               # must not write a new shareindex, or we wont catch the problem
+               git -c splitIndex.maxPercentChange=100 merge --no-edit side-branch 2>err &&
+               # i.e. do not expect warnings like
+               # could not freshen shared index .../shareindex.00000...
+               test_must_be_empty err
+       )
+'
+
 test_done