(command.CommandList children: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:test_description spids:[12]) op: Equal rhs: { (SQ <'git rebase --root\n'> <'\n'> <'Tests if git rebase --root --onto <newparent> can rebase the root commit.\n'> ) } spids: [12] ) ] spids: [12] ) (C {(.)} {(./test-lib.sh)}) (command.FuncDef name: log_with_names body: (command.BraceGroup children: [ (command.Pipeline children: [ (C {(git)} {(rev-list)} {(--topo-order)} {(--parents)} {(--pretty) (Lit_Other '=') (DQ ('tformat:%s'))} {(HEAD)} ) (C {(git)} {(name-rev)} {(--stdin)} {(--name-only)} {(--refs) (Lit_Other '=') (refs/heads/) ($ VSub_Number '$1')} ) ] negated: F ) ] spids: [29] ) spids: [24 28] ) (C {(test_expect_success)} {(SQ <'prepare repository'>)} { (SQ <'\n'> <'\ttest_commit 1 A &&\n'> <'\ttest_commit 2 A &&\n'> <'\tgit symbolic-ref HEAD refs/heads/other &&\n'> <'\trm .git/index &&\n'> <'\ttest_commit 3 B &&\n'> <'\ttest_commit 1b A 1 &&\n'> <'\ttest_commit 4 B\n'> ) } ) (C {(test_expect_success)} {(SQ <'rebase --root fails with too many args'>)} { (SQ <'\n'> <'\tgit checkout -B fail other &&\n'> <'\ttest_must_fail git rebase --onto master --root fail fail\n'> ) } ) (C {(test_expect_success)} {(SQ <'setup pre-rebase hook'>)} { (SQ <'\n'> <'\tmkdir -p .git/hooks &&\n'> <'\tcat >.git/hooks/pre-rebase <<EOF &&\n'> <'#!$SHELL_PATH\n'> <'echo "\\$1,\\$2" >.git/PRE-REBASE-INPUT\n'> <'EOF\n'> <'\tchmod +x .git/hooks/pre-rebase\n'> ) } ) (command.SimpleCommand words: [{(cat)}] redirects: [ (redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(expect)}) (redir.HereDoc op: <Redir_DLess '<<'> fd: 16777215 here_begin: {(EOF)} here_end_span_id: 129 stdin_parts: [('4\n') ('3\n') ('2\n') ('1\n')] ) ] ) (C {(test_expect_success)} {(SQ <'rebase --root --onto <newbase>'>)} { (SQ <'\n'> <'\tgit checkout -b work other &&\n'> <'\tgit rebase --root --onto master &&\n'> <'\tgit log --pretty=tformat:"%s" > rebased &&\n'> <'\ttest_cmp expect rebased\n'> ) } ) (C {(test_expect_success)} {(SQ <'pre-rebase got correct input (1)'>)} {(SQ <'\n'> <'\ttest "z$(cat .git/PRE-REBASE-INPUT)" = z--root,\n'>)} ) (C {(test_expect_success)} {(SQ <'rebase --root --onto <newbase> <branch>'>)} { (SQ <'\n'> <'\tgit branch work2 other &&\n'> <'\tgit rebase --root --onto master work2 &&\n'> <'\tgit log --pretty=tformat:"%s" > rebased2 &&\n'> <'\ttest_cmp expect rebased2\n'> ) } ) (C {(test_expect_success)} {(SQ <'pre-rebase got correct input (2)'>)} {(SQ <'\n'> <'\ttest "z$(cat .git/PRE-REBASE-INPUT)" = z--root,work2\n'>)} ) (C {(test_expect_success)} {(SQ <'rebase -i --root --onto <newbase>'>)} { (SQ <'\n'> <'\tgit checkout -b work3 other &&\n'> <'\tgit rebase -i --root --onto master &&\n'> <'\tgit log --pretty=tformat:"%s" > rebased3 &&\n'> <'\ttest_cmp expect rebased3\n'> ) } ) (C {(test_expect_success)} {(SQ <'pre-rebase got correct input (3)'>)} {(SQ <'\n'> <'\ttest "z$(cat .git/PRE-REBASE-INPUT)" = z--root,\n'>)} ) (C {(test_expect_success)} {(SQ <'rebase -i --root --onto <newbase> <branch>'>)} { (SQ <'\n'> <'\tgit branch work4 other &&\n'> <'\tgit rebase -i --root --onto master work4 &&\n'> <'\tgit log --pretty=tformat:"%s" > rebased4 &&\n'> <'\ttest_cmp expect rebased4\n'> ) } ) (C {(test_expect_success)} {(SQ <'pre-rebase got correct input (4)'>)} {(SQ <'\n'> <'\ttest "z$(cat .git/PRE-REBASE-INPUT)" = z--root,work4\n'>)} ) (C {(test_expect_success)} {(SQ <'rebase -i -p with linear history'>)} { (SQ <'\n'> <'\tgit checkout -b work5 other &&\n'> <'\tgit rebase -i -p --root --onto master &&\n'> <'\tgit log --pretty=tformat:"%s" > rebased5 &&\n'> <'\ttest_cmp expect rebased5\n'> ) } ) (C {(test_expect_success)} {(SQ <'pre-rebase got correct input (5)'>)} {(SQ <'\n'> <'\ttest "z$(cat .git/PRE-REBASE-INPUT)" = z--root,\n'>)} ) (C {(test_expect_success)} {(SQ <'set up merge history'>)} { (SQ <'\n'> <'\tgit checkout other^ &&\n'> <'\tgit checkout -b side &&\n'> <'\ttest_commit 5 C &&\n'> <'\tgit checkout other &&\n'> <'\tgit merge side\n'> ) } ) (command.SimpleCommand words: [{(cat)}] redirects: [ (redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(expect-side)}) (redir.HereDoc op: <Redir_DLess '<<'> fd: 16777215 here_begin: {(SQ <EOF>)} here_end_span_id: 305 stdin_parts: [ ('commit work6 work6~1 work6^2\n') ("Merge branch 'side' into other\n") ('commit work6^2 work6~2\n') ('5\n') ('commit work6~1 work6~2\n') ('4\n') ('commit work6~2 work6~3\n') ('3\n') ('commit work6~3 work6~4\n') ('2\n') ('commit work6~4\n') ('1\n') ] ) ] ) (C {(test_expect_success)} {(SQ <'rebase -i -p with merge'>)} { (SQ <'\n'> <'\tgit checkout -b work6 other &&\n'> <'\tgit rebase -i -p --root --onto master &&\n'> <'\tlog_with_names work6 > rebased6 &&\n'> <'\ttest_cmp expect-side rebased6\n'> ) } ) (C {(test_expect_success)} {(SQ <'set up second root and merge'>)} { (SQ <'\n'> <'\tgit symbolic-ref HEAD refs/heads/third &&\n'> <'\trm .git/index &&\n'> <'\trm A B C &&\n'> <'\ttest_commit 6 D &&\n'> <'\tgit checkout other &&\n'> <'\tgit merge --allow-unrelated-histories third\n'> ) } ) (command.SimpleCommand words: [{(cat)}] redirects: [ (redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(expect-third)}) (redir.HereDoc op: <Redir_DLess '<<'> fd: 16777215 here_begin: {(SQ <EOF>)} here_end_span_id: 366 stdin_parts: [ ('commit work7 work7~1 work7^2\n') ("Merge branch 'third' into other\n") ('commit work7^2 work7~4\n') ('6\n') ('commit work7~1 work7~2 work7~1^2\n') ("Merge branch 'side' into other\n") ('commit work7~1^2 work7~3\n') ('5\n') ('commit work7~2 work7~3\n') ('4\n') ('commit work7~3 work7~4\n') ('3\n') ('commit work7~4 work7~5\n') ('2\n') ('commit work7~5\n') ('1\n') ] ) ] ) (C {(test_expect_success)} {(SQ <'rebase -i -p with two roots'>)} { (SQ <'\n'> <'\tgit checkout -b work7 other &&\n'> <'\tgit rebase -i -p --root --onto master &&\n'> <'\tlog_with_names work7 > rebased7 &&\n'> <'\ttest_cmp expect-third rebased7\n'> ) } ) (C {(test_expect_success)} {(SQ <'setup pre-rebase hook that fails'>)} { (SQ <'\n'> <'\tmkdir -p .git/hooks &&\n'> <'\tcat >.git/hooks/pre-rebase <<EOF &&\n'> <'#!$SHELL_PATH\n'> <'false\n'> <'EOF\n'> <'\tchmod +x .git/hooks/pre-rebase\n'> ) } ) (C {(test_expect_success)} {(SQ <'pre-rebase hook stops rebase'>)} { (SQ <'\n'> <'\tgit checkout -b stops1 other &&\n'> <'\ttest_must_fail git rebase --root --onto master &&\n'> <'\ttest "z$(git symbolic-ref HEAD)" = zrefs/heads/stops1 &&\n'> <'\ttest 0 = $(git rev-list other...stops1 | wc -l)\n'> ) } ) (C {(test_expect_success)} {(SQ <'pre-rebase hook stops rebase -i'>)} { (SQ <'\n'> <'\tgit checkout -b stops2 other &&\n'> <'\ttest_must_fail git rebase --root --onto master &&\n'> <'\ttest "z$(git symbolic-ref HEAD)" = zrefs/heads/stops2 &&\n'> <'\ttest 0 = $(git rev-list other...stops2 | wc -l)\n'> ) } ) (C {(test_expect_success)} {(SQ <'remove pre-rebase hook'>)} {(SQ <'\n'> <'\trm -f .git/hooks/pre-rebase\n'>)} ) (C {(test_expect_success)} {(SQ <'set up a conflict'>)} { (SQ <'\n'> <'\tgit checkout master &&\n'> <'\techo conflict > B &&\n'> <'\tgit add B &&\n'> <'\tgit commit -m conflict\n'> ) } ) (C {(test_expect_success)} {(SQ <'rebase --root with conflict (first part)'>)} { (SQ <'\n'> <'\tgit checkout -b conflict1 other &&\n'> <'\ttest_must_fail git rebase --root --onto master &&\n'> <'\tgit ls-files -u | grep "B$"\n'> ) } ) (C {(test_expect_success)} {(SQ <'fix the conflict'>)} {(SQ <'\n'> <'\techo 3 > B &&\n'> <'\tgit add B\n'>)} ) (command.SimpleCommand words: [{(cat)}] redirects: [ (redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(expect-conflict)}) (redir.HereDoc op: <Redir_DLess '<<'> fd: 16777215 here_begin: {(EOF)} here_end_span_id: 501 stdin_parts: [('6\n') ('5\n') ('4\n') ('3\n') ('conflict\n') ('2\n') ('1\n')] ) ] ) (C {(test_expect_success)} {(SQ <'rebase --root with conflict (second part)'>)} { (SQ <'\n'> <'\tgit rebase --continue &&\n'> <'\tgit log --pretty=tformat:"%s" > conflict1 &&\n'> <'\ttest_cmp expect-conflict conflict1\n'> ) } ) (C {(test_expect_success)} {(SQ <'rebase -i --root with conflict (first part)'>)} { (SQ <'\n'> <'\tgit checkout -b conflict2 other &&\n'> <'\ttest_must_fail git rebase -i --root --onto master &&\n'> <'\tgit ls-files -u | grep "B$"\n'> ) } ) (C {(test_expect_success)} {(SQ <'fix the conflict'>)} {(SQ <'\n'> <'\techo 3 > B &&\n'> <'\tgit add B\n'>)} ) (C {(test_expect_success)} {(SQ <'rebase -i --root with conflict (second part)'>)} { (SQ <'\n'> <'\tgit rebase --continue &&\n'> <'\tgit log --pretty=tformat:"%s" > conflict2 &&\n'> <'\ttest_cmp expect-conflict conflict2\n'> ) } ) (command.SimpleCommand words: [{(cat)}] redirects: [ (redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(expect-conflict-p)}) (redir.HereDoc op: <Redir_DLess '<<'> fd: 16777215 here_begin: {(word_part.EscapedLiteralPart token:<Lit_EscapedChar '\\E'>) (OF)} here_end_span_id: 585 stdin_parts: [ ('commit conflict3 conflict3~1 conflict3^2\n') ("Merge branch 'third' into other\n") ('commit conflict3^2 conflict3~4\n') ('6\n') ('commit conflict3~1 conflict3~2 conflict3~1^2\n') ("Merge branch 'side' into other\n") ('commit conflict3~1^2 conflict3~3\n') ('5\n') ('commit conflict3~2 conflict3~3\n') ('4\n') ('commit conflict3~3 conflict3~4\n') ('3\n') ('commit conflict3~4 conflict3~5\n') ('conflict\n') ('commit conflict3~5 conflict3~6\n') ('2\n') ('commit conflict3~6\n') ('1\n') ] ) ] ) (C {(test_expect_success)} {(SQ <'rebase -i -p --root with conflict (first part)'>)} { (SQ <'\n'> <'\tgit checkout -b conflict3 other &&\n'> <'\ttest_must_fail git rebase -i -p --root --onto master &&\n'> <'\tgit ls-files -u | grep "B$"\n'> ) } ) (C {(test_expect_success)} {(SQ <'fix the conflict'>)} {(SQ <'\n'> <'\techo 3 > B &&\n'> <'\tgit add B\n'>)} ) (C {(test_expect_success)} {(SQ <'rebase -i -p --root with conflict (second part)'>)} { (SQ <'\n'> <'\tgit rebase --continue &&\n'> <'\tlog_with_names conflict3 >out &&\n'> <'\ttest_cmp expect-conflict-p out\n'> ) } ) (C {(test_done)}) ] )