(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:'Merge base and parent list computation.\n' span_id:15))} spids: [13] ) ] ) (C {(.)} {(./test-lib.sh)}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:M) op: assign_op.Equal rhs: {(1130000000)} spids: [24] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:Z) op: assign_op.Equal rhs: {(Id.Lit_Other '+') (0000)} spids: [27] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:GIT_COMMITTER_EMAIL) op: assign_op.Equal rhs: {(git) (Id.Lit_Splice '@comm') (.iter.xz)} spids: [32] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:GIT_COMMITTER_NAME) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:'C O Mmiter' span_id:39))} spids: [37] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:GIT_AUTHOR_NAME) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:'A U Thor' span_id:44))} spids: [42] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:GIT_AUTHOR_EMAIL) op: assign_op.Equal rhs: {(git) (Id.Lit_Splice '@au') (.thor.xz)} spids: [47] ) ] ) (C {(export)} {(GIT_COMMITTER_EMAIL)} {(GIT_COMMITTER_NAME)} {(GIT_AUTHOR_NAME)} {(GIT_AUTHOR_EMAIL)}) (command.ShFunction name: doit body: (command.BraceGroup children: [ (command.AndOr ops: [ Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp ] children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:OFFSET) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [71] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:NAME) op: assign_op.Equal rhs: {($ Id.VSub_Number '$2')} spids: [77] ) ] ) (C {(shift)} {(2)}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:PARENTS) op: assign_op.Equal rhs: (word.Empty) spids: [91] ) ] ) (command.ForEach iter_name: P do_arg_iter: T body: (command.DoGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:PARENTS) op: assign_op.Equal rhs: { (DQ (${ Id.VSub_Name PARENTS) ('-p ') ($ Id.VSub_DollarName '$P') (' ') ) } spids: [104] ) ] ) ] ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:GIT_COMMITTER_DATE) op: assign_op.Equal rhs: { (DQ (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$M')}) right: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$OFFSET')}) ) ) (' ') ($ Id.VSub_DollarName '$Z') ) } spids: [121] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:GIT_AUTHOR_DATE) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$GIT_COMMITTER_DATE')} spids: [138] ) ] ) (C {(export)} {(GIT_COMMITTER_DATE)} {(GIT_AUTHOR_DATE)}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:commit) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:155) command_list: (command.CommandList children: [ (command.Pipeline children: [ (C {(echo)} {($ Id.VSub_DollarName '$NAME')}) (C {(git)} {(commit-tree)} {($ Id.VSub_DollarName '$T')} {($ Id.VSub_DollarName '$PARENTS')} ) ] negated: F ) ] ) ) } spids: [154] ) ] ) (command.Simple words: [{(echo)} {($ Id.VSub_DollarName '$commit')}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:179) fd: -1 arg_word: {(.git/refs/tags/) ($ Id.VSub_DollarName '$NAME')} ) ] ) (C {(echo)} {($ Id.VSub_DollarName '$commit')}) ] ) ] ) ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:setup span_id:196))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:200) (Token id:Id.Lit_Chars val:'\tT=$(git mktree </dev/null)\n' span_id:201) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'set up G and H' span_id:208))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:212) (Token id:Id.Lit_Chars val:'\t# E---D---C---B---A\n' span_id:213) (Token id:Id.Lit_Chars val:'\t# \\"-_ \\ \\\n' span_id:214) (Token id:Id.Lit_Chars val:'\t# \\ `---------G \\\n' span_id:215) (Token id:Id.Lit_Chars val:'\t# \\ \\\n' span_id:216) (Token id:Id.Lit_Chars val:'\t# F----------------H\n' span_id:217) (Token id:Id.Lit_Chars val:'\tE=$(doit 5 E) &&\n' span_id:218) (Token id:Id.Lit_Chars val:'\tD=$(doit 4 D $E) &&\n' span_id:219) (Token id:Id.Lit_Chars val:'\tF=$(doit 6 F $E) &&\n' span_id:220) (Token id:Id.Lit_Chars val:'\tC=$(doit 3 C $D) &&\n' span_id:221) (Token id:Id.Lit_Chars val:'\tB=$(doit 2 B $C) &&\n' span_id:222) (Token id:Id.Lit_Chars val:'\tA=$(doit 1 A $B) &&\n' span_id:223) (Token id:Id.Lit_Chars val:'\tG=$(doit 7 G $B $E) &&\n' span_id:224) (Token id:Id.Lit_Chars val:'\tH=$(doit 8 H $A $F)\n' span_id:225) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'merge-base G H' span_id:232))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:236) (Token id:Id.Lit_Chars val:'\tgit name-rev $B >expected &&\n' span_id:237) (Token id:Id.Lit_Chars val:'\n' span_id:238) (Token id:Id.Lit_Chars val:'\tMB=$(git merge-base G H) &&\n' span_id:239) (Token id:Id.Lit_Chars val:'\tgit name-rev "$MB" >actual.single &&\n' span_id:240) (Token id:Id.Lit_Chars val:'\n' span_id:241) (Token id:Id.Lit_Chars val:'\tMB=$(git merge-base --all G H) &&\n' span_id:242) (Token id:Id.Lit_Chars val:'\tgit name-rev "$MB" >actual.all &&\n' span_id:243) (Token id:Id.Lit_Chars val:'\n' span_id:244) (Token id: Id.Lit_Chars val: '\tMB=$(git show-branch --merge-base G H) &&\n' span_id: 245 ) (Token id:Id.Lit_Chars val:'\tgit name-rev "$MB" >actual.sb &&\n' span_id:246) (Token id:Id.Lit_Chars val:'\n' span_id:247) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual.single &&\n' span_id:248) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual.all &&\n' span_id:249) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual.sb\n' span_id:250) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'merge-base/show-branch --independent' span_id:257))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:261) (Token id:Id.Lit_Chars val:'\tgit name-rev "$H" >expected1 &&\n' span_id:262) (Token id:Id.Lit_Chars val:'\tgit name-rev "$H" "$G" >expected2 &&\n' span_id:263) (Token id:Id.Lit_Chars val:'\n' span_id:264) (Token id:Id.Lit_Chars val:'\tparents=$(git merge-base --independent H) &&\n' span_id:265) (Token id: Id.Lit_Chars val: '\tgit name-rev $parents >actual1.mb &&\n' span_id: 266 ) (Token id:Id.Lit_Chars val:'\tparents=$(git merge-base --independent A H G) &&\n' span_id:267) (Token id: Id.Lit_Chars val: '\tgit name-rev $parents >actual2.mb &&\n' span_id: 268 ) (Token id:Id.Lit_Chars val:'\n' span_id:269) (Token id: Id.Lit_Chars val: '\tparents=$(git show-branch --independent H) &&\n' span_id: 270 ) (Token id:Id.Lit_Chars val:'\tgit name-rev $parents >actual1.sb &&\n' span_id:271) (Token id: Id.Lit_Chars val: '\tparents=$(git show-branch --independent A H G) &&\n' span_id: 272 ) (Token id:Id.Lit_Chars val:'\tgit name-rev $parents >actual2.sb &&\n' span_id:273) (Token id:Id.Lit_Chars val:'\n' span_id:274) (Token id:Id.Lit_Chars val:'\ttest_cmp expected1 actual1.mb &&\n' span_id:275) (Token id:Id.Lit_Chars val:'\ttest_cmp expected2 actual2.mb &&\n' span_id:276) (Token id:Id.Lit_Chars val:'\ttest_cmp expected1 actual1.sb &&\n' span_id:277) (Token id:Id.Lit_Chars val:'\ttest_cmp expected2 actual2.sb\n' span_id:278) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'unsynchronized clocks' span_id:285))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:289) (Token id: Id.Lit_Chars val: '\t# This test is to demonstrate that relying on timestamps in a distributed\n' span_id: 290 ) (Token id: Id.Lit_Chars val: '\t# SCM to provide a _consistent_ partial ordering of commits leads to\n' span_id: 291 ) (Token id:Id.Lit_Chars val:'\t# insanity.\n' span_id:292) (Token id:Id.Lit_Chars val:'\t#\n' span_id:293) (Token id:Id.Lit_Chars val:'\t# Relative\n' span_id:294) (Token id:Id.Lit_Chars val:'\t# Structure timestamps\n' span_id:295) (Token id:Id.Lit_Chars val:'\t#\n' span_id:296) (Token id:Id.Lit_Chars val:'\t# PL PR +4 +4\n' span_id:297) (Token id:Id.Lit_Chars val:'\t# / \\/ \\ / \\/ \\\n' span_id:298) (Token id:Id.Lit_Chars val:'\t# L2 C2 R2 +3 -1 +3\n' span_id:299) (Token id:Id.Lit_Chars val:'\t# | | | | | |\n' span_id:300) (Token id:Id.Lit_Chars val:'\t# L1 C1 R1 +2 -2 +2\n' span_id:301) (Token id:Id.Lit_Chars val:'\t# | | | | | |\n' span_id:302) (Token id:Id.Lit_Chars val:'\t# L0 C0 R0 +1 -3 +1\n' span_id:303) (Token id:Id.Lit_Chars val:'\t# \\ | / \\ | /\n' span_id:304) (Token id:Id.Lit_Chars val:'\t# S 0\n' span_id:305) (Token id:Id.Lit_Chars val:'\t#\n' span_id:306) (Token id: Id.Lit_Chars val: '\t# The left and right chains of commits can be of any length and complexity as\n' span_id: 307 ) (Token id: Id.Lit_Chars val: '\t# long as all of the timestamps are greater than that of S.\n' span_id: 308 ) (Token id:Id.Lit_Chars val:'\n' span_id:309) (Token id:Id.Lit_Chars val:'\tS=$(doit 0 S) &&\n' span_id:310) (Token id:Id.Lit_Chars val:'\n' span_id:311) (Token id:Id.Lit_Chars val:'\tC0=$(doit -3 C0 $S) &&\n' span_id:312) (Token id:Id.Lit_Chars val:'\tC1=$(doit -2 C1 $C0) &&\n' span_id:313) (Token id:Id.Lit_Chars val:'\tC2=$(doit -1 C2 $C1) &&\n' span_id:314) (Token id:Id.Lit_Chars val:'\n' span_id:315) (Token id:Id.Lit_Chars val:'\tL0=$(doit 1 L0 $S) &&\n' span_id:316) (Token id:Id.Lit_Chars val:'\tL1=$(doit 2 L1 $L0) &&\n' span_id:317) (Token id:Id.Lit_Chars val:'\tL2=$(doit 3 L2 $L1) &&\n' span_id:318) (Token id:Id.Lit_Chars val:'\n' span_id:319) (Token id:Id.Lit_Chars val:'\tR0=$(doit 1 R0 $S) &&\n' span_id:320) (Token id:Id.Lit_Chars val:'\tR1=$(doit 2 R1 $R0) &&\n' span_id:321) (Token id:Id.Lit_Chars val:'\tR2=$(doit 3 R2 $R1) &&\n' span_id:322) (Token id:Id.Lit_Chars val:'\n' span_id:323) (Token id:Id.Lit_Chars val:'\tPL=$(doit 4 PL $L2 $C2) &&\n' span_id:324) (Token id:Id.Lit_Chars val:'\tPR=$(doit 4 PR $C2 $R2) &&\n' span_id:325) (Token id:Id.Lit_Chars val:'\n' span_id:326) (Token id:Id.Lit_Chars val:'\tgit name-rev $C2 >expected &&\n' span_id:327) (Token id:Id.Lit_Chars val:'\n' span_id:328) (Token id:Id.Lit_Chars val:'\tMB=$(git merge-base PL PR) &&\n' span_id:329) (Token id: Id.Lit_Chars val: '\tgit name-rev "$MB" >actual.single &&\n' span_id: 330 ) (Token id:Id.Lit_Chars val:'\n' span_id:331) (Token id:Id.Lit_Chars val:'\tMB=$(git merge-base --all PL PR) &&\n' span_id:332) (Token id:Id.Lit_Chars val:'\tgit name-rev "$MB" >actual.all &&\n' span_id:333) (Token id:Id.Lit_Chars val:'\n' span_id:334) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual.single &&\n' span_id:335) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual.all\n' span_id:336) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'--independent with unsynchronized clocks' span_id:343))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:347) (Token id:Id.Lit_Chars val:'\tIB=$(doit 0 IB) &&\n' span_id:348) (Token id:Id.Lit_Chars val:'\tI1=$(doit -10 I1 $IB) &&\n' span_id:349) (Token id:Id.Lit_Chars val:'\tI2=$(doit -9 I2 $I1) &&\n' span_id:350) (Token id:Id.Lit_Chars val:'\tI3=$(doit -8 I3 $I2) &&\n' span_id:351) (Token id:Id.Lit_Chars val:'\tI4=$(doit -7 I4 $I3) &&\n' span_id:352) (Token id:Id.Lit_Chars val:'\tI5=$(doit -6 I5 $I4) &&\n' span_id:353) (Token id:Id.Lit_Chars val:'\tI6=$(doit -5 I6 $I5) &&\n' span_id:354) (Token id:Id.Lit_Chars val:'\tI7=$(doit -4 I7 $I6) &&\n' span_id:355) (Token id:Id.Lit_Chars val:'\tI8=$(doit -3 I8 $I7) &&\n' span_id:356) (Token id:Id.Lit_Chars val:'\tIH=$(doit -2 IH $I8) &&\n' span_id:357) (Token id:Id.Lit_Chars val:'\n' span_id:358) (Token id:Id.Lit_Chars val:'\techo $IH >expected &&\n' span_id:359) (Token id: Id.Lit_Chars val: '\tgit merge-base --independent IB IH >actual &&\n' span_id: 360 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:361) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'merge-base for octopus-step (setup)' span_id:368))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:372) (Token id: Id.Lit_Chars val: '\t# Another set to demonstrate base between one commit and a merge\n' span_id: 373 ) (Token id:Id.Lit_Chars val:'\t# in the documentation.\n' span_id:374) (Token id:Id.Lit_Chars val:'\t#\n' span_id:375) (Token id:Id.Lit_Chars val:'\t# * C (MMC) * B (MMB) * A (MMA)\n' span_id:376) (Token id:Id.Lit_Chars val:'\t# * o * o * o\n' span_id:377) (Token id:Id.Lit_Chars val:'\t# * o * o * o\n' span_id:378) (Token id:Id.Lit_Chars val:'\t# * o * o * o\n' span_id:379) (Token id:Id.Lit_Chars val:'\t# * o | _______/\n' span_id:380) (Token id:Id.Lit_Chars val:'\t# | |/\n' span_id:381) (Token id:Id.Lit_Chars val:'\t# | * 1 (MM1)\n' span_id:382) (Token id:Id.Lit_Chars val:'\t# | _______/\n' span_id:383) (Token id:Id.Lit_Chars val:'\t# |/\n' span_id:384) (Token id:Id.Lit_Chars val:'\t# * root (MMR)\n' span_id:385) (Token id:Id.Lit_Chars val:'\n' span_id:386) (Token id:Id.Lit_Chars val:'\ttest_commit MMR &&\n' span_id:387) (Token id:Id.Lit_Chars val:'\ttest_commit MM1 &&\n' span_id:388) (Token id:Id.Lit_Chars val:'\ttest_commit MM-o &&\n' span_id:389) (Token id:Id.Lit_Chars val:'\ttest_commit MM-p &&\n' span_id:390) (Token id:Id.Lit_Chars val:'\ttest_commit MM-q &&\n' span_id:391) (Token id:Id.Lit_Chars val:'\ttest_commit MMA &&\n' span_id:392) (Token id:Id.Lit_Chars val:'\tgit checkout MM1 &&\n' span_id:393) (Token id:Id.Lit_Chars val:'\ttest_commit MM-r &&\n' span_id:394) (Token id:Id.Lit_Chars val:'\ttest_commit MM-s &&\n' span_id:395) (Token id:Id.Lit_Chars val:'\ttest_commit MM-t &&\n' span_id:396) (Token id:Id.Lit_Chars val:'\ttest_commit MMB &&\n' span_id:397) (Token id:Id.Lit_Chars val:'\tgit checkout MMR &&\n' span_id:398) (Token id:Id.Lit_Chars val:'\ttest_commit MM-u &&\n' span_id:399) (Token id:Id.Lit_Chars val:'\ttest_commit MM-v &&\n' span_id:400) (Token id:Id.Lit_Chars val:'\ttest_commit MM-w &&\n' span_id:401) (Token id:Id.Lit_Chars val:'\ttest_commit MM-x &&\n' span_id:402) (Token id:Id.Lit_Chars val:'\ttest_commit MMC\n' span_id:403) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'merge-base A B C' span_id:410))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:414) (Token id: Id.Lit_Chars val: '\tgit rev-parse --verify MM1 >expected &&\n' span_id: 415 ) (Token id:Id.Lit_Chars val:'\tgit rev-parse --verify MMR >expected.sb &&\n' span_id:416) (Token id:Id.Lit_Chars val:'\n' span_id:417) (Token id:Id.Lit_Chars val:'\tgit merge-base --all MMA MMB MMC >actual &&\n' span_id:418) (Token id: Id.Lit_Chars val: '\tgit merge-base --all --octopus MMA MMB MMC >actual.common &&\n' span_id: 419 ) (Token id:Id.Lit_Chars val:'\tgit show-branch --merge-base MMA MMB MMC >actual.sb &&\n' span_id:420) (Token id:Id.Lit_Chars val:'\n' span_id:421) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual &&\n' span_id:422) (Token id: Id.Lit_Chars val: '\ttest_cmp expected.sb actual.common &&\n' span_id: 423 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected.sb actual.sb\n' span_id:424) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'criss-cross merge-base for octopus-step' span_id:431))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:435) (Token id:Id.Lit_Chars val:'\tgit reset --hard MMR &&\n' span_id:436) (Token id:Id.Lit_Chars val:'\ttest_commit CC1 &&\n' span_id:437) (Token id:Id.Lit_Chars val:'\tgit reset --hard E &&\n' span_id:438) (Token id:Id.Lit_Chars val:'\ttest_commit CC2 &&\n' span_id:439) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:440) (Token id: Id.Lit_Chars val: '\t# E is a root commit unrelated to MMR root on which CC1 is based\n' span_id: 441 ) (Token id:Id.Lit_Chars val:'\tgit merge -s ours --allow-unrelated-histories CC1 &&\n' span_id:442) (Token id:Id.Lit_Chars val:'\ttest_commit CC-o &&\n' span_id:443) (Token id:Id.Lit_Chars val:'\ttest_commit CCB &&\n' span_id:444) (Token id:Id.Lit_Chars val:'\tgit reset --hard CC1 &&\n' span_id:445) (Token id: Id.Lit_Chars val: '\t# E is a root commit unrelated to MMR root on which CC1 is based\n' span_id: 446 ) (Token id:Id.Lit_Chars val:'\tgit merge -s ours --allow-unrelated-histories CC2 &&\n' span_id:447) (Token id:Id.Lit_Chars val:'\ttest_commit CCA &&\n' span_id:448) (Token id:Id.Lit_Chars val:'\n' span_id:449) (Token id:Id.Lit_Chars val:'\tgit rev-parse CC1 CC2 >expected &&\n' span_id:450) (Token id:Id.Lit_Chars val:'\tgit merge-base --all CCB CCA^^ CCA^^2 >actual &&\n' span_id:451) (Token id:Id.Lit_Chars val:'\n' span_id:452) (Token id:Id.Lit_Chars val:'\tsort expected >expected.sorted &&\n' span_id:453) (Token id:Id.Lit_Chars val:'\tsort actual >actual.sorted &&\n' span_id:454) (Token id:Id.Lit_Chars val:'\ttest_cmp expected.sorted actual.sorted\n' span_id:455) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'using reflog to find the fork point' span_id:462))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:466) (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:467) (Token id:Id.Lit_Chars val:'\tgit checkout -b base $E &&\n' span_id:468) (Token id:Id.Lit_Chars val:'\n' span_id:469) (Token id:Id.Lit_Chars val:'\t(\n' span_id:470) (Token id:Id.Lit_Chars val:'\t\tfor count in 1 2 3\n' span_id:471) (Token id:Id.Lit_Chars val:'\t\tdo\n' span_id:472) (Token id: Id.Lit_Chars val: '\t\t\tgit commit --allow-empty -m "Base commit #$count" &&\n' span_id: 473 ) (Token id:Id.Lit_Chars val:'\t\t\tgit rev-parse HEAD >expect$count &&\n' span_id:474) (Token id:Id.Lit_Chars val:'\t\t\tgit checkout -B derived &&\n' span_id:475) (Token id:Id.Lit_Chars val:'\t\t\tgit commit --allow-empty -m "Derived #$count" &&\n' span_id:476) (Token id: Id.Lit_Chars val: '\t\t\tgit rev-parse HEAD >derived$count &&\n' span_id: 477 ) (Token id:Id.Lit_Chars val:'\t\t\tgit checkout -B base $E || exit 1\n' span_id:478) (Token id:Id.Lit_Chars val:'\t\tdone\n' span_id:479) (Token id:Id.Lit_Chars val:'\n' span_id:480) (Token id:Id.Lit_Chars val:'\t\tfor count in 1 2 3\n' span_id:481) (Token id:Id.Lit_Chars val:'\t\tdo\n' span_id:482) (Token id: Id.Lit_Chars val: '\t\t\tgit merge-base --fork-point base $(cat derived$count) >actual &&\n' span_id: 483 ) (Token id:Id.Lit_Chars val:'\t\t\ttest_cmp expect$count actual || exit 1\n' span_id:484) (Token id:Id.Lit_Chars val:'\t\tdone\n' span_id:485) (Token id:Id.Lit_Chars val:'\n' span_id:486) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:487) (Token id: Id.Lit_Chars val: '\t# check that we correctly default to HEAD\n' span_id: 488 ) (Token id:Id.Lit_Chars val:'\tgit checkout derived &&\n' span_id:489) (Token id: Id.Lit_Chars val: '\tgit merge-base --fork-point base >actual &&\n' span_id: 490 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect3 actual\n' span_id:491) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'--fork-point works with empty reflog' span_id:498))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:502) (Token id: Id.Lit_Chars val: '\tgit -c core.logallrefupdates=false branch no-reflog base &&\n' span_id: 503 ) (Token id:Id.Lit_Chars val:'\tgit merge-base --fork-point no-reflog derived &&\n' span_id:504) (Token id:Id.Lit_Chars val:'\ttest_cmp expect3 actual\n' span_id:505) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'merge-base --octopus --all for complex tree' span_id:512))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:516) (Token id: Id.Lit_Chars val: '\t# Best common ancestor for JE, JAA and JDD is JC\n' span_id: 517 ) (Token id:Id.Lit_Chars val:'\t# JE\n' span_id:518) (Token id:Id.Lit_Chars val:'\t# / |\n' span_id:519) (Token id:Id.Lit_Chars val:'\t# / |\n' span_id:520) (Token id:Id.Lit_Chars val:'\t# / |\n' span_id:521) (Token id:Id.Lit_Chars val:'\t# JAA / |\n' span_id:522) (Token id:Id.Lit_Chars val:'\t# |\\ / |\n' span_id:523) (Token id:Id.Lit_Chars val:'\t# | \\ | JDD |\n' span_id:524) (Token id:Id.Lit_Chars val:'\t# | \\ |/ | |\n' span_id:525) (Token id:Id.Lit_Chars val:'\t# | JC JD |\n' span_id:526) (Token id:Id.Lit_Chars val:'\t# | | /| |\n' span_id:527) (Token id:Id.Lit_Chars val:'\t# | |/ | |\n' span_id:528) (Token id:Id.Lit_Chars val:'\t# JA | | |\n' span_id:529) (Token id:Id.Lit_Chars val:'\t# |\\ /| | |\n' span_id:530) (Token id:Id.Lit_Chars val:'\t# X JB | X X\n' span_id:531) (Token id:Id.Lit_Chars val:'\t# \\ \\ | / /\n' span_id:532) (Token id:Id.Lit_Chars val:'\t# \\__\\|/___/\n' span_id:533) (Token id:Id.Lit_Chars val:'\t# J\n' span_id:534) (Token id:Id.Lit_Chars val:'\ttest_commit J &&\n' span_id:535) (Token id:Id.Lit_Chars val:'\ttest_commit JB &&\n' span_id:536) (Token id:Id.Lit_Chars val:'\tgit reset --hard J &&\n' span_id:537) (Token id:Id.Lit_Chars val:'\ttest_commit JC &&\n' span_id:538) (Token id:Id.Lit_Chars val:'\tgit reset --hard J &&\n' span_id:539) (Token id:Id.Lit_Chars val:'\ttest_commit JTEMP1 &&\n' span_id:540) (Token id:Id.Lit_Chars val:'\ttest_merge JA JB &&\n' span_id:541) (Token id:Id.Lit_Chars val:'\ttest_merge JAA JC &&\n' span_id:542) (Token id:Id.Lit_Chars val:'\tgit reset --hard J &&\n' span_id:543) (Token id:Id.Lit_Chars val:'\ttest_commit JTEMP2 &&\n' span_id:544) (Token id:Id.Lit_Chars val:'\ttest_merge JD JB &&\n' span_id:545) (Token id:Id.Lit_Chars val:'\ttest_merge JDD JC &&\n' span_id:546) (Token id:Id.Lit_Chars val:'\tgit reset --hard J &&\n' span_id:547) (Token id:Id.Lit_Chars val:'\ttest_commit JTEMP3 &&\n' span_id:548) (Token id:Id.Lit_Chars val:'\ttest_merge JE JC &&\n' span_id:549) (Token id:Id.Lit_Chars val:'\tgit rev-parse JC >expected &&\n' span_id:550) (Token id: Id.Lit_Chars val: '\tgit merge-base --all --octopus JAA JDD JE >actual &&\n' span_id: 551 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:552) ) } ) (C {(test_done)}) ] )