Imported Upstream version 2.30.0
[platform/upstream/git.git] / t / t5318-commit-graph.sh
index d42b3ef..2ed0c15 100755 (executable)
@@ -3,13 +3,23 @@
 test_description='commit graph'
 . ./test-lib.sh
 
+GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS=0
+
 test_expect_success 'setup full repo' '
        mkdir full &&
        cd "$TRASH_DIRECTORY/full" &&
        git init &&
        git config core.commitGraph true &&
        objdir=".git/objects" &&
-       test_oid_init
+
+       test_oid_cache <<-EOF
+       oid_version sha1:1
+       oid_version sha256:2
+       EOF
+'
+
+test_expect_success POSIXPERM 'tweak umask for modebit tests' '
+       umask 022
 '
 
 test_expect_success 'verify graph with no graph file' '
@@ -19,8 +29,8 @@ test_expect_success 'verify graph with no graph file' '
 
 test_expect_success 'write graph with no packs' '
        cd "$TRASH_DIRECTORY/full" &&
-       git commit-graph write --object-dir . &&
-       test_path_is_missing info/commit-graph
+       git commit-graph write --object-dir $objdir &&
+       test_path_is_missing $objdir/info/commit-graph
 '
 
 test_expect_success 'exit with correct error on bad input to --stdin-packs' '
@@ -40,15 +50,6 @@ test_expect_success 'create commits and repack' '
        git repack
 '
 
