(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:test_description) op: assign_op.Equal rhs: { (SQ (Token id: Id.Lit_Chars val: 'Test git rev-parse with different parent options' span_id: 15 ) ) } spids: [13] ) ] ) (C {(.)} {(./test-lib.sh)}) (command.ShFunction name: test_cmp_rev_output body: (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp] children: [ (command.Simple words: [{(git)} {(rev-parse)} {(--verify)} {(DQ ($ Id.VSub_Number '$1'))}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:42) fd: -1 arg_word: {(expect)} ) ] ) (command.Simple words: [{(eval)} {(DQ ($ Id.VSub_Number '$2'))}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:54) fd: -1 arg_word: {(actual)} ) ] ) (C {(test_cmp)} {(expect)} {(actual)}) ] ) ] ) ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:setup span_id:72))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:76) (Token id:Id.Lit_Chars val:'\ttest_commit start &&\n' span_id:77) (Token id:Id.Lit_Chars val:'\ttest_commit second &&\n' span_id:78) (Token id:Id.Lit_Chars val:'\tgit checkout --orphan tmp &&\n' span_id:79) (Token id:Id.Lit_Chars val:'\ttest_commit start2 &&\n' span_id:80) (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:81) (Token id:Id.Lit_Chars val:'\tgit merge -m next --allow-unrelated-histories start2 &&\n' span_id:82) (Token id:Id.Lit_Chars val:'\ttest_commit final &&\n' span_id:83) (Token id:Id.Lit_Chars val:'\n' span_id:84) (Token id:Id.Lit_Chars val:'\ttest_seq 40 |\n' span_id:85) (Token id:Id.Lit_Chars val:'\twhile read i\n' span_id:86) (Token id:Id.Lit_Chars val:'\tdo\n' span_id:87) (Token id:Id.Lit_Chars val:'\t\tgit checkout --orphan "b$i" &&\n' span_id:88) (Token id:Id.Lit_Chars val:'\t\ttest_tick &&\n' span_id:89) (Token id: Id.Lit_Chars val: '\t\tgit commit --allow-empty -m "$i" &&\n' span_id: 90 ) (Token id:Id.Lit_Chars val:'\t\tcommit=$(git rev-parse --verify HEAD) &&\n' span_id:91) (Token id: Id.Lit_Chars val: '\t\tprintf "$commit " >>.git/info/grafts\n' span_id: 92 ) (Token id:Id.Lit_Chars val:'\tdone\n' span_id:93) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'start is valid' span_id:100))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:104) (Token id: Id.Lit_Chars val: '\tgit rev-parse start | grep "^[0-9a-f]\\{40\\}$"\n' span_id: 105 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'start^0' span_id:112))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:116) (Token id: Id.Lit_Chars val: '\ttest_cmp_rev_output tags/start "git rev-parse start^0"\n' span_id: 117 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'start^1 not valid' span_id:124))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:128) (Token id: Id.Lit_Chars val: '\ttest_must_fail git rev-parse --verify start^1\n' span_id: 129 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'second^1 = second^' span_id:136))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:140) (Token id: Id.Lit_Chars val: '\ttest_cmp_rev_output second^ "git rev-parse second^1"\n' span_id: 141 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'final^1^1^1' span_id:148))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:152) (Token id: Id.Lit_Chars val: '\ttest_cmp_rev_output start "git rev-parse final^1^1^1"\n' span_id: 153 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'final^1^1^1 = final^^^' span_id:160))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:164) (Token id: Id.Lit_Chars val: '\ttest_cmp_rev_output final^^^ "git rev-parse final^1^1^1"\n' span_id: 165 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'final^1^2' span_id:172))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:176) (Token id: Id.Lit_Chars val: '\ttest_cmp_rev_output start2 "git rev-parse final^1^2"\n' span_id: 177 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'final^1^2 != final^1^1' span_id:184))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:188) (Token id: Id.Lit_Chars val: '\ttest $(git rev-parse final^1^2) != $(git rev-parse final^1^1)\n' span_id: 189 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'final^1^3 not valid' span_id:196))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:200) (Token id: Id.Lit_Chars val: '\ttest_must_fail git rev-parse --verify final^1^3\n' span_id: 201 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'--verify start2^1' span_id:208))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:212) (Token id: Id.Lit_Chars val: '\ttest_must_fail git rev-parse --verify start2^1\n' span_id: 213 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'--verify start2^0' span_id:220))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:224) (Token id:Id.Lit_Chars val:'\tgit rev-parse --verify start2^0\n' span_id:225) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'final^1^@ = final^1^1 final^1^2' span_id:232))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:236) (Token id: Id.Lit_Chars val: '\tgit rev-parse final^1^1 final^1^2 >expect &&\n' span_id: 237 ) (Token id:Id.Lit_Chars val:'\tgit rev-parse final^1^@ >actual &&\n' span_id:238) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:239) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'final^1^! = final^1 ^final^1^1 ^final^1^2' span_id:246))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:250) (Token id: Id.Lit_Chars val: '\tgit rev-parse final^1 ^final^1^1 ^final^1^2 >expect &&\n' span_id: 251 ) (Token id:Id.Lit_Chars val:'\tgit rev-parse final^1^! >actual &&\n' span_id:252) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:253) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'large graft octopus' span_id:260))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:264) (Token id: Id.Lit_Chars val: '\ttest_cmp_rev_output b31 "git rev-parse --verify b1^30"\n' span_id: 265 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'repack for next test' span_id:272))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:276) (Token id:Id.Lit_Chars val:'\tgit repack -a -d\n' span_id:277) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'short SHA-1 works' span_id:284))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:288) (Token id: Id.Lit_Chars val: '\tstart=$(git rev-parse --verify start) &&\n' span_id: 289 ) (Token id:Id.Lit_Chars val:'\ttest_cmp_rev_output start "git rev-parse ${start%?}"\n' span_id:290) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup for rev^- tests' span_id:301))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:305) (Token id:Id.Lit_Chars val:'\ttest_commit one &&\n' span_id:306) (Token id:Id.Lit_Chars val:'\ttest_commit two &&\n' span_id:307) (Token id:Id.Lit_Chars val:'\ttest_commit three &&\n' span_id:308) (Token id:Id.Lit_Chars val:'\n' span_id:309) (Token id: Id.Lit_Chars val: '\t# Merge in a branch for testing rev^-\n' span_id: 310 ) (Token id:Id.Lit_Chars val:'\tgit checkout -b branch &&\n' span_id:311) (Token id:Id.Lit_Chars val:'\tgit checkout HEAD^^ &&\n' span_id:312) (Token id:Id.Lit_Chars val:'\tgit merge -m merge --no-edit --no-ff branch &&\n' span_id:313) (Token id:Id.Lit_Chars val:'\tgit checkout -b merge\n' span_id:314) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-list --count merge^- = merge^..merge' span_id:324))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:328) (Token id: Id.Lit_Chars val: '\tgit rev-list --count merge^..merge >expect &&\n' span_id: 329 ) (Token id:Id.Lit_Chars val:'\techo 3 >actual &&\n' span_id:330) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:331) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-parse merge^- = merge^..merge' span_id:342))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:346) (Token id: Id.Lit_Chars val: '\tgit rev-parse merge^..merge >expect &&\n' span_id: 347 ) (Token id:Id.Lit_Chars val:'\tgit rev-parse merge^- >actual &&\n' span_id:348) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:349) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-parse merge^-1 = merge^..merge' span_id:356))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:360) (Token id: Id.Lit_Chars val: '\tgit rev-parse merge^1..merge >expect &&\n' span_id: 361 ) (Token id:Id.Lit_Chars val:'\tgit rev-parse merge^-1 >actual &&\n' span_id:362) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:363) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-parse merge^-2 = merge^2..merge' span_id:370))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:374) (Token id: Id.Lit_Chars val: '\tgit rev-parse merge^2..merge >expect &&\n' span_id: 375 ) (Token id:Id.Lit_Chars val:'\tgit rev-parse merge^-2 >actual &&\n' span_id:376) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:377) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-parse merge^-0 (invalid parent)' span_id:384))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:388) (Token id: Id.Lit_Chars val: '\ttest_must_fail git rev-parse merge^-0\n' span_id: 389 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-parse merge^-3 (invalid parent)' span_id:396))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:400) (Token id: Id.Lit_Chars val: '\ttest_must_fail git rev-parse merge^-3\n' span_id: 401 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-parse merge^-^ (garbage after ^-)' span_id:408))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:412) (Token id: Id.Lit_Chars val: '\ttest_must_fail git rev-parse merge^-^\n' span_id: 413 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-parse merge^-1x (garbage after ^-1)' span_id:420))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:424) (Token id: Id.Lit_Chars val: '\ttest_must_fail git rev-parse merge^-1x\n' span_id: 425 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-list merge^- = merge^..merge' span_id:439))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:443) (Token id: Id.Lit_Chars val: '\tgit rev-list merge^..merge >expect &&\n' span_id: 444 ) (Token id:Id.Lit_Chars val:'\tgit rev-list merge^- >actual &&\n' span_id:445) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:446) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-list merge^-1 = merge^1..merge' span_id:453))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:457) (Token id: Id.Lit_Chars val: '\tgit rev-list merge^1..merge >expect &&\n' span_id: 458 ) (Token id:Id.Lit_Chars val:'\tgit rev-list merge^-1 >actual &&\n' span_id:459) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:460) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-list merge^-2 = merge^2..merge' span_id:467))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:471) (Token id: Id.Lit_Chars val: '\tgit rev-list merge^2..merge >expect &&\n' span_id: 472 ) (Token id:Id.Lit_Chars val:'\tgit rev-list merge^-2 >actual &&\n' span_id:473) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:474) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-list merge^-0 (invalid parent)' span_id:481))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:485) (Token id: Id.Lit_Chars val: '\ttest_must_fail git rev-list merge^-0\n' span_id: 486 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-list merge^-3 (invalid parent)' span_id:493))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:497) (Token id: Id.Lit_Chars val: '\ttest_must_fail git rev-list merge^-3\n' span_id: 498 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-list merge^-^ (garbage after ^-)' span_id:505))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:509) (Token id: Id.Lit_Chars val: '\ttest_must_fail git rev-list merge^-^\n' span_id: 510 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-list merge^-1x (garbage after ^-1)' span_id:517))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:521) (Token id: Id.Lit_Chars val: '\ttest_must_fail git rev-list merge^-1x\n' span_id: 522 ) ) } ) (C {(test_done)}) ] )