(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:'See why rewinding head breaks send-pack\n' span_id:15) (Token id:Id.Lit_Chars val:'\n' span_id:16) ) } spids: [13] ) ] ) (C {(.)} {(./test-lib.sh)}) (command.ShAssignment pairs: [(assign_pair lhs:(sh_lhs_expr.Name name:cnt) op:assign_op.Equal rhs:{(64)} spids:[24])] ) (C {(test_expect_success)} {(setup)} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:32) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:33) (Token id:Id.Lit_Chars val:'\tmkdir mozart mozart/is &&\n' span_id:34) (Token id:Id.Lit_Chars val:'\techo "Commit #0" >mozart/is/pink &&\n' span_id:35) (Token id:Id.Lit_Chars val:'\tgit update-index --add mozart/is/pink &&\n' span_id:36) (Token id:Id.Lit_Chars val:'\ttree=$(git write-tree) &&\n' span_id:37) (Token id:Id.Lit_Chars val:'\tcommit=$(echo "Commit #0" | git commit-tree $tree) &&\n' span_id:38) (Token id:Id.Lit_Chars val:'\tzero=$commit &&\n' span_id:39) (Token id:Id.Lit_Chars val:'\tparent=$zero &&\n' span_id:40) (Token id:Id.Lit_Chars val:'\ti=0 &&\n' span_id:41) (Token id:Id.Lit_Chars val:'\twhile test $i -le $cnt\n' span_id:42) (Token id:Id.Lit_Chars val:'\tdo\n' span_id:43) (Token id:Id.Lit_Chars val:'\t i=$(($i+1)) &&\n' span_id:44) (Token id:Id.Lit_Chars val:'\t test_tick &&\n' span_id:45) (Token id:Id.Lit_Chars val:'\t echo "Commit #$i" >mozart/is/pink &&\n' span_id:46) (Token id: Id.Lit_Chars val: '\t git update-index --add mozart/is/pink &&\n' span_id: 47 ) (Token id:Id.Lit_Chars val:'\t tree=$(git write-tree) &&\n' span_id:48) (Token id: Id.Lit_Chars val: '\t commit=$(echo "Commit #$i" | git commit-tree $tree -p $parent) &&\n' span_id: 49 ) (Token id:Id.Lit_Chars val:'\t git update-ref refs/tags/commit$i $commit &&\n' span_id:50) (Token id:Id.Lit_Chars val:'\t parent=$commit || return 1\n' span_id:51) (Token id:Id.Lit_Chars val:'\tdone &&\n' span_id:52) (Token id:Id.Lit_Chars val:'\tgit update-ref HEAD "$commit" &&\n' span_id:53) (Token id:Id.Lit_Chars val:'\tgit clone ./. victim &&\n' span_id:54) (Token id: Id.Lit_Chars val: '\t( cd victim && git config receive.denyCurrentBranch warn && git log ) &&\n' span_id: 55 ) (Token id:Id.Lit_Chars val:'\tgit update-ref HEAD "$zero" &&\n' span_id:56) (Token id:Id.Lit_Chars val:'\tparent=$zero &&\n' span_id:57) (Token id:Id.Lit_Chars val:'\ti=0 &&\n' span_id:58) (Token id:Id.Lit_Chars val:'\twhile test $i -le $cnt\n' span_id:59) (Token id:Id.Lit_Chars val:'\tdo\n' span_id:60) (Token id:Id.Lit_Chars val:'\t i=$(($i+1)) &&\n' span_id:61) (Token id:Id.Lit_Chars val:'\t test_tick &&\n' span_id:62) (Token id: Id.Lit_Chars val: '\t echo "Rebase #$i" >mozart/is/pink &&\n' span_id: 63 ) (Token id:Id.Lit_Chars val:'\t git update-index --add mozart/is/pink &&\n' span_id:64) (Token id:Id.Lit_Chars val:'\t tree=$(git write-tree) &&\n' span_id:65) (Token id: Id.Lit_Chars val: '\t commit=$(echo "Rebase #$i" | git commit-tree $tree -p $parent) &&\n' span_id: 66 ) (Token id:Id.Lit_Chars val:'\t git update-ref refs/tags/rebase$i $commit &&\n' span_id:67) (Token id:Id.Lit_Chars val:'\t parent=$commit || return 1\n' span_id:68) (Token id:Id.Lit_Chars val:'\tdone &&\n' span_id:69) (Token id:Id.Lit_Chars val:'\tgit update-ref HEAD "$commit" &&\n' span_id:70) (Token id:Id.Lit_Chars val:'\techo Rebase &&\n' span_id:71) (Token id:Id.Lit_Chars val:'\tgit log' span_id:72) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'pack the source repository' span_id:79))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:83) (Token id:Id.Lit_Chars val:'\tgit repack -a -d &&\n' span_id:84) (Token id:Id.Lit_Chars val:'\tgit prune\n' span_id:85) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'pack the destination repository' span_id:92))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:96) (Token id:Id.Lit_Chars val:' (\n' span_id:97) (Token id:Id.Lit_Chars val:'\tcd victim &&\n' span_id:98) (Token id:Id.Lit_Chars val:'\tgit repack -a -d &&\n' span_id:99) (Token id:Id.Lit_Chars val:'\tgit prune\n' span_id:100) (Token id:Id.Lit_Chars val:' )\n' span_id:101) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'refuse pushing rewound head without --force' span_id:108))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:112) (Token id: Id.Lit_Chars val: '\tpushed_head=$(git rev-parse --verify master) &&\n' span_id: 113 ) (Token id: Id.Lit_Chars val: '\tvictim_orig=$(cd victim && git rev-parse --verify master) &&\n' span_id: 114 ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git send-pack ./victim master &&\n' span_id:115) (Token id: Id.Lit_Chars val: '\tvictim_head=$(cd victim && git rev-parse --verify master) &&\n' span_id: 116 ) (Token id:Id.Lit_Chars val:'\ttest "$victim_head" = "$victim_orig" &&\n' span_id:117) (Token id:Id.Lit_Chars val:'\t# this should update\n' span_id:118) (Token id:Id.Lit_Chars val:'\tgit send-pack --force ./victim master &&\n' span_id:119) (Token id: Id.Lit_Chars val: '\tvictim_head=$(cd victim && git rev-parse --verify master) &&\n' span_id: 120 ) (Token id:Id.Lit_Chars val:'\ttest "$victim_head" = "$pushed_head"\n' span_id:121) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push can be used to delete a ref' span_id:128))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:132) (Token id: Id.Lit_Chars val: '\t( cd victim && git branch extra master ) &&\n' span_id: 133 ) (Token id:Id.Lit_Chars val:'\tgit send-pack ./victim :extra master &&\n' span_id:134) (Token id:Id.Lit_Chars val:'\t( cd victim &&\n' span_id:135) (Token id:Id.Lit_Chars val:'\t test_must_fail git rev-parse --verify extra )\n' span_id:136) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'refuse deleting push with denyDeletes' span_id:143))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:147) (Token id:Id.Lit_Chars val:'\t(\n' span_id:148) (Token id:Id.Lit_Chars val:'\t cd victim &&\n' span_id:149) (Token id:Id.Lit_Chars val:'\t ( git branch -D extra || : ) &&\n' span_id:150) (Token id:Id.Lit_Chars val:'\t git config receive.denyDeletes true &&\n' span_id:151) (Token id:Id.Lit_Chars val:'\t git branch extra master\n' span_id:152) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:153) (Token id: Id.Lit_Chars val: '\ttest_must_fail git send-pack ./victim :extra master\n' span_id: 154 ) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'cannot override denyDeletes with git -c send-pack' span_id: 161 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:165) (Token id:Id.Lit_Chars val:'\t(\n' span_id:166) (Token id:Id.Lit_Chars val:'\t\tcd victim &&\n' span_id:167) (Token id: Id.Lit_Chars val: '\t\ttest_might_fail git branch -D extra &&\n' span_id: 168 ) (Token id:Id.Lit_Chars val:'\t\tgit config receive.denyDeletes true &&\n' span_id:169) (Token id:Id.Lit_Chars val:'\t\tgit branch extra master\n' span_id:170) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:171) (Token id: Id.Lit_Chars val: '\ttest_must_fail git -c receive.denyDeletes=false \\\n' span_id: 172 ) (Token id:Id.Lit_Chars val:'\t\t\t\t\tsend-pack ./victim :extra master\n' span_id:173) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'override denyDeletes with git -c receive-pack' span_id:180))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:184) (Token id:Id.Lit_Chars val:'\t(\n' span_id:185) (Token id:Id.Lit_Chars val:'\t\tcd victim &&\n' span_id:186) (Token id: Id.Lit_Chars val: '\t\ttest_might_fail git branch -D extra &&\n' span_id: 187 ) (Token id:Id.Lit_Chars val:'\t\tgit config receive.denyDeletes true &&\n' span_id:188) (Token id:Id.Lit_Chars val:'\t\tgit branch extra master\n' span_id:189) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:190) (Token id:Id.Lit_Chars val:'\tgit send-pack \\\n' span_id:191) (Token id: Id.Lit_Chars val: '\t\t--receive-pack="git -c receive.denyDeletes=false receive-pack" \\\n' span_id: 192 ) (Token id:Id.Lit_Chars val:'\t\t./victim :extra master\n' span_id:193) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'denyNonFastforwards trumps --force' span_id:200))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:204) (Token id:Id.Lit_Chars val:'\t(\n' span_id:205) (Token id:Id.Lit_Chars val:'\t cd victim &&\n' span_id:206) (Token id:Id.Lit_Chars val:'\t ( git branch -D extra || : ) &&\n' span_id:207) (Token id:Id.Lit_Chars val:'\t git config receive.denyNonFastforwards true\n' span_id:208) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:209) (Token id: Id.Lit_Chars val: '\tvictim_orig=$(cd victim && git rev-parse --verify master) &&\n' span_id: 210 ) (Token id: Id.Lit_Chars val: '\ttest_must_fail git send-pack --force ./victim master^:master &&\n' span_id: 211 ) (Token id: Id.Lit_Chars val: '\tvictim_head=$(cd victim && git rev-parse --verify master) &&\n' span_id: 212 ) (Token id:Id.Lit_Chars val:'\ttest "$victim_orig" = "$victim_head"\n' span_id:213) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'send-pack --all sends all branches' span_id:220))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:224) (Token id: Id.Lit_Chars val: '\t# make sure we have at least 2 branches with different\n' span_id: 225 ) (Token id:Id.Lit_Chars val:'\t# values, just to be thorough\n' span_id:226) (Token id:Id.Lit_Chars val:'\tgit branch other-branch HEAD^ &&\n' span_id:227) (Token id:Id.Lit_Chars val:'\n' span_id:228) (Token id:Id.Lit_Chars val:'\tgit init --bare all.git &&\n' span_id:229) (Token id:Id.Lit_Chars val:'\tgit send-pack --all all.git &&\n' span_id:230) (Token id: Id.Lit_Chars val: '\tgit for-each-ref refs/heads >expect &&\n' span_id: 231 ) (Token id:Id.Lit_Chars val:'\tgit -C all.git for-each-ref refs/heads >actual &&\n' span_id:232) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:233) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push --all excludes remote-tracking hierarchy' span_id:240))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:244) (Token id:Id.Lit_Chars val:'\tmkdir parent &&\n' span_id:245) (Token id:Id.Lit_Chars val:'\t(\n' span_id:246) (Token id:Id.Lit_Chars val:'\t cd parent &&\n' span_id:247) (Token id: Id.Lit_Chars val: '\t git init && : >file && git add file && git commit -m add\n' span_id: 248 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:249) (Token id:Id.Lit_Chars val:'\tgit clone parent child &&\n' span_id:250) (Token id:Id.Lit_Chars val:'\t(\n' span_id:251) (Token id:Id.Lit_Chars val:'\t cd child && git push --all\n' span_id:252) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:253) (Token id:Id.Lit_Chars val:'\t(\n' span_id:254) (Token id:Id.Lit_Chars val:'\t cd parent &&\n' span_id:255) (Token id:Id.Lit_Chars val:'\t test -z "$(git for-each-ref refs/remotes/origin)"\n' span_id:256) (Token id:Id.Lit_Chars val:'\t)\n' span_id:257) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'receive-pack runs auto-gc in remote repo' span_id:264))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:268) (Token id:Id.Lit_Chars val:'\trm -rf parent child &&\n' span_id:269) (Token id:Id.Lit_Chars val:'\tgit init parent &&\n' span_id:270) (Token id:Id.Lit_Chars val:'\t(\n' span_id:271) (Token id:Id.Lit_Chars val:'\t # Setup a repo with 2 packs\n' span_id:272) (Token id:Id.Lit_Chars val:'\t cd parent &&\n' span_id:273) (Token id:Id.Lit_Chars val:'\t echo "Some text" >file.txt &&\n' span_id:274) (Token id:Id.Lit_Chars val:'\t git add . &&\n' span_id:275) (Token id:Id.Lit_Chars val:'\t git commit -m "Initial commit" &&\n' span_id:276) (Token id:Id.Lit_Chars val:'\t git repack -adl &&\n' span_id:277) (Token id:Id.Lit_Chars val:'\t echo "Some more text" >>file.txt &&\n' span_id:278) (Token id: Id.Lit_Chars val: '\t git commit -a -m "Second commit" &&\n' span_id: 279 ) (Token id:Id.Lit_Chars val:'\t git repack\n' span_id:280) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:281) (Token id:Id.Lit_Chars val:'\tcp -R parent child &&\n' span_id:282) (Token id:Id.Lit_Chars val:'\t(\n' span_id:283) (Token id: Id.Lit_Chars val: '\t # Set the child to auto-pack if more than one pack exists\n' span_id: 284 ) (Token id:Id.Lit_Chars val:'\t cd child &&\n' span_id:285) (Token id: Id.Lit_Chars val: '\t git config gc.autopacklimit 1 &&\n' span_id: 286 ) (Token id:Id.Lit_Chars val:'\t git config gc.autodetach false &&\n' span_id:287) (Token id:Id.Lit_Chars val:'\t git branch test_auto_gc &&\n' span_id:288) (Token id: Id.Lit_Chars val: '\t # And create a file that follows the temporary object naming\n' span_id: 289 ) (Token id:Id.Lit_Chars val:'\t # convention for the auto-gc to remove\n' span_id:290) (Token id: Id.Lit_Chars val: '\t : >.git/objects/tmp_test_object &&\n' span_id: 291 ) (Token id:Id.Lit_Chars val:'\t test-chmtime =-1209601 .git/objects/tmp_test_object\n' span_id:292) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:293) (Token id:Id.Lit_Chars val:'\t(\n' span_id:294) (Token id:Id.Lit_Chars val:'\t cd parent &&\n' span_id:295) (Token id:Id.Lit_Chars val:'\t echo "Even more text" >>file.txt &&\n' span_id:296) (Token id: Id.Lit_Chars val: '\t git commit -a -m "Third commit" &&\n' span_id: 297 ) (Token id:Id.Lit_Chars val:'\t git send-pack ../child HEAD:refs/heads/test_auto_gc\n' span_id:298) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:299) (Token id:Id.Lit_Chars val:'\ttest ! -e child/.git/objects/tmp_test_object\n' span_id:300) ) } ) (command.ShFunction name: rewound_push_setup body: (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp] children: [ (C {(rm)} {(-rf)} {(parent)} {(child)}) (C {(mkdir)} {(parent)}) (command.Subshell command_list: (command.CommandList 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 ] children: [ (C {(cd)} {(parent)}) (C {(git)} {(init)}) (command.Simple words: [{(echo)} {(one)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:350) fd: -1 arg_word: {(file)} ) ] ) (C {(git)} {(add)} {(file)}) (C {(git)} {(commit)} {(-m)} {(one)}) (C {(git)} {(config)} {(receive.denyCurrentBranch)} {(warn)}) (command.Simple words: [{(echo)} {(two)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:389) fd: -1 arg_word: {(file)} ) ] ) (C {(git)} {(commit)} {(-a)} {(-m)} {(two)}) ] ) ] ) ) (C {(git)} {(clone)} {(parent)} {(child)}) (command.Subshell command_list: (command.CommandList children: [ (command.AndOr ops: [Id.Op_DAmp] children: [ (C {(cd)} {(child)}) (C {(git)} {(reset)} {(--hard)} {(HEAD) (Id.Lit_Other '^')}) ] ) ] ) ) ] ) ] ) ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'pushing explicit refspecs respects forcing' span_id:448))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:452) (Token id:Id.Lit_Chars val:'\trewound_push_setup &&\n' span_id:453) (Token id: Id.Lit_Chars val: '\tparent_orig=$(cd parent && git rev-parse --verify master) &&\n' span_id: 454 ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:455) (Token id:Id.Lit_Chars val:'\t cd child &&\n' span_id:456) (Token id:Id.Lit_Chars val:'\t test_must_fail git send-pack ../parent \\\n' span_id:457) (Token id: Id.Lit_Chars val: '\t\trefs/heads/master:refs/heads/master\n' span_id: 458 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:459) (Token id: Id.Lit_Chars val: '\tparent_head=$(cd parent && git rev-parse --verify master) &&\n' span_id: 460 ) (Token id:Id.Lit_Chars val:'\ttest "$parent_orig" = "$parent_head" &&\n' span_id:461) (Token id:Id.Lit_Chars val:'\t(\n' span_id:462) (Token id:Id.Lit_Chars val:'\t cd child &&\n' span_id:463) (Token id:Id.Lit_Chars val:'\t git send-pack ../parent \\\n' span_id:464) (Token id:Id.Lit_Chars val:'\t +refs/heads/master:refs/heads/master\n' span_id:465) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:466) (Token id: Id.Lit_Chars val: '\tparent_head=$(cd parent && git rev-parse --verify master) &&\n' span_id: 467 ) (Token id: Id.Lit_Chars val: '\tchild_head=$(cd child && git rev-parse --verify master) &&\n' span_id: 468 ) (Token id:Id.Lit_Chars val:'\ttest "$parent_head" = "$child_head"\n' span_id:469) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'pushing wildcard refspecs respects forcing' span_id:476))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:480) (Token id:Id.Lit_Chars val:'\trewound_push_setup &&\n' span_id:481) (Token id: Id.Lit_Chars val: '\tparent_orig=$(cd parent && git rev-parse --verify master) &&\n' span_id: 482 ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:483) (Token id:Id.Lit_Chars val:'\t cd child &&\n' span_id:484) (Token id:Id.Lit_Chars val:'\t test_must_fail git send-pack ../parent \\\n' span_id:485) (Token id:Id.Lit_Chars val:'\t "refs/heads/*:refs/heads/*"\n' span_id:486) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:487) (Token id: Id.Lit_Chars val: '\tparent_head=$(cd parent && git rev-parse --verify master) &&\n' span_id: 488 ) (Token id:Id.Lit_Chars val:'\ttest "$parent_orig" = "$parent_head" &&\n' span_id:489) (Token id:Id.Lit_Chars val:'\t(\n' span_id:490) (Token id:Id.Lit_Chars val:'\t cd child &&\n' span_id:491) (Token id:Id.Lit_Chars val:'\t git send-pack ../parent \\\n' span_id:492) (Token id:Id.Lit_Chars val:'\t "+refs/heads/*:refs/heads/*"\n' span_id:493) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:494) (Token id: Id.Lit_Chars val: '\tparent_head=$(cd parent && git rev-parse --verify master) &&\n' span_id: 495 ) (Token id: Id.Lit_Chars val: '\tchild_head=$(cd child && git rev-parse --verify master) &&\n' span_id: 496 ) (Token id:Id.Lit_Chars val:'\ttest "$parent_head" = "$child_head"\n' span_id:497) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'deny pushing to delete current branch' span_id:504))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:508) (Token id:Id.Lit_Chars val:'\trewound_push_setup &&\n' span_id:509) (Token id:Id.Lit_Chars val:'\t(\n' span_id:510) (Token id:Id.Lit_Chars val:'\t cd child &&\n' span_id:511) (Token id: Id.Lit_Chars val: '\t test_must_fail git send-pack ../parent :refs/heads/master 2>errs\n' span_id: 512 ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:513) ) } ) (C {(test_done)}) ] )