|  | #!/bin/sh | 
|  |  | 
|  | test_description='git rev-list trivial path optimization test | 
|  |  | 
|  | d/z1 | 
|  | b0                             b1 | 
|  | o------------------------*----o main | 
|  | /                        / | 
|  | o---------o----o----o----o side | 
|  | a0        c0   c1   a1   c2 | 
|  | d/f0      d/f1 | 
|  | d/z0 | 
|  |  | 
|  | ' | 
|  |  | 
|  | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | 
|  | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | 
|  |  | 
|  | TEST_PASSES_SANITIZE_LEAK=true | 
|  | . ./test-lib.sh | 
|  |  | 
|  | test_expect_success setup ' | 
|  | echo Hello >a && | 
|  | mkdir d && | 
|  | echo World >d/f && | 
|  | echo World >d/z && | 
|  | git add a d && | 
|  | test_tick && | 
|  | git commit -m "Initial commit" && | 
|  | git rev-parse --verify HEAD && | 
|  | git tag initial | 
|  | ' | 
|  |  | 
|  | test_expect_success path-optimization ' | 
|  | test_tick && | 
|  | commit=$(echo "Unchanged tree" | git commit-tree "HEAD^{tree}" -p HEAD) && | 
|  | test $(git rev-list $commit | wc -l) = 2 && | 
|  | test $(git rev-list $commit -- . | wc -l) = 1 | 
|  | ' | 
|  |  | 
|  | test_expect_success 'further setup' ' | 
|  | git checkout -b side && | 
|  | echo Irrelevant >c && | 
|  | echo Irrelevant >d/f && | 
|  | git add c d/f && | 
|  | test_tick && | 
|  | git commit -m "Side makes an irrelevant commit" && | 
|  | git tag side_c0 && | 
|  | echo "More Irrelevancy" >c && | 
|  | git add c && | 
|  | test_tick && | 
|  | git commit -m "Side makes another irrelevant commit" && | 
|  | echo Bye >a && | 
|  | git add a && | 
|  | test_tick && | 
|  | git commit -m "Side touches a" && | 
|  | git tag side_a1 && | 
|  | echo "Yet more Irrelevancy" >c && | 
|  | git add c && | 
|  | test_tick && | 
|  | git commit -m "Side makes yet another irrelevant commit" && | 
|  | git checkout main && | 
|  | echo Another >b && | 
|  | echo Munged >d/z && | 
|  | git add b d/z && | 
|  | test_tick && | 
|  | git commit -m "Main touches b" && | 
|  | git tag main_b0 && | 
|  | git merge side && | 
|  | echo Touched >b && | 
|  | git add b && | 
|  | test_tick && | 
|  | git commit -m "Main touches b again" | 
|  | ' | 
|  |  | 
|  | test_expect_success 'path optimization 2' ' | 
|  | git rev-parse side_a1 initial >expected && | 
|  | git rev-list HEAD -- a >actual && | 
|  | test_cmp expected actual | 
|  | ' | 
|  |  | 
|  | test_expect_success 'pathspec with leading path' ' | 
|  | git rev-parse main^ main_b0 side_c0 initial >expected && | 
|  | git rev-list HEAD -- d >actual && | 
|  | test_cmp expected actual | 
|  | ' | 
|  |  | 
|  | test_expect_success 'pathspec with glob (1)' ' | 
|  | git rev-parse main^ main_b0 side_c0 initial >expected && | 
|  | git rev-list HEAD -- "d/*" >actual && | 
|  | test_cmp expected actual | 
|  | ' | 
|  |  | 
|  | test_expect_success 'pathspec with glob (2)' ' | 
|  | git rev-parse side_c0 initial >expected && | 
|  | git rev-list HEAD -- "d/[a-m]*" >actual && | 
|  | test_cmp expected actual | 
|  | ' | 
|  |  | 
|  | test_done |