(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: 'pushing to a repository using the atomic push option' span_id: 6 ) ) } spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (command.ShFunction name: mk_repo_pair body: (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp] children: [ (C {(rm)} {(-rf)} {(workbench)} {(upstream)}) (C {(test_create_repo)} {(upstream)}) (C {(test_create_repo)} {(workbench)}) (command.Subshell command_list: (command.CommandList children: [ (command.AndOr ops: [Id.Op_DAmp] children: [ (C {(cd)} {(upstream)}) (C {(git)} {(config)} {(receive.denyCurrentBranch)} {(warn)}) ] ) ] ) ) (command.Subshell command_list: (command.CommandList children: [ (command.AndOr ops: [Id.Op_DAmp] children: [ (C {(cd)} {(workbench)}) (C {(git)} {(remote)} {(add)} {(up)} {(../upstream)}) ] ) ] ) ) ] ) ] ) ) (command.ShFunction name: test_refs body: (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp] children: [ (C {(test)} {($ Id.VSub_Pound '$#')} {(Id.Lit_Equals '=')} {(2)}) (command.Simple words: [ {(git)} {(-C)} {(upstream)} {(rev-parse)} {(--verify)} {(DQ ($ Id.VSub_Number '$1'))} ] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:137) fd: -1 arg_word: {(expect)} ) ] ) (command.Simple words: [ {(git)} {(-C)} {(workbench)} {(rev-parse)} {(--verify)} {(DQ ($ Id.VSub_Number '$2'))} ] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:157) fd: -1 arg_word: {(actual)} ) ] ) (C {(test_cmp)} {(expect)} {(actual)}) ] ) ] ) ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'atomic push works for a single branch' span_id:175))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:179) (Token id:Id.Lit_Chars val:'\tmk_repo_pair &&\n' span_id:180) (Token id:Id.Lit_Chars val:'\t(\n' span_id:181) (Token id:Id.Lit_Chars val:'\t\tcd workbench &&\n' span_id:182) (Token id:Id.Lit_Chars val:'\t\ttest_commit one &&\n' span_id:183) (Token id:Id.Lit_Chars val:'\t\tgit push --mirror up &&\n' span_id:184) (Token id:Id.Lit_Chars val:'\t\ttest_commit two &&\n' span_id:185) (Token id:Id.Lit_Chars val:'\t\tgit push --atomic up master\n' span_id:186) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:187) (Token id:Id.Lit_Chars val:'\ttest_refs master master\n' span_id:188) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'atomic push works for two branches' span_id:195))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:199) (Token id:Id.Lit_Chars val:'\tmk_repo_pair &&\n' span_id:200) (Token id:Id.Lit_Chars val:'\t(\n' span_id:201) (Token id:Id.Lit_Chars val:'\t\tcd workbench &&\n' span_id:202) (Token id:Id.Lit_Chars val:'\t\ttest_commit one &&\n' span_id:203) (Token id:Id.Lit_Chars val:'\t\tgit branch second &&\n' span_id:204) (Token id:Id.Lit_Chars val:'\t\tgit push --mirror up &&\n' span_id:205) (Token id:Id.Lit_Chars val:'\t\ttest_commit two &&\n' span_id:206) (Token id:Id.Lit_Chars val:'\t\tgit checkout second &&\n' span_id:207) (Token id:Id.Lit_Chars val:'\t\ttest_commit three &&\n' span_id:208) (Token id:Id.Lit_Chars val:'\t\tgit push --atomic up master second\n' span_id:209) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:210) (Token id:Id.Lit_Chars val:'\ttest_refs master master &&\n' span_id:211) (Token id:Id.Lit_Chars val:'\ttest_refs second second\n' span_id:212) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'atomic push works in combination with --mirror' span_id:219))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:223) (Token id:Id.Lit_Chars val:'\tmk_repo_pair &&\n' span_id:224) (Token id:Id.Lit_Chars val:'\t(\n' span_id:225) (Token id:Id.Lit_Chars val:'\t\tcd workbench &&\n' span_id:226) (Token id:Id.Lit_Chars val:'\t\ttest_commit one &&\n' span_id:227) (Token id:Id.Lit_Chars val:'\t\tgit checkout -b second &&\n' span_id:228) (Token id:Id.Lit_Chars val:'\t\ttest_commit two &&\n' span_id:229) (Token id:Id.Lit_Chars val:'\t\tgit push --atomic --mirror up\n' span_id:230) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:231) (Token id:Id.Lit_Chars val:'\ttest_refs master master &&\n' span_id:232) (Token id:Id.Lit_Chars val:'\ttest_refs second second\n' span_id:233) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'atomic push works in combination with --force' span_id:240))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:244) (Token id:Id.Lit_Chars val:'\tmk_repo_pair &&\n' span_id:245) (Token id:Id.Lit_Chars val:'\t(\n' span_id:246) (Token id:Id.Lit_Chars val:'\t\tcd workbench &&\n' span_id:247) (Token id:Id.Lit_Chars val:'\t\ttest_commit one &&\n' span_id:248) (Token id:Id.Lit_Chars val:'\t\tgit branch second master &&\n' span_id:249) (Token id:Id.Lit_Chars val:'\t\ttest_commit two_a &&\n' span_id:250) (Token id:Id.Lit_Chars val:'\t\tgit checkout second &&\n' span_id:251) (Token id:Id.Lit_Chars val:'\t\ttest_commit two_b &&\n' span_id:252) (Token id:Id.Lit_Chars val:'\t\ttest_commit three_b &&\n' span_id:253) (Token id:Id.Lit_Chars val:'\t\ttest_commit four &&\n' span_id:254) (Token id:Id.Lit_Chars val:'\t\tgit push --mirror up &&\n' span_id:255) (Token id:Id.Lit_Chars val:'\t\t# The actual test is below\n' span_id:256) (Token id:Id.Lit_Chars val:'\t\tgit checkout master &&\n' span_id:257) (Token id:Id.Lit_Chars val:'\t\ttest_commit three_a &&\n' span_id:258) (Token id:Id.Lit_Chars val:'\t\tgit checkout second &&\n' span_id:259) (Token id:Id.Lit_Chars val:'\t\tgit reset --hard HEAD^ &&\n' span_id:260) (Token id: Id.Lit_Chars val: '\t\tgit push --force --atomic up master second\n' span_id: 261 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:262) (Token id:Id.Lit_Chars val:'\ttest_refs master master &&\n' span_id:263) (Token id:Id.Lit_Chars val:'\ttest_refs second second\n' span_id:264) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'atomic push fails if one branch fails' span_id:280))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:284) (Token id:Id.Lit_Chars val:'\tmk_repo_pair &&\n' span_id:285) (Token id:Id.Lit_Chars val:'\t(\n' span_id:286) (Token id:Id.Lit_Chars val:'\t\tcd workbench &&\n' span_id:287) (Token id:Id.Lit_Chars val:'\t\ttest_commit one &&\n' span_id:288) (Token id:Id.Lit_Chars val:'\t\tgit checkout -b second master &&\n' span_id:289) (Token id:Id.Lit_Chars val:'\t\ttest_commit two &&\n' span_id:290) (Token id:Id.Lit_Chars val:'\t\ttest_commit three &&\n' span_id:291) (Token id:Id.Lit_Chars val:'\t\ttest_commit four &&\n' span_id:292) (Token id:Id.Lit_Chars val:'\t\tgit push --mirror up &&\n' span_id:293) (Token id:Id.Lit_Chars val:'\t\tgit reset --hard HEAD~2 &&\n' span_id:294) (Token id:Id.Lit_Chars val:'\t\ttest_commit five &&\n' span_id:295) (Token id:Id.Lit_Chars val:'\t\tgit checkout master &&\n' span_id:296) (Token id:Id.Lit_Chars val:'\t\ttest_commit six &&\n' span_id:297) (Token id:Id.Lit_Chars val:'\t\ttest_must_fail git push --atomic --all up\n' span_id:298) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:299) (Token id:Id.Lit_Chars val:'\ttest_refs master HEAD@{7} &&\n' span_id:300) (Token id:Id.Lit_Chars val:'\ttest_refs second HEAD@{4}\n' span_id:301) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'atomic push fails if one tag fails remotely' span_id:308))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:312) (Token id:Id.Lit_Chars val:'\t# prepare the repo\n' span_id:313) (Token id:Id.Lit_Chars val:'\tmk_repo_pair &&\n' span_id:314) (Token id:Id.Lit_Chars val:'\t(\n' span_id:315) (Token id:Id.Lit_Chars val:'\t\tcd workbench &&\n' span_id:316) (Token id:Id.Lit_Chars val:'\t\ttest_commit one &&\n' span_id:317) (Token id:Id.Lit_Chars val:'\t\tgit checkout -b second master &&\n' span_id:318) (Token id:Id.Lit_Chars val:'\t\ttest_commit two &&\n' span_id:319) (Token id:Id.Lit_Chars val:'\t\tgit push --mirror up\n' span_id:320) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:321) (Token id:Id.Lit_Chars val:'\t# a third party modifies the server side:\n' span_id:322) (Token id:Id.Lit_Chars val:'\t(\n' span_id:323) (Token id:Id.Lit_Chars val:'\t\tcd upstream &&\n' span_id:324) (Token id:Id.Lit_Chars val:'\t\tgit checkout second &&\n' span_id:325) (Token id:Id.Lit_Chars val:'\t\tgit tag test_tag second\n' span_id:326) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:327) (Token id:Id.Lit_Chars val:'\t# see if we can now push both branches.\n' span_id:328) (Token id:Id.Lit_Chars val:'\t(\n' span_id:329) (Token id:Id.Lit_Chars val:'\t\tcd workbench &&\n' span_id:330) (Token id:Id.Lit_Chars val:'\t\tgit checkout master &&\n' span_id:331) (Token id:Id.Lit_Chars val:'\t\ttest_commit three &&\n' span_id:332) (Token id:Id.Lit_Chars val:'\t\tgit checkout second &&\n' span_id:333) (Token id:Id.Lit_Chars val:'\t\ttest_commit four &&\n' span_id:334) (Token id:Id.Lit_Chars val:'\t\tgit tag test_tag &&\n' span_id:335) (Token id: Id.Lit_Chars val: '\t\ttest_must_fail git push --tags --atomic up master second\n' span_id: 336 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:337) (Token id:Id.Lit_Chars val:'\ttest_refs master HEAD@{3} &&\n' span_id:338) (Token id:Id.Lit_Chars val:'\ttest_refs second HEAD@{1}\n' span_id:339) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'atomic push obeys update hook preventing a branch to be pushed' span_id: 346 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:350) (Token id:Id.Lit_Chars val:'\tmk_repo_pair &&\n' span_id:351) (Token id:Id.Lit_Chars val:'\t(\n' span_id:352) (Token id:Id.Lit_Chars val:'\t\tcd workbench &&\n' span_id:353) (Token id:Id.Lit_Chars val:'\t\ttest_commit one &&\n' span_id:354) (Token id:Id.Lit_Chars val:'\t\tgit checkout -b second master &&\n' span_id:355) (Token id:Id.Lit_Chars val:'\t\ttest_commit two &&\n' span_id:356) (Token id:Id.Lit_Chars val:'\t\tgit push --mirror up\n' span_id:357) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:358) (Token id:Id.Lit_Chars val:'\t(\n' span_id:359) (Token id:Id.Lit_Chars val:'\t\tcd upstream &&\n' span_id:360) (Token id:Id.Lit_Chars val:'\t\tHOOKDIR="$(git rev-parse --git-dir)/hooks" &&\n' span_id:361) (Token id:Id.Lit_Chars val:'\t\tHOOK="$HOOKDIR/update" &&\n' span_id:362) (Token id:Id.Lit_Chars val:'\t\tmkdir -p "$HOOKDIR" &&\n' span_id:363) (Token id:Id.Lit_Chars val:'\t\twrite_script "$HOOK" <<-\\EOF\n' span_id:364) (Token id:Id.Lit_Chars val:'\t\t\t# only allow update to master from now on\n' span_id:365) (Token id:Id.Lit_Chars val:'\t\t\ttest "$1" = "refs/heads/master"\n' span_id:366) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:367) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:368) (Token id:Id.Lit_Chars val:'\t(\n' span_id:369) (Token id:Id.Lit_Chars val:'\t\tcd workbench &&\n' span_id:370) (Token id:Id.Lit_Chars val:'\t\tgit checkout master &&\n' span_id:371) (Token id:Id.Lit_Chars val:'\t\ttest_commit three &&\n' span_id:372) (Token id:Id.Lit_Chars val:'\t\tgit checkout second &&\n' span_id:373) (Token id:Id.Lit_Chars val:'\t\ttest_commit four &&\n' span_id:374) (Token id: Id.Lit_Chars val: '\t\ttest_must_fail git push --atomic up master second\n' span_id: 375 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:376) (Token id:Id.Lit_Chars val:'\ttest_refs master HEAD@{3} &&\n' span_id:377) (Token id:Id.Lit_Chars val:'\ttest_refs second HEAD@{1}\n' span_id:378) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'atomic push is not advertised if configured' span_id:385))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:389) (Token id:Id.Lit_Chars val:'\tmk_repo_pair &&\n' span_id:390) (Token id:Id.Lit_Chars val:'\t(\n' span_id:391) (Token id:Id.Lit_Chars val:'\t\tcd upstream\n' span_id:392) (Token id:Id.Lit_Chars val:'\t\tgit config receive.advertiseatomic 0\n' span_id:393) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:394) (Token id:Id.Lit_Chars val:'\t(\n' span_id:395) (Token id:Id.Lit_Chars val:'\t\tcd workbench &&\n' span_id:396) (Token id:Id.Lit_Chars val:'\t\ttest_commit one &&\n' span_id:397) (Token id:Id.Lit_Chars val:'\t\tgit push --mirror up &&\n' span_id:398) (Token id:Id.Lit_Chars val:'\t\ttest_commit two &&\n' span_id:399) (Token id: Id.Lit_Chars val: '\t\ttest_must_fail git push --atomic up master\n' span_id: 400 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:401) (Token id:Id.Lit_Chars val:'\ttest_refs master HEAD@{1}\n' span_id:402) ) } ) (C {(test_done)}) ] )