(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:'Test cherry-pick -x and -s' span_id:6))} spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (command.ShFunction name: pristine_detach body: (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp] children: [ (C {(git)} {(cherry-pick)} {(--quit)}) (C {(git)} {(checkout)} {(-f)} {(DQ ($ Id.VSub_Number '$1') ('^0'))}) (C {(git)} {(read-tree)} {(-u)} {(--reset)} {(HEAD)}) (C {(git)} {(clean)} {(-d)} {(-f)} {(-f)} {(-q)} {(-x)}) ] ) ] ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:mesg_one_line) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:'base: commit message' span_id:78))} spids: [76] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:mesg_no_footer) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$mesg_one_line') ('\n') ('\n') (OneWordBodyThatsNotA-S-o-B))} spids: [82] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:mesg_with_footer) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName '$mesg_no_footer') ('\n') ('\n') ('Signed-off-by: ') ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME') (' <') ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL') ('>\n') ('Signed-off-by: A.U. Thor <author@example.com>\n') ('Signed-off-by: B.U. Thor <buthor@example.com>') ) } spids: [91] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:mesg_broken_footer) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName '$mesg_no_footer') ('\n') ('\n') ('The signed-off-by string should begin with the words Signed-off-by followed\n') ('by a colon and space, and then the signers name and email address. e.g.\n') ('Signed-off-by: ') ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME') (' <') ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL') ('>') ) } spids: [106] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:mesg_with_footer_sob) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName '$mesg_with_footer') ('\n') ('Signed-off-by: ') ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME') (' <') ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL') ('>') ) } spids: [121] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:mesg_with_cherry_footer) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName '$mesg_with_footer_sob') ('\n') ('(cherry picked from commit da39a3ee5e6b4b0d3255bfef95601890afd80709)\n') ('Tested-by: C.U. Thor <cuthor@example.com>') ) } spids: [133] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:mesg_unclean) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName '$mesg_one_line') ('\n') ('\n') ('\n') ('leading empty lines\n') ('\n') ('\n') ('consecutive empty lines\n') ('\n') ('# hash tag comment\n') ('\n') ('trailing empty lines\n') ('\n') ('\n') ) } spids: [142] ) ] ) (C {(test_expect_success)} {(setup)} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:166) (Token id: Id.Lit_Chars val: '\tgit config advice.detachedhead false &&\n' span_id: 167 ) (Token id:Id.Lit_Chars val:'\techo unrelated >unrelated &&\n' span_id:168) (Token id:Id.Lit_Chars val:'\tgit add unrelated &&\n' span_id:169) (Token id:Id.Lit_Chars val:'\ttest_commit initial foo a &&\n' span_id:170) (Token id: Id.Lit_Chars val: '\ttest_commit "$mesg_one_line" foo b mesg-one-line &&\n' span_id: 171 ) (Token id:Id.Lit_Chars val:'\tgit reset --hard initial &&\n' span_id:172) (Token id: Id.Lit_Chars val: '\ttest_commit "$mesg_no_footer" foo b mesg-no-footer &&\n' span_id: 173 ) (Token id:Id.Lit_Chars val:'\tgit reset --hard initial &&\n' span_id:174) (Token id: Id.Lit_Chars val: '\ttest_commit "$mesg_broken_footer" foo b mesg-broken-footer &&\n' span_id: 175 ) (Token id:Id.Lit_Chars val:'\tgit reset --hard initial &&\n' span_id:176) (Token id: Id.Lit_Chars val: '\ttest_commit "$mesg_with_footer" foo b mesg-with-footer &&\n' span_id: 177 ) (Token id:Id.Lit_Chars val:'\tgit reset --hard initial &&\n' span_id:178) (Token id: Id.Lit_Chars val: '\ttest_commit "$mesg_with_footer_sob" foo b mesg-with-footer-sob &&\n' span_id: 179 ) (Token id:Id.Lit_Chars val:'\tgit reset --hard initial &&\n' span_id:180) (Token id: Id.Lit_Chars val: '\ttest_commit "$mesg_with_cherry_footer" foo b mesg-with-cherry-footer &&\n' span_id: 181 ) (Token id:Id.Lit_Chars val:'\tgit reset --hard initial &&\n' span_id:182) (Token id: Id.Lit_Chars val: '\ttest_config commit.cleanup verbatim &&\n' span_id: 183 ) (Token id:Id.Lit_Chars val:'\ttest_commit "$mesg_unclean" foo b mesg-unclean &&\n' span_id:184) (Token id:Id.Lit_Chars val:'\ttest_unconfig commit.cleanup &&\n' span_id:185) (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:186) (Token id:Id.Lit_Chars val:'\ttest_commit conflicting unrelated\n' span_id:187) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'cherry-pick -x inserts blank line after one line subject' span_id: 194 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:198) (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:199) (Token id:Id.Lit_Chars val:'\tsha1=$(git rev-parse mesg-one-line^0) &&\n' span_id:200) (Token id:Id.Lit_Chars val:'\tgit cherry-pick -x mesg-one-line &&\n' span_id:201) (Token id:Id.Lit_Chars val:'\tcat <<-EOF >expect &&\n' span_id:202) (Token id:Id.Lit_Chars val:'\t\t$mesg_one_line\n' span_id:203) (Token id:Id.Lit_Chars val:'\n' span_id:204) (Token id:Id.Lit_Chars val:'\t\t(cherry picked from commit $sha1)\n' span_id:205) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:206) (Token id: Id.Lit_Chars val: '\tgit log -1 --pretty=format:%B >actual &&\n' span_id: 207 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:208) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'cherry-pick -s inserts blank line after one line subject' span_id: 215 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:219) (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:220) (Token id:Id.Lit_Chars val:'\tgit cherry-pick -s mesg-one-line &&\n' span_id:221) (Token id:Id.Lit_Chars val:'\tcat <<-EOF >expect &&\n' span_id:222) (Token id:Id.Lit_Chars val:'\t\t$mesg_one_line\n' span_id:223) (Token id:Id.Lit_Chars val:'\n' span_id:224) (Token id: Id.Lit_Chars val: '\t\tSigned-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>\n' span_id: 225 ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:226) (Token id: Id.Lit_Chars val: '\tgit log -1 --pretty=format:%B >actual &&\n' span_id: 227 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:228) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'cherry-pick -s inserts blank line after non-conforming footer' span_id: 235 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:239) (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:240) (Token id:Id.Lit_Chars val:'\tgit cherry-pick -s mesg-broken-footer &&\n' span_id:241) (Token id:Id.Lit_Chars val:'\tcat <<-EOF >expect &&\n' span_id:242) (Token id:Id.Lit_Chars val:'\t\t$mesg_broken_footer\n' span_id:243) (Token id:Id.Lit_Chars val:'\n' span_id:244) (Token id: Id.Lit_Chars val: '\t\tSigned-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>\n' span_id: 245 ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:246) (Token id: Id.Lit_Chars val: '\tgit log -1 --pretty=format:%B >actual &&\n' span_id: 247 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:248) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'cherry-pick -x inserts blank line when conforming footer not found' span_id: 255 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:259) (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:260) (Token id:Id.Lit_Chars val:'\tsha1=$(git rev-parse mesg-no-footer^0) &&\n' span_id:261) (Token id: Id.Lit_Chars val: '\tgit cherry-pick -x mesg-no-footer &&\n' span_id: 262 ) (Token id:Id.Lit_Chars val:'\tcat <<-EOF >expect &&\n' span_id:263) (Token id:Id.Lit_Chars val:'\t\t$mesg_no_footer\n' span_id:264) (Token id:Id.Lit_Chars val:'\n' span_id:265) (Token id:Id.Lit_Chars val:'\t\t(cherry picked from commit $sha1)\n' span_id:266) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:267) (Token id: Id.Lit_Chars val: '\tgit log -1 --pretty=format:%B >actual &&\n' span_id: 268 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:269) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'cherry-pick -s inserts blank line when conforming footer not found' span_id: 276 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:280) (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:281) (Token id:Id.Lit_Chars val:'\tgit cherry-pick -s mesg-no-footer &&\n' span_id:282) (Token id:Id.Lit_Chars val:'\tcat <<-EOF >expect &&\n' span_id:283) (Token id:Id.Lit_Chars val:'\t\t$mesg_no_footer\n' span_id:284) (Token id:Id.Lit_Chars val:'\n' span_id:285) (Token id: Id.Lit_Chars val: '\t\tSigned-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>\n' span_id: 286 ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:287) (Token id: Id.Lit_Chars val: '\tgit log -1 --pretty=format:%B >actual &&\n' span_id: 288 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:289) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'cherry-pick -x -s inserts blank line when conforming footer not found' span_id: 296 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:300) (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:301) (Token id:Id.Lit_Chars val:'\tsha1=$(git rev-parse mesg-no-footer^0) &&\n' span_id:302) (Token id: Id.Lit_Chars val: '\tgit cherry-pick -x -s mesg-no-footer &&\n' span_id: 303 ) (Token id:Id.Lit_Chars val:'\tcat <<-EOF >expect &&\n' span_id:304) (Token id:Id.Lit_Chars val:'\t\t$mesg_no_footer\n' span_id:305) (Token id:Id.Lit_Chars val:'\n' span_id:306) (Token id:Id.Lit_Chars val:'\t\t(cherry picked from commit $sha1)\n' span_id:307) (Token id: Id.Lit_Chars val: '\t\tSigned-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>\n' span_id: 308 ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:309) (Token id: Id.Lit_Chars val: '\tgit log -1 --pretty=format:%B >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: 'cherry-pick -s adds sob when last sob doesnt match committer' span_id: 318 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:322) (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:323) (Token id:Id.Lit_Chars val:'\tgit cherry-pick -s mesg-with-footer &&\n' span_id:324) (Token id:Id.Lit_Chars val:'\tcat <<-EOF >expect &&\n' span_id:325) (Token id:Id.Lit_Chars val:'\t\t$mesg_with_footer\n' span_id:326) (Token id: Id.Lit_Chars val: '\t\tSigned-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>\n' span_id: 327 ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:328) (Token id: Id.Lit_Chars val: '\tgit log -1 --pretty=format:%B >actual &&\n' span_id: 329 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:330) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'cherry-pick -x -s adds sob when last sob doesnt match committer' span_id: 337 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:341) (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:342) (Token id:Id.Lit_Chars val:'\tsha1=$(git rev-parse mesg-with-footer^0) &&\n' span_id:343) (Token id: Id.Lit_Chars val: '\tgit cherry-pick -x -s mesg-with-footer &&\n' span_id: 344 ) (Token id:Id.Lit_Chars val:'\tcat <<-EOF >expect &&\n' span_id:345) (Token id:Id.Lit_Chars val:'\t\t$mesg_with_footer\n' span_id:346) (Token id:Id.Lit_Chars val:'\t\t(cherry picked from commit $sha1)\n' span_id:347) (Token id: Id.Lit_Chars val: '\t\tSigned-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>\n' span_id: 348 ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:349) (Token id: Id.Lit_Chars val: '\tgit log -1 --pretty=format:%B >actual &&\n' span_id: 350 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:351) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'cherry-pick -s refrains from adding duplicate trailing sob' span_id: 358 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:362) (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:363) (Token id:Id.Lit_Chars val:'\tgit cherry-pick -s mesg-with-footer-sob &&\n' span_id:364) (Token id:Id.Lit_Chars val:'\tcat <<-EOF >expect &&\n' span_id:365) (Token id:Id.Lit_Chars val:'\t\t$mesg_with_footer_sob\n' span_id:366) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:367) (Token id:Id.Lit_Chars val:'\tgit log -1 --pretty=format:%B >actual &&\n' span_id:368) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:369) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'cherry-pick -x -s adds sob even when trailing sob exists for committer' span_id: 376 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:380) (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:381) (Token id:Id.Lit_Chars val:'\tsha1=$(git rev-parse mesg-with-footer-sob^0) &&\n' span_id:382) (Token id: Id.Lit_Chars val: '\tgit cherry-pick -x -s mesg-with-footer-sob &&\n' span_id: 383 ) (Token id:Id.Lit_Chars val:'\tcat <<-EOF >expect &&\n' span_id:384) (Token id:Id.Lit_Chars val:'\t\t$mesg_with_footer_sob\n' span_id:385) (Token id:Id.Lit_Chars val:'\t\t(cherry picked from commit $sha1)\n' span_id:386) (Token id: Id.Lit_Chars val: '\t\tSigned-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>\n' span_id: 387 ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:388) (Token id: Id.Lit_Chars val: '\tgit log -1 --pretty=format:%B >actual &&\n' span_id: 389 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:390) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'cherry-pick -x treats "(cherry picked from..." line as part of footer' span_id: 397 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:401) (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:402) (Token id:Id.Lit_Chars val:'\tsha1=$(git rev-parse mesg-with-cherry-footer^0) &&\n' span_id:403) (Token id: Id.Lit_Chars val: '\tgit cherry-pick -x mesg-with-cherry-footer &&\n' span_id: 404 ) (Token id:Id.Lit_Chars val:'\tcat <<-EOF >expect &&\n' span_id:405) (Token id:Id.Lit_Chars val:'\t\t$mesg_with_cherry_footer\n' span_id:406) (Token id:Id.Lit_Chars val:'\t\t(cherry picked from commit $sha1)\n' span_id:407) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:408) (Token id:Id.Lit_Chars val:'\tgit log -1 --pretty=format:%B >actual &&\n' span_id:409) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:410) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'cherry-pick -s treats "(cherry picked from..." line as part of footer' span_id: 417 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:421) (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:422) (Token id:Id.Lit_Chars val:'\tgit cherry-pick -s mesg-with-cherry-footer &&\n' span_id:423) (Token id:Id.Lit_Chars val:'\tcat <<-EOF >expect &&\n' span_id:424) (Token id:Id.Lit_Chars val:'\t\t$mesg_with_cherry_footer\n' span_id:425) (Token id: Id.Lit_Chars val: '\t\tSigned-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>\n' span_id: 426 ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:427) (Token id: Id.Lit_Chars val: '\tgit log -1 --pretty=format:%B >actual &&\n' span_id: 428 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:429) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'cherry-pick -x -s treats "(cherry picked from..." line as part of footer' span_id: 436 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:440) (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:441) (Token id:Id.Lit_Chars val:'\tsha1=$(git rev-parse mesg-with-cherry-footer^0) &&\n' span_id:442) (Token id: Id.Lit_Chars val: '\tgit cherry-pick -x -s mesg-with-cherry-footer &&\n' span_id: 443 ) (Token id:Id.Lit_Chars val:'\tcat <<-EOF >expect &&\n' span_id:444) (Token id:Id.Lit_Chars val:'\t\t$mesg_with_cherry_footer\n' span_id:445) (Token id:Id.Lit_Chars val:'\t\t(cherry picked from commit $sha1)\n' span_id:446) (Token id: Id.Lit_Chars val: '\t\tSigned-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>\n' span_id: 447 ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:448) (Token id: Id.Lit_Chars val: '\tgit log -1 --pretty=format:%B >actual &&\n' span_id: 449 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:450) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'cherry-pick preserves commit message' span_id:457))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:461) (Token id:Id.Lit_Chars val:'\tpristine_detach initial &&\n' span_id:462) (Token id:Id.Lit_Chars val:'\tprintf "$mesg_unclean" >expect &&\n' span_id:463) (Token id: Id.Lit_Chars val: '\tgit log -1 --pretty=format:%B mesg-unclean >actual &&\n' span_id: 464 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:465) (Token id:Id.Lit_Chars val:'\tgit cherry-pick mesg-unclean &&\n' span_id:466) (Token id:Id.Lit_Chars val:'\tgit log -1 --pretty=format:%B >actual &&\n' span_id:467) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:468) ) } ) (C {(test_done)}) ] )