#!/bin/sh global test_description := ''git rev-list trivial path optimization test d/z1 b0 b1 o------------------------*----o master / / o---------o----o----o----o side a0 c0 c1 a1 c2 d/f0 d/f1 d/z0 '' source ./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 master && echo Another >b && echo Munged >d/z && git add b d/z && test_tick && git commit -m "Master touches b" && git tag master_b0 && git merge side && echo Touched >b && git add b && test_tick && git commit -m "Master 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 master^ master_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 master^ master_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 (CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: { (SQ <"git rev-list trivial path optimization test\n"> <"\n"> <" d/z1\n"> <" b0 b1\n"> <" o------------------------*----o master\n"> <" / /\n"> <" o---------o----o----o----o side\n"> <" a0 c0 c1 a1 c2\n"> <" d/f0 d/f1\n"> <" d/z0\n"> <"\n"> ) } spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(setup)} { (SQ <"\n"> <"\techo Hello >a &&\n"> <"\tmkdir d &&\n"> <"\techo World >d/f &&\n"> <"\techo World >d/z &&\n"> <"\tgit add a d &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"Initial commit\" &&\n"> <"\tgit rev-parse --verify HEAD &&\n"> <"\tgit tag initial\n"> ) } ) (C {(test_expect_success)} {(path-optimization)} { (SQ <"\n"> <"\ttest_tick &&\n"> <"\tcommit=$(echo \"Unchanged tree\" | git commit-tree \"HEAD^{tree}\" -p HEAD) &&\n"> <"\ttest $(git rev-list $commit | wc -l) = 2 &&\n"> <"\ttest $(git rev-list $commit -- . | wc -l) = 1\n"> ) } ) (C {(test_expect_success)} {(SQ <"further setup">)} { (SQ <"\n"> <"\tgit checkout -b side &&\n"> <"\techo Irrelevant >c &&\n"> <"\techo Irrelevant >d/f &&\n"> <"\tgit add c d/f &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"Side makes an irrelevant commit\" &&\n"> <"\tgit tag side_c0 &&\n"> <"\techo \"More Irrelevancy\" >c &&\n"> <"\tgit add c &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"Side makes another irrelevant commit\" &&\n"> <"\techo Bye >a &&\n"> <"\tgit add a &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"Side touches a\" &&\n"> <"\tgit tag side_a1 &&\n"> <"\techo \"Yet more Irrelevancy\" >c &&\n"> <"\tgit add c &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"Side makes yet another irrelevant commit\" &&\n"> <"\tgit checkout master &&\n"> <"\techo Another >b &&\n"> <"\techo Munged >d/z &&\n"> <"\tgit add b d/z &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"Master touches b\" &&\n"> <"\tgit tag master_b0 &&\n"> <"\tgit merge side &&\n"> <"\techo Touched >b &&\n"> <"\tgit add b &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"Master touches b again\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"path optimization 2">)} { (SQ <"\n"> <"\tgit rev-parse side_a1 initial >expected &&\n"> <"\tgit rev-list HEAD -- a >actual &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"pathspec with leading path">)} { (SQ <"\n"> <"\tgit rev-parse master^ master_b0 side_c0 initial >expected &&\n"> <"\tgit rev-list HEAD -- d >actual &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"pathspec with glob (1)">)} { (SQ <"\n"> <"\tgit rev-parse master^ master_b0 side_c0 initial >expected &&\n"> <"\tgit rev-list HEAD -- \"d/*\" >actual &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"pathspec with glob (2)">)} { (SQ <"\n"> <"\tgit rev-parse side_c0 initial >expected &&\n"> <"\tgit rev-list HEAD -- \"d/[a-m]*\" >actual &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_done)}) ] )