(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:'compare & swap push force/delete safety' span_id:6))} spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (command.ShFunction name: setup_srcdst_basic body: (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp] children: [ (C {(rm)} {(-fr)} {(src)} {(dst)}) (C {(git)} {(clone)} {(--no-local)} {(.)} {(src)}) (C {(git)} {(clone)} {(--no-local)} {(src)} {(dst)}) (command.Subshell command_list: (command.CommandList children: [ (command.AndOr ops: [Id.Op_DAmp] children: [ (C {(cd)} {(src)}) (C {(git)} {(checkout)} {(HEAD) (Id.Lit_Other '^') (0)}) ] ) ] ) ) ] ) ] ) ) (C {(test_expect_success)} {(setup)} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:88) (Token id:Id.Lit_Chars val:'\t# create template repository\n' span_id:89) (Token id:Id.Lit_Chars val:'\ttest_commit A &&\n' span_id:90) (Token id:Id.Lit_Chars val:'\ttest_commit B &&\n' span_id:91) (Token id:Id.Lit_Chars val:'\ttest_commit C\n' span_id:92) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push to update (protected)' span_id:99))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:103) (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:104) (Token id:Id.Lit_Chars val:'\t(\n' span_id:105) (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:106) (Token id:Id.Lit_Chars val:'\t\ttest_commit D &&\n' span_id:107) (Token id: Id.Lit_Chars val: '\t\ttest_must_fail git push --force-with-lease=master:master origin master 2>err &&\n' span_id: 108 ) (Token id:Id.Lit_Chars val:'\t\tgrep "stale info" err\n' span_id:109) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:110) (Token id:Id.Lit_Chars val:'\tgit ls-remote . refs/heads/master >expect &&\n' span_id:111) (Token id: Id.Lit_Chars val: '\tgit ls-remote src refs/heads/master >actual &&\n' span_id: 112 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:113) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push to update (protected, forced)' span_id:120))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:124) (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:125) (Token id:Id.Lit_Chars val:'\t(\n' span_id:126) (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:127) (Token id:Id.Lit_Chars val:'\t\ttest_commit D &&\n' span_id:128) (Token id: Id.Lit_Chars val: '\t\tgit push --force --force-with-lease=master:master origin master 2>err &&\n' span_id: 129 ) (Token id:Id.Lit_Chars val:'\t\tgrep "forced update" err\n' span_id:130) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:131) (Token id:Id.Lit_Chars val:'\tgit ls-remote dst refs/heads/master >expect &&\n' span_id:132) (Token id: Id.Lit_Chars val: '\tgit ls-remote src refs/heads/master >actual &&\n' span_id: 133 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:134) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push to update (protected, tracking)' span_id:141))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:145) (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:146) (Token id:Id.Lit_Chars val:'\t(\n' span_id:147) (Token id:Id.Lit_Chars val:'\t\tcd src &&\n' span_id:148) (Token id:Id.Lit_Chars val:'\t\tgit checkout master &&\n' span_id:149) (Token id:Id.Lit_Chars val:'\t\ttest_commit D &&\n' span_id:150) (Token id:Id.Lit_Chars val:'\t\tgit checkout HEAD^0\n' span_id:151) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:152) (Token id:Id.Lit_Chars val:'\tgit ls-remote src refs/heads/master >expect &&\n' span_id:153) (Token id:Id.Lit_Chars val:'\t(\n' span_id:154) (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:155) (Token id:Id.Lit_Chars val:'\t\ttest_commit E &&\n' span_id:156) (Token id:Id.Lit_Chars val:'\t\tgit ls-remote . refs/remotes/origin/master >expect &&\n' span_id:157) (Token id: Id.Lit_Chars val: '\t\ttest_must_fail git push --force-with-lease=master origin master &&\n' span_id: 158 ) (Token id:Id.Lit_Chars val:'\t\tgit ls-remote . refs/remotes/origin/master >actual &&\n' span_id:159) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect actual\n' span_id:160) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:161) (Token id: Id.Lit_Chars val: '\tgit ls-remote src refs/heads/master >actual &&\n' span_id: 162 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:163) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push to update (protected, tracking, forced)' span_id:170))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:174) (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:175) (Token id:Id.Lit_Chars val:'\t(\n' span_id:176) (Token id:Id.Lit_Chars val:'\t\tcd src &&\n' span_id:177) (Token id:Id.Lit_Chars val:'\t\tgit checkout master &&\n' span_id:178) (Token id:Id.Lit_Chars val:'\t\ttest_commit D &&\n' span_id:179) (Token id:Id.Lit_Chars val:'\t\tgit checkout HEAD^0\n' span_id:180) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:181) (Token id:Id.Lit_Chars val:'\t(\n' span_id:182) (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:183) (Token id:Id.Lit_Chars val:'\t\ttest_commit E &&\n' span_id:184) (Token id: Id.Lit_Chars val: '\t\tgit ls-remote . refs/remotes/origin/master >expect &&\n' span_id: 185 ) (Token id: Id.Lit_Chars val: '\t\tgit push --force --force-with-lease=master origin master\n' span_id: 186 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:187) (Token id: Id.Lit_Chars val: '\tgit ls-remote dst refs/heads/master >expect &&\n' span_id: 188 ) (Token id:Id.Lit_Chars val:'\tgit ls-remote src refs/heads/master >actual &&\n' span_id:189) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:190) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push to update (allowed)' span_id:197))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:201) (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:202) (Token id:Id.Lit_Chars val:'\t(\n' span_id:203) (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:204) (Token id:Id.Lit_Chars val:'\t\ttest_commit D &&\n' span_id:205) (Token id: Id.Lit_Chars val: '\t\tgit push --force-with-lease=master:master^ origin master\n' span_id: 206 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:207) (Token id: Id.Lit_Chars val: '\tgit ls-remote dst refs/heads/master >expect &&\n' span_id: 208 ) (Token id:Id.Lit_Chars val:'\tgit ls-remote src refs/heads/master >actual &&\n' span_id:209) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:210) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push to update (allowed, tracking)' span_id:217))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:221) (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:222) (Token id:Id.Lit_Chars val:'\t(\n' span_id:223) (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:224) (Token id:Id.Lit_Chars val:'\t\ttest_commit D &&\n' span_id:225) (Token id: Id.Lit_Chars val: '\t\tgit push --force-with-lease=master origin master 2>err &&\n' span_id: 226 ) (Token id:Id.Lit_Chars val:'\t\t! grep "forced update" err\n' span_id:227) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:228) (Token id:Id.Lit_Chars val:'\tgit ls-remote dst refs/heads/master >expect &&\n' span_id:229) (Token id: Id.Lit_Chars val: '\tgit ls-remote src refs/heads/master >actual &&\n' span_id: 230 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:231) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push to update (allowed even though no-ff)' span_id:238))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:242) (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:243) (Token id:Id.Lit_Chars val:'\t(\n' span_id:244) (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:245) (Token id:Id.Lit_Chars val:'\t\tgit reset --hard HEAD^ &&\n' span_id:246) (Token id:Id.Lit_Chars val:'\t\ttest_commit D &&\n' span_id:247) (Token id: Id.Lit_Chars val: '\t\tgit push --force-with-lease=master origin master 2>err &&\n' span_id: 248 ) (Token id:Id.Lit_Chars val:'\t\tgrep "forced update" err\n' span_id:249) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:250) (Token id:Id.Lit_Chars val:'\tgit ls-remote dst refs/heads/master >expect &&\n' span_id:251) (Token id: Id.Lit_Chars val: '\tgit ls-remote src refs/heads/master >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:'push to delete (protected)' span_id:260))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:264) (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:265) (Token id:Id.Lit_Chars val:'\tgit ls-remote src refs/heads/master >expect &&\n' span_id:266) (Token id:Id.Lit_Chars val:'\t(\n' span_id:267) (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:268) (Token id: Id.Lit_Chars val: '\t\ttest_must_fail git push --force-with-lease=master:master^ origin :master\n' span_id: 269 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:270) (Token id: Id.Lit_Chars val: '\tgit ls-remote src refs/heads/master >actual &&\n' span_id: 271 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:272) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push to delete (protected, forced)' span_id:279))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:283) (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:284) (Token id:Id.Lit_Chars val:'\t(\n' span_id:285) (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:286) (Token id: Id.Lit_Chars val: '\t\tgit push --force --force-with-lease=master:master^ origin :master\n' span_id: 287 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:288) (Token id:Id.Lit_Chars val:'\t>expect &&\n' span_id:289) (Token id:Id.Lit_Chars val:'\tgit ls-remote src refs/heads/master >actual &&\n' span_id:290) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:291) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push to delete (allowed)' span_id:298))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:302) (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:303) (Token id:Id.Lit_Chars val:'\t(\n' span_id:304) (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:305) (Token id: Id.Lit_Chars val: '\t\tgit push --force-with-lease=master origin :master 2>err &&\n' span_id: 306 ) (Token id:Id.Lit_Chars val:'\t\tgrep deleted err\n' span_id:307) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:308) (Token id:Id.Lit_Chars val:'\t>expect &&\n' span_id:309) (Token id: Id.Lit_Chars val: '\tgit ls-remote src refs/heads/master >actual &&\n' span_id: 310 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:311) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'cover everything with default force-with-lease (protected)' span_id: 318 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:322) (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:323) (Token id:Id.Lit_Chars val:'\t(\n' span_id:324) (Token id:Id.Lit_Chars val:'\t\tcd src &&\n' span_id:325) (Token id:Id.Lit_Chars val:'\t\tgit branch naster master^\n' span_id:326) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:327) (Token id:Id.Lit_Chars val:'\tgit ls-remote src refs/heads/\\* >expect &&\n' span_id:328) (Token id:Id.Lit_Chars val:'\t(\n' span_id:329) (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:330) (Token id: Id.Lit_Chars val: '\t\ttest_must_fail git push --force-with-lease origin master master:naster\n' span_id: 331 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:332) (Token id: Id.Lit_Chars val: '\tgit ls-remote src refs/heads/\\* >actual &&\n' span_id: 333 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:334) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'cover everything with default force-with-lease (allowed)' span_id: 341 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:345) (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:346) (Token id:Id.Lit_Chars val:'\t(\n' span_id:347) (Token id:Id.Lit_Chars val:'\t\tcd src &&\n' span_id:348) (Token id:Id.Lit_Chars val:'\t\tgit branch naster master^\n' span_id:349) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:350) (Token id:Id.Lit_Chars val:'\t(\n' span_id:351) (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:352) (Token id:Id.Lit_Chars val:'\t\tgit fetch &&\n' span_id:353) (Token id: Id.Lit_Chars val: '\t\tgit push --force-with-lease origin master master:naster\n' span_id: 354 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:355) (Token id: Id.Lit_Chars val: '\tgit ls-remote dst refs/heads/master |\n' span_id: 356 ) (Token id:Id.Lit_Chars val:'\tsed -e "s/master/naster/" >expect &&\n' span_id:357) (Token id: Id.Lit_Chars val: '\tgit ls-remote src refs/heads/naster >actual &&\n' span_id: 358 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:359) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'new branch covered by force-with-lease' span_id:366))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:370) (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:371) (Token id:Id.Lit_Chars val:'\t(\n' span_id:372) (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:373) (Token id:Id.Lit_Chars val:'\t\tgit branch branch master &&\n' span_id:374) (Token id: Id.Lit_Chars val: '\t\tgit push --force-with-lease=branch origin branch\n' span_id: 375 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:376) (Token id: Id.Lit_Chars val: '\tgit ls-remote dst refs/heads/branch >expect &&\n' span_id: 377 ) (Token id:Id.Lit_Chars val:'\tgit ls-remote src refs/heads/branch >actual &&\n' span_id:378) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:379) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'new branch covered by force-with-lease (explicit)' span_id: 386 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:390) (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:391) (Token id:Id.Lit_Chars val:'\t(\n' span_id:392) (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:393) (Token id:Id.Lit_Chars val:'\t\tgit branch branch master &&\n' span_id:394) (Token id: Id.Lit_Chars val: '\t\tgit push --force-with-lease=branch: origin branch\n' span_id: 395 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:396) (Token id: Id.Lit_Chars val: '\tgit ls-remote dst refs/heads/branch >expect &&\n' span_id: 397 ) (Token id:Id.Lit_Chars val:'\tgit ls-remote src refs/heads/branch >actual &&\n' span_id:398) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:399) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'new branch already exists' span_id:406))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:410) (Token id:Id.Lit_Chars val:'\tsetup_srcdst_basic &&\n' span_id:411) (Token id:Id.Lit_Chars val:'\t(\n' span_id:412) (Token id:Id.Lit_Chars val:'\t\tcd src &&\n' span_id:413) (Token id:Id.Lit_Chars val:'\t\tgit checkout -b branch master &&\n' span_id:414) (Token id:Id.Lit_Chars val:'\t\ttest_commit F\n' span_id:415) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:416) (Token id:Id.Lit_Chars val:'\t(\n' span_id:417) (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:418) (Token id:Id.Lit_Chars val:'\t\tgit branch branch master &&\n' span_id:419) (Token id: Id.Lit_Chars val: '\t\ttest_must_fail git push --force-with-lease=branch: origin branch\n' span_id: 420 ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:421) ) } ) (C {(test_done)}) ] )