(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: 'push to a repository that borrows from elsewhere' span_id: 6 ) ) } spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(setup)} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:20) (Token id:Id.Lit_Chars val:'\tmkdir alice-pub &&\n' span_id:21) (Token id:Id.Lit_Chars val:'\t(\n' span_id:22) (Token id:Id.Lit_Chars val:'\t\tcd alice-pub &&\n' span_id:23) (Token id:Id.Lit_Chars val:'\t\tGIT_DIR=. git init\n' span_id:24) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:25) (Token id:Id.Lit_Chars val:'\tmkdir alice-work &&\n' span_id:26) (Token id:Id.Lit_Chars val:'\t(\n' span_id:27) (Token id:Id.Lit_Chars val:'\t\tcd alice-work &&\n' span_id:28) (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:29) (Token id:Id.Lit_Chars val:'\t\t>file &&\n' span_id:30) (Token id:Id.Lit_Chars val:'\t\tgit add . &&\n' span_id:31) (Token id:Id.Lit_Chars val:'\t\tgit commit -m initial &&\n' span_id:32) (Token id:Id.Lit_Chars val:'\t\tgit push ../alice-pub master\n' span_id:33) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:34) (Token id:Id.Lit_Chars val:'\n' span_id:35) (Token id: Id.Lit_Chars val: '\t# Project Bob is a fork of project Alice\n' span_id: 36 ) (Token id:Id.Lit_Chars val:'\tmkdir bob-pub &&\n' span_id:37) (Token id:Id.Lit_Chars val:'\t(\n' span_id:38) (Token id:Id.Lit_Chars val:'\t\tcd bob-pub &&\n' span_id:39) (Token id:Id.Lit_Chars val:'\t\tGIT_DIR=. git init &&\n' span_id:40) (Token id:Id.Lit_Chars val:'\t\tmkdir -p objects/info &&\n' span_id:41) (Token id: Id.Lit_Chars val: '\t\techo ../../alice-pub/objects >objects/info/alternates\n' span_id: 42 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:43) (Token id:Id.Lit_Chars val:'\tgit clone alice-pub bob-work &&\n' span_id:44) (Token id:Id.Lit_Chars val:'\t(\n' span_id:45) (Token id:Id.Lit_Chars val:'\t\tcd bob-work &&\n' span_id:46) (Token id:Id.Lit_Chars val:'\t\tgit push ../bob-pub master\n' span_id:47) (Token id:Id.Lit_Chars val:'\t)\n' span_id:48) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'alice works and pushes' span_id:55))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:59) (Token id:Id.Lit_Chars val:'\t(\n' span_id:60) (Token id:Id.Lit_Chars val:'\t\tcd alice-work &&\n' span_id:61) (Token id:Id.Lit_Chars val:'\t\techo more >file &&\n' span_id:62) (Token id:Id.Lit_Chars val:'\t\tgit commit -a -m second &&\n' span_id:63) (Token id:Id.Lit_Chars val:'\t\tgit push ../alice-pub :\n' span_id:64) (Token id:Id.Lit_Chars val:'\t)\n' span_id:65) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'bob fetches from alice, works and pushes' span_id:72))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:76) (Token id:Id.Lit_Chars val:'\t(\n' span_id:77) (Token id: Id.Lit_Chars val: '\t\t# Bob acquires what Alice did in his work tree first.\n' span_id: 78 ) (Token id:Id.Lit_Chars val:'\t\t# Even though these objects are not directly in\n' span_id:79) (Token id: Id.Lit_Chars val: '\t\t# the public repository of Bob, this push does not\n' span_id: 80 ) (Token id:Id.Lit_Chars val:'\t\t# need to send the commit Bob received from Alice\n' span_id:81) (Token id: Id.Lit_Chars val: '\t\t# to his public repository, as all the object Alice\n' span_id: 82 ) (Token id:Id.Lit_Chars val:'\t\t# has at her public repository are available to it\n' span_id:83) (Token id:Id.Lit_Chars val:'\t\t# via its alternates.\n' span_id:84) (Token id:Id.Lit_Chars val:'\t\tcd bob-work &&\n' span_id:85) (Token id:Id.Lit_Chars val:'\t\tgit pull ../alice-pub master &&\n' span_id:86) (Token id:Id.Lit_Chars val:'\t\techo more bob >file &&\n' span_id:87) (Token id:Id.Lit_Chars val:'\t\tgit commit -a -m third &&\n' span_id:88) (Token id:Id.Lit_Chars val:'\t\tgit push ../bob-pub :\n' span_id:89) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:90) (Token id:Id.Lit_Chars val:'\n' span_id:91) (Token id: Id.Lit_Chars val: '\t# Check that the second commit by Alice is not sent\n' span_id: 92 ) (Token id:Id.Lit_Chars val:'\t# to ../bob-pub\n' span_id:93) (Token id:Id.Lit_Chars val:'\t(\n' span_id:94) (Token id:Id.Lit_Chars val:'\t\tcd bob-pub &&\n' span_id:95) (Token id:Id.Lit_Chars val:'\t\tsecond=$(git rev-parse HEAD^) &&\n' span_id:96) (Token id:Id.Lit_Chars val:'\t\trm -f objects/info/alternates &&\n' span_id:97) (Token id: Id.Lit_Chars val: '\t\ttest_must_fail git cat-file -t $second &&\n' span_id: 98 ) (Token id:Id.Lit_Chars val:'\t\techo ../../alice-pub/objects >objects/info/alternates\n' span_id:99) (Token id:Id.Lit_Chars val:'\t)\n' span_id:100) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'clean-up in case the previous failed' span_id:107))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:111) (Token id:Id.Lit_Chars val:'\t(\n' span_id:112) (Token id:Id.Lit_Chars val:'\t\tcd bob-pub &&\n' span_id:113) (Token id: Id.Lit_Chars val: '\t\techo ../../alice-pub/objects >objects/info/alternates\n' span_id: 114 ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:115) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'alice works and pushes again' span_id:122))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:126) (Token id:Id.Lit_Chars val:'\t(\n' span_id:127) (Token id:Id.Lit_Chars val:'\t\t# Alice does not care what Bob does. She does not\n' span_id:128) (Token id: Id.Lit_Chars val: '\t\t# even have to be aware of his existence. She just\n' span_id: 129 ) (Token id:Id.Lit_Chars val:'\t\t# keeps working and pushing\n' span_id:130) (Token id:Id.Lit_Chars val:'\t\tcd alice-work &&\n' span_id:131) (Token id:Id.Lit_Chars val:'\t\techo more alice >file &&\n' span_id:132) (Token id:Id.Lit_Chars val:'\t\tgit commit -a -m fourth &&\n' span_id:133) (Token id:Id.Lit_Chars val:'\t\tgit push ../alice-pub :\n' span_id:134) (Token id:Id.Lit_Chars val:'\t)\n' span_id:135) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'bob works and pushes' span_id:142))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:146) (Token id:Id.Lit_Chars val:'\t(\n' span_id:147) (Token id:Id.Lit_Chars val:'\t\t# This time Bob does not pull from Alice, and\n' span_id:148) (Token id: Id.Lit_Chars val: '\t\t# the master branch at her public repository points\n' span_id: 149 ) (Token id:Id.Lit_Chars val:'\t\t# at a commit Bob does not know about. This should\n' span_id:150) (Token id: Id.Lit_Chars val: '\t\t# not prevent the push by Bob from succeeding.\n' span_id: 151 ) (Token id:Id.Lit_Chars val:'\t\tcd bob-work &&\n' span_id:152) (Token id:Id.Lit_Chars val:'\t\techo yet more bob >file &&\n' span_id:153) (Token id:Id.Lit_Chars val:'\t\tgit commit -a -m fifth &&\n' span_id:154) (Token id:Id.Lit_Chars val:'\t\tgit push ../bob-pub :\n' span_id:155) (Token id:Id.Lit_Chars val:'\t)\n' span_id:156) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'alice works and pushes yet again' span_id:163))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:167) (Token id:Id.Lit_Chars val:'\t(\n' span_id:168) (Token id:Id.Lit_Chars val:'\t\t# Alice does not care what Bob does. She does not\n' span_id:169) (Token id: Id.Lit_Chars val: '\t\t# even have to be aware of his existence. She just\n' span_id: 170 ) (Token id:Id.Lit_Chars val:'\t\t# keeps working and pushing\n' span_id:171) (Token id:Id.Lit_Chars val:'\t\tcd alice-work &&\n' span_id:172) (Token id:Id.Lit_Chars val:'\t\techo more and more alice >file &&\n' span_id:173) (Token id:Id.Lit_Chars val:'\t\tgit commit -a -m sixth.1 &&\n' span_id:174) (Token id:Id.Lit_Chars val:'\t\techo more and more alice >>file &&\n' span_id:175) (Token id:Id.Lit_Chars val:'\t\tgit commit -a -m sixth.2 &&\n' span_id:176) (Token id:Id.Lit_Chars val:'\t\techo more and more alice >>file &&\n' span_id:177) (Token id:Id.Lit_Chars val:'\t\tgit commit -a -m sixth.3 &&\n' span_id:178) (Token id:Id.Lit_Chars val:'\t\tgit push ../alice-pub :\n' span_id:179) (Token id:Id.Lit_Chars val:'\t)\n' span_id:180) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'bob works and pushes again' span_id:187))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:191) (Token id:Id.Lit_Chars val:'\t(\n' span_id:192) (Token id:Id.Lit_Chars val:'\t\tcd alice-pub &&\n' span_id:193) (Token id: Id.Lit_Chars val: '\t\tgit cat-file commit master >../bob-work/commit\n' span_id: 194 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:195) (Token id:Id.Lit_Chars val:'\t(\n' span_id:196) (Token id: Id.Lit_Chars val: '\t\t# This time Bob does not pull from Alice, and\n' span_id: 197 ) (Token id:Id.Lit_Chars val:'\t\t# the master branch at her public repository points\n' span_id:198) (Token id: Id.Lit_Chars val: '\t\t# at a commit Bob does not fully know about, but\n' span_id: 199 ) (Token id:Id.Lit_Chars val:'\t\t# he happens to have the commit object (but not the\n' span_id:200) (Token id: Id.Lit_Chars val: '\t\t# necessary tree) in his repository from Alice.\n' span_id: 201 ) (Token id:Id.Lit_Chars val:'\t\t# This should not prevent the push by Bob from\n' span_id:202) (Token id:Id.Lit_Chars val:'\t\t# succeeding.\n' span_id:203) (Token id:Id.Lit_Chars val:'\t\tcd bob-work &&\n' span_id:204) (Token id: Id.Lit_Chars val: '\t\tgit hash-object -t commit -w commit &&\n' span_id: 205 ) (Token id:Id.Lit_Chars val:'\t\techo even more bob >file &&\n' span_id:206) (Token id:Id.Lit_Chars val:'\t\tgit commit -a -m seventh &&\n' span_id:207) (Token id:Id.Lit_Chars val:'\t\tgit push ../bob-pub :\n' span_id:208) (Token id:Id.Lit_Chars val:'\t)\n' span_id:209) ) } ) (C {(test_done)}) ] )