-test_expect_success 'exit with correct error on bad input to --stdin-commits' '
-       cd "$TRASH_DIRECTORY/full" &&
-       echo HEAD | test_expect_code 1 git commit-graph write --stdin-commits 2>stderr &&
-       test_i18ngrep "invalid commit object id" stderr &&
-       # valid tree OID, but not a commit OID
-       git rev-parse HEAD^{tree} | test_expect_code 1 git commit-graph write --stdin-commits 2>stderr &&
-       test_i18ngrep "invalid commit object id" stderr
-'
-
 graph_git_two_modes() {
        git -c core.commitGraph=true $1 >output
        git -c core.commitGraph=false $1 >expect
@@ -81,14 +82,30 @@ graph_read_expect() {
                NUM_CHUNKS=$((3 + $(echo "$2" | wc -w)))
        fi
        cat >expect <<- EOF
-       header: 43475048 1 1 $NUM_CHUNKS 0
+       header: 43475048 1 $(test_oid oid_version) $NUM_CHUNKS 0
        num_commits: $1
        chunks: oid_fanout oid_lookup commit_metadata$OPTIONAL
        EOF
-       git commit-graph read >output &&
+       test-tool read-graph >output &&
        test_cmp expect output
 }
 
+test_expect_success 'exit with correct error on bad input to --stdin-commits' '
+       cd "$TRASH_DIRECTORY/full" &&
+       # invalid, non-hex OID
+       echo HEAD >in &&
+       test_expect_code 1 git commit-graph write --stdin-commits <in 2>stderr &&
+       test_i18ngrep "unexpected non-hex object ID: HEAD" stderr &&
+       # non-existent OID
+       echo $ZERO_OID >in &&
+       test_expect_code 1 git commit-graph write --stdin-commits <in 2>stderr &&
+       test_i18ngrep "invalid object" stderr &&
+       # valid commit and tree OID
+       git rev-parse HEAD HEAD^{tree} >in &&
+       git commit-graph write --stdin-commits <in &&
+       graph_read_expect 3
+'
+
 test_expect_success 'write graph' '
        cd "$TRASH_DIRECTORY/full" &&
        git commit-graph write &&
@@ -96,6 +113,13 @@ test_expect_success 'write graph' '
        graph_read_expect "3"
 '
 
+test_expect_success POSIXPERM 'write graph has correct permissions' '
+       test_path_is_file $objdir/info/commit-graph &&
+       echo "-r--r--r--" >expect &&
+       test_modebits $objdir/info/commit-graph >actual &&
+       test_cmp expect actual
+'
+
 graph_git_behavior 'graph exists' full commits/3 commits/1
 
 test_expect_success 'Add more commits' '
@@ -127,37 +151,58 @@ test_expect_success 'Add more commits' '
 test_expect_success 'commit-graph write progress off for redirected stderr' '
        cd "$TRASH_DIRECTORY/full" &&
        git commit-graph write 2>err &&
-       test_line_count = 0 err
+       test_must_be_empty err
 '
 
 test_expect_success 'commit-graph write force progress on for stderr' '
        cd "$TRASH_DIRECTORY/full" &&
-       git commit-graph write --progress 2>err &&
+       GIT_PROGRESS_DELAY=0 git commit-graph write --progress 2>err &&
        test_file_not_empty err
 '
 
 test_expect_success 'commit-graph write with the --no-progress option' '
        cd "$TRASH_DIRECTORY/full" &&
        git commit-graph write --no-progress 2>err &&
-       test_line_count = 0 err
+       test_must_be_empty err
+'
+
+test_expect_success 'commit-graph write --stdin-commits progress off for redirected stderr' '
+       cd "$TRASH_DIRECTORY/full" &&
+       git rev-parse commits/5 >in &&
+       git commit-graph write --stdin-commits <in 2>err &&
+       test_must_be_empty err
+'
+
+test_expect_success 'commit-graph write --stdin-commits force progress on for stderr' '
+       cd "$TRASH_DIRECTORY/full" &&
+       git rev-parse commits/5 >in &&
+       GIT_PROGRESS_DELAY=0 git commit-graph write --stdin-commits --progress <in 2>err &&
+       test_i18ngrep "Collecting commits from input" err
+'
+
+test_expect_success 'commit-graph write --stdin-commits with the --no-progress option' '
+       cd "$TRASH_DIRECTORY/full" &&
+       git rev-parse commits/5 >in &&
+       git commit-graph write --stdin-commits --no-progress <in 2>err &&
+       test_must_be_empty err
 '
 
 test_expect_success 'commit-graph verify progress off for redirected stderr' '
        cd "$TRASH_DIRECTORY/full" &&
        git commit-graph verify 2>err &&
-       test_line_count = 0 err
+       test_must_be_empty err
 '
 
 test_expect_success 'commit-graph verify force progress on for stderr' '
        cd "$TRASH_DIRECTORY/full" &&
-       git commit-graph verify --progress 2>err &&
+       GIT_PROGRESS_DELAY=0 git commit-graph verify --progress 2>err &&
        test_file_not_empty err
 '
 
 test_expect_success 'commit-graph verify with the --no-progress option' '
        cd "$TRASH_DIRECTORY/full" &&
        git commit-graph verify --no-progress 2>err &&
-       test_line_count = 0 err
+       test_must_be_empty err
 '
 
 # Current graph structure:
@@ -372,6 +417,35 @@ test_expect_success 'replace-objects invalidates commit-graph' '
        )
 '
 
+test_expect_success 'warn on improper hash version' '
+       git init --object-format=sha1 sha1 &&
+       (
+               cd sha1 &&
+               test_commit 1 &&
+               git commit-graph write --reachable &&
+               mv .git/objects/info/commit-graph ../cg-sha1
+       ) &&
+       git init --object-format=sha256 sha256 &&
+       (
+               cd sha256 &&
+               test_commit 1 &&
+               git commit-graph write --reachable &&
+               mv .git/objects/info/commit-graph ../cg-sha256
+       ) &&
+       (
+               cd sha1 &&
+               mv ../cg-sha256 .git/objects/info/commit-graph &&
+               git log -1 2>err &&
+               test_i18ngrep "commit-graph hash version 2 does not match version 1" err
+       ) &&
+       (
+               cd sha256 &&
+               mv ../cg-sha1 .git/objects/info/commit-graph &&
+               git log -1 2>err &&
+               test_i18ngrep "commit-graph hash version 1 does not match version 2" err
+       )
+'
+
 # the verify tests below expect the commit-graph to contain
 # exactly the commits reachable from the commits/8 branch.
 # If the file changes the set of commits in the list, then the
@@ -421,7 +495,8 @@ GRAPH_BYTE_FOOTER=$(($GRAPH_OCTOPUS_DATA_OFFSET + 4 * $NUM_OCTOPUS_EDGES))
 corrupt_graph_setup() {
        cd "$TRASH_DIRECTORY/full" &&
        test_when_finished mv commit-graph-backup $objdir/info/commit-graph &&
-       cp $objdir/info/commit-graph commit-graph-backup
+       cp $objdir/info/commit-graph commit-graph-backup &&
+       chmod u+w $objdir/info/commit-graph
 }
 
 corrupt_graph_verify() {
@@ -434,7 +509,8 @@ corrupt_graph_verify() {
                cp $objdir/info/commit-graph commit-graph-pre-write-test
        fi &&
        git status --short &&
-       GIT_TEST_COMMIT_GRAPH_DIE_ON_LOAD=true git commit-graph write &&
+       GIT_TEST_COMMIT_GRAPH_DIE_ON_PARSE=true git commit-graph write &&
+       chmod u+w $objdir/info/commit-graph &&
        git commit-graph verify
 }
 
@@ -481,12 +557,12 @@ test_expect_success 'detect bad version' '
 '
 
 test_expect_success 'detect bad hash version' '
-       corrupt_graph_and_verify $GRAPH_BYTE_HASH "\02" \
+       corrupt_graph_and_verify $GRAPH_BYTE_HASH "\03" \
                "hash version"
 '
 
 test_expect_success 'detect low chunk count' '
-       corrupt_graph_and_verify $GRAPH_BYTE_CHUNK_COUNT "\02" \
+       corrupt_graph_and_verify $GRAPH_BYTE_CHUNK_COUNT "\01" \
                "missing the .* chunk"
 '
 
@@ -572,7 +648,8 @@ test_expect_success 'detect invalid checksum hash' '
 
 test_expect_success 'detect incorrect chunk count' '
        corrupt_graph_and_verify $GRAPH_BYTE_CHUNK_COUNT "\377" \
-               "chunk lookup table entry missing" $GRAPH_CHUNK_LOOKUP_OFFSET
+               "commit-graph file is too small to hold [0-9]* chunks" \
+               $GRAPH_CHUNK_LOOKUP_OFFSET
 '
 
 test_expect_success 'git fsck (checks commit-graph)' '
@@ -629,7 +706,7 @@ test_expect_success 'corrupt commit-graph write (broken parent)' '
                empty="$(git mktree </dev/null)" &&
                cat >broken <<-EOF &&
                tree $empty
-               parent 0000000000000000000000000000000000000000
+               parent $ZERO_OID
                author whatever <whatever@example.com> 1234 -0000
                committer whatever <whatever@example.com> 1234 -0000
 
@@ -650,7 +727,7 @@ test_expect_success 'corrupt commit-graph write (missing tree)' '
                cd repo &&
                tree="$(git mktree </dev/null)" &&
                cat >broken <<-EOF &&
-               parent 0000000000000000000000000000000000000000
+               parent $ZERO_OID
                author whatever <whatever@example.com> 1234 -0000
                committer whatever <whatever@example.com> 1234 -0000
 
@@ -660,7 +737,7 @@ test_expect_success 'corrupt commit-graph write (missing tree)' '
                git commit-tree -p "$broken" -m "good" "$tree" >good &&
                test_must_fail git commit-graph write --stdin-commits \
                        <good 2>test_err &&
-               test_i18ngrep "unable to get tree for" test_err
+               test_i18ngrep "unable to parse commit" test_err
        )
 '