(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:'git blame corner cases' span_id:6))} spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:pick_fc) op: assign_op.Equal rhs: { (SQ (Token id: Id.Lit_Chars val: 's/^[0-9a-f^]* *\\([^ ]*\\) *(\\([^ ]*\\) .*/\\1-\\2/' span_id: 16 ) ) } spids: [14] ) ] ) (C {(test_expect_success)} {(setup)} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:25) (Token id:Id.Lit_Chars val:'\n' span_id:26) (Token id:Id.Lit_Chars val:'\techo A A A A A >one &&\n' span_id:27) (Token id:Id.Lit_Chars val:'\techo B B B B B >two &&\n' span_id:28) (Token id:Id.Lit_Chars val:'\techo C C C C C >tres &&\n' span_id:29) (Token id:Id.Lit_Chars val:'\techo ABC >mouse &&\n' span_id:30) (Token id:Id.Lit_Chars val:'\tfor i in 1 2 3 4 5 6 7 8 9\n' span_id:31) (Token id:Id.Lit_Chars val:'\tdo\n' span_id:32) (Token id:Id.Lit_Chars val:'\t\techo $i\n' span_id:33) (Token id:Id.Lit_Chars val:'\tdone >nine_lines &&\n' span_id:34) (Token id:Id.Lit_Chars val:'\tfor i in 1 2 3 4 5 6 7 8 9 a\n' span_id:35) (Token id:Id.Lit_Chars val:'\tdo\n' span_id:36) (Token id:Id.Lit_Chars val:'\t\techo $i\n' span_id:37) (Token id:Id.Lit_Chars val:'\tdone >ten_lines &&\n' span_id:38) (Token id:Id.Lit_Chars val:'\tgit add one two tres mouse nine_lines ten_lines &&\n' span_id:39) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:40) (Token id:Id.Lit_Chars val:'\tGIT_AUTHOR_NAME=Initial git commit -m Initial &&\n' span_id:41) (Token id:Id.Lit_Chars val:'\n' span_id:42) (Token id:Id.Lit_Chars val:'\tcat one >uno &&\n' span_id:43) (Token id:Id.Lit_Chars val:'\tmv two dos &&\n' span_id:44) (Token id:Id.Lit_Chars val:'\tcat one >>tres &&\n' span_id:45) (Token id:Id.Lit_Chars val:'\techo DEF >>mouse &&\n' span_id:46) (Token id:Id.Lit_Chars val:'\tgit add uno dos tres mouse &&\n' span_id:47) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:48) (Token id:Id.Lit_Chars val:'\tGIT_AUTHOR_NAME=Second git commit -a -m Second &&\n' span_id:49) (Token id:Id.Lit_Chars val:'\n' span_id:50) (Token id:Id.Lit_Chars val:'\techo GHIJK >>mouse &&\n' span_id:51) (Token id:Id.Lit_Chars val:'\tgit add mouse &&\n' span_id:52) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:53) (Token id: Id.Lit_Chars val: '\tGIT_AUTHOR_NAME=Third git commit -m Third &&\n' span_id: 54 ) (Token id:Id.Lit_Chars val:'\n' span_id:55) (Token id:Id.Lit_Chars val:'\tcat mouse >cow &&\n' span_id:56) (Token id:Id.Lit_Chars val:'\tgit add cow &&\n' span_id:57) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:58) (Token id:Id.Lit_Chars val:'\tGIT_AUTHOR_NAME=Fourth git commit -m Fourth &&\n' span_id:59) (Token id:Id.Lit_Chars val:'\n' span_id:60) (Token id:Id.Lit_Chars val:'\tcat >cow <<-\\EOF &&\n' span_id:61) (Token id:Id.Lit_Chars val:'\tABC\n' span_id:62) (Token id:Id.Lit_Chars val:'\tDEF\n' span_id:63) (Token id:Id.Lit_Chars val:'\tXXXX\n' span_id:64) (Token id:Id.Lit_Chars val:'\tGHIJK\n' span_id:65) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:66) (Token id:Id.Lit_Chars val:'\tgit add cow &&\n' span_id:67) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:68) (Token id: Id.Lit_Chars val: '\tGIT_AUTHOR_NAME=Fifth git commit -m Fifth\n' span_id: 69 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'straight copy without -C' span_id:76))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:80) (Token id:Id.Lit_Chars val:'\n' span_id:81) (Token id:Id.Lit_Chars val:'\tgit blame uno | grep Second\n' span_id:82) (Token id:Id.Lit_Chars val:'\n' span_id:83) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'straight move without -C' span_id:90))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:94) (Token id:Id.Lit_Chars val:'\n' span_id:95) (Token id:Id.Lit_Chars val:'\tgit blame dos | grep Initial\n' span_id:96) (Token id:Id.Lit_Chars val:'\n' span_id:97) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'straight copy with -C' span_id:104))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:108) (Token id:Id.Lit_Chars val:'\n' span_id:109) (Token id:Id.Lit_Chars val:'\tgit blame -C1 uno | grep Second\n' span_id:110) (Token id:Id.Lit_Chars val:'\n' span_id:111) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'straight move with -C' span_id:118))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:122) (Token id:Id.Lit_Chars val:'\n' span_id:123) (Token id:Id.Lit_Chars val:'\tgit blame -C1 dos | grep Initial\n' span_id:124) (Token id:Id.Lit_Chars val:'\n' span_id:125) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'straight copy with -C -C' span_id:132))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:136) (Token id:Id.Lit_Chars val:'\n' span_id:137) (Token id:Id.Lit_Chars val:'\tgit blame -C -C1 uno | grep Initial\n' span_id:138) (Token id:Id.Lit_Chars val:'\n' span_id:139) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'straight move with -C -C' span_id:146))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:150) (Token id:Id.Lit_Chars val:'\n' span_id:151) (Token id:Id.Lit_Chars val:'\tgit blame -C -C1 dos | grep Initial\n' span_id:152) (Token id:Id.Lit_Chars val:'\n' span_id:153) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'append without -C' span_id:160))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:164) (Token id:Id.Lit_Chars val:'\n' span_id:165) (Token id:Id.Lit_Chars val:'\tgit blame -L2 tres | grep Second\n' span_id:166) (Token id:Id.Lit_Chars val:'\n' span_id:167) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'append with -C' span_id:174))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:178) (Token id:Id.Lit_Chars val:'\n' span_id:179) (Token id: Id.Lit_Chars val: '\tgit blame -L2 -C1 tres | grep Second\n' span_id: 180 ) (Token id:Id.Lit_Chars val:'\n' span_id:181) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'append with -C -C' span_id:188))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:192) (Token id:Id.Lit_Chars val:'\n' span_id:193) (Token id: Id.Lit_Chars val: '\tgit blame -L2 -C -C1 tres | grep Second\n' span_id: 194 ) (Token id:Id.Lit_Chars val:'\n' span_id:195) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'append with -C -C -C' span_id:202))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:206) (Token id:Id.Lit_Chars val:'\n' span_id:207) (Token id: Id.Lit_Chars val: '\tgit blame -L2 -C -C -C1 tres | grep Initial\n' span_id: 208 ) (Token id:Id.Lit_Chars val:'\n' span_id:209) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'blame wholesale copy' span_id:216))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:220) (Token id:Id.Lit_Chars val:'\n' span_id:221) (Token id: Id.Lit_Chars val: '\tgit blame -f -C -C1 HEAD^ -- cow | sed -e "$pick_fc" >current &&\n' span_id: 222 ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:223) (Token id:Id.Lit_Chars val:'\tmouse-Initial\n' span_id:224) (Token id:Id.Lit_Chars val:'\tmouse-Second\n' span_id:225) (Token id:Id.Lit_Chars val:'\tmouse-Third\n' span_id:226) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:227) (Token id:Id.Lit_Chars val:'\ttest_cmp expected current\n' span_id:228) (Token id:Id.Lit_Chars val:'\n' span_id:229) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'blame wholesale copy and more' span_id:236))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:240) (Token id:Id.Lit_Chars val:'\n' span_id:241) (Token id: Id.Lit_Chars val: '\tgit blame -f -C -C1 HEAD -- cow | sed -e "$pick_fc" >current &&\n' span_id: 242 ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:243) (Token id:Id.Lit_Chars val:'\tmouse-Initial\n' span_id:244) (Token id:Id.Lit_Chars val:'\tmouse-Second\n' span_id:245) (Token id:Id.Lit_Chars val:'\tcow-Fifth\n' span_id:246) (Token id:Id.Lit_Chars val:'\tmouse-Third\n' span_id:247) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:248) (Token id:Id.Lit_Chars val:'\ttest_cmp expected current\n' span_id:249) (Token id:Id.Lit_Chars val:'\n' span_id:250) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'blame wholesale copy and more in the index' span_id:257))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:261) (Token id:Id.Lit_Chars val:'\n' span_id:262) (Token id:Id.Lit_Chars val:'\tcat >horse <<-\\EOF &&\n' span_id:263) (Token id:Id.Lit_Chars val:'\tABC\n' span_id:264) (Token id:Id.Lit_Chars val:'\tDEF\n' span_id:265) (Token id:Id.Lit_Chars val:'\tXXXX\n' span_id:266) (Token id:Id.Lit_Chars val:'\tYYYY\n' span_id:267) (Token id:Id.Lit_Chars val:'\tGHIJK\n' span_id:268) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:269) (Token id:Id.Lit_Chars val:'\tgit add horse &&\n' span_id:270) (Token id: Id.Lit_Chars val: '\ttest_when_finished "git rm -f horse" &&\n' span_id: 271 ) (Token id: Id.Lit_Chars val: '\tgit blame -f -C -C1 -- horse | sed -e "$pick_fc" >current &&\n' span_id: 272 ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:273) (Token id:Id.Lit_Chars val:'\tmouse-Initial\n' span_id:274) (Token id:Id.Lit_Chars val:'\tmouse-Second\n' span_id:275) (Token id:Id.Lit_Chars val:'\tcow-Fifth\n' span_id:276) (Token id:Id.Lit_Chars val:'\thorse-Not\n' span_id:277) (Token id:Id.Lit_Chars val:'\tmouse-Third\n' span_id:278) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:279) (Token id:Id.Lit_Chars val:'\ttest_cmp expected current\n' span_id:280) (Token id:Id.Lit_Chars val:'\n' span_id:281) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'blame during cherry-pick with file rename conflict' span_id: 288 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:292) (Token id:Id.Lit_Chars val:'\n' span_id:293) (Token id: Id.Lit_Chars val: '\ttest_when_finished "git reset --hard && git checkout master" &&\n' span_id: 294 ) (Token id:Id.Lit_Chars val:'\tgit checkout HEAD~3 &&\n' span_id:295) (Token id:Id.Lit_Chars val:'\techo MOUSE >> mouse &&\n' span_id:296) (Token id:Id.Lit_Chars val:'\tgit mv mouse rodent &&\n' span_id:297) (Token id:Id.Lit_Chars val:'\tgit add rodent &&\n' span_id:298) (Token id:Id.Lit_Chars val:'\tGIT_AUTHOR_NAME=Rodent git commit -m "rodent" &&\n' span_id:299) (Token id:Id.Lit_Chars val:'\tgit checkout --detach master &&\n' span_id:300) (Token id:Id.Lit_Chars val:'\t(git cherry-pick HEAD@{1} || test $? -eq 1) &&\n' span_id:301) (Token id: Id.Lit_Chars val: '\tgit show HEAD@{1}:rodent > rodent &&\n' span_id: 302 ) (Token id:Id.Lit_Chars val:'\tgit add rodent &&\n' span_id:303) (Token id: Id.Lit_Chars val: '\tgit blame -f -C -C1 rodent | sed -e "$pick_fc" >current &&\n' span_id: 304 ) (Token id:Id.Lit_Chars val:'\tcat current &&\n' span_id:305) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:306) (Token id:Id.Lit_Chars val:'\tmouse-Initial\n' span_id:307) (Token id:Id.Lit_Chars val:'\tmouse-Second\n' span_id:308) (Token id:Id.Lit_Chars val:'\trodent-Not\n' span_id:309) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:310) (Token id:Id.Lit_Chars val:'\ttest_cmp expected current\n' span_id:311) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'blame path that used to be a directory' span_id:318))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:322) (Token id:Id.Lit_Chars val:'\tmkdir path &&\n' span_id:323) (Token id:Id.Lit_Chars val:'\techo A A A A A >path/file &&\n' span_id:324) (Token id:Id.Lit_Chars val:'\techo B B B B B >path/elif &&\n' span_id:325) (Token id:Id.Lit_Chars val:'\tgit add path &&\n' span_id:326) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:327) (Token id:Id.Lit_Chars val:'\tgit commit -m "path was a directory" &&\n' span_id:328) (Token id:Id.Lit_Chars val:'\trm -fr path &&\n' span_id:329) (Token id:Id.Lit_Chars val:'\techo A A A A A >path &&\n' span_id:330) (Token id:Id.Lit_Chars val:'\tgit add path &&\n' span_id:331) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:332) (Token id: Id.Lit_Chars val: '\tgit commit -m "path is a regular file" &&\n' span_id: 333 ) (Token id:Id.Lit_Chars val:'\tgit blame HEAD^.. -- path\n' span_id:334) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'blame to a commit with no author name' span_id:341))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:345) (Token id:Id.Lit_Chars val:' TREE=$(git rev-parse HEAD:) &&\n' span_id:346) (Token id:Id.Lit_Chars val:' cat >badcommit <<EOF &&\n' span_id:347) (Token id:Id.Lit_Chars val:'tree $TREE\n' span_id:348) (Token id:Id.Lit_Chars val:'author <noname> 1234567890 +0000\n' span_id:349) (Token id: Id.Lit_Chars val: 'committer David Reiss <dreiss@facebook.com> 1234567890 +0000\n' span_id: 350 ) (Token id:Id.Lit_Chars val:'\n' span_id:351) (Token id:Id.Lit_Chars val:'some message\n' span_id:352) (Token id:Id.Lit_Chars val:'EOF\n' span_id:353) (Token id:Id.Lit_Chars val:' COMMIT=$(git hash-object -t commit -w badcommit) &&\n' span_id:354) (Token id: Id.Lit_Chars val: ' git --no-pager blame $COMMIT -- uno >/dev/null\n' span_id: 355 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'blame -L with invalid start' span_id:362))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:366) (Token id: Id.Lit_Chars val: '\ttest_must_fail git blame -L5 tres 2>errors &&\n' span_id: 367 ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "has only 2 lines" errors\n' span_id:368) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'blame -L with invalid end' span_id:375))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:379) (Token id: Id.Lit_Chars val: '\ttest_must_fail git blame -L1,5 tres 2>errors &&\n' span_id: 380 ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "has only 2 lines" errors\n' span_id:381) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'blame parses <end> part of -L' span_id:388))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:392) (Token id:Id.Lit_Chars val:'\tgit blame -L1,1 tres >out &&\n' span_id:393) (Token id:Id.Lit_Chars val:'\tcat out &&\n' span_id:394) (Token id:Id.Lit_Chars val:'\ttest $(wc -l < out) -eq 1\n' span_id:395) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'indent of line numbers, nine lines' span_id:402))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:406) (Token id:Id.Lit_Chars val:'\tgit blame nine_lines >actual &&\n' span_id:407) (Token id:Id.Lit_Chars val:'\ttest $(grep -c " " actual) = 0\n' span_id:408) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'indent of line numbers, ten lines' span_id:415))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:419) (Token id:Id.Lit_Chars val:'\tgit blame ten_lines >actual &&\n' span_id:420) (Token id:Id.Lit_Chars val:'\ttest $(grep -c " " actual) = 9\n' span_id:421) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup file with CRLF newlines' span_id:428))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:432) (Token id:Id.Lit_Chars val:'\tgit config core.autocrlf false &&\n' span_id:433) (Token id:Id.Lit_Chars val:'\tprintf "testcase\\n" >crlffile &&\n' span_id:434) (Token id:Id.Lit_Chars val:'\tgit add crlffile &&\n' span_id:435) (Token id:Id.Lit_Chars val:'\tgit commit -m testcase &&\n' span_id:436) (Token id:Id.Lit_Chars val:'\tprintf "testcase\\r\\n" >crlffile\n' span_id:437) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'blame file with CRLF core.autocrlf true' span_id:444))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:448) (Token id:Id.Lit_Chars val:'\tgit config core.autocrlf true &&\n' span_id:449) (Token id:Id.Lit_Chars val:'\tgit blame crlffile >actual &&\n' span_id:450) (Token id:Id.Lit_Chars val:'\tgrep "A U Thor" actual\n' span_id:451) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'blame file with CRLF attributes text' span_id:458))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:462) (Token id:Id.Lit_Chars val:'\tgit config core.autocrlf false &&\n' span_id:463) (Token id:Id.Lit_Chars val:'\techo "crlffile text" >.gitattributes &&\n' span_id:464) (Token id:Id.Lit_Chars val:'\tgit blame crlffile >actual &&\n' span_id:465) (Token id:Id.Lit_Chars val:'\tgrep "A U Thor" actual\n' span_id:466) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'blame file with CRLF core.autocrlf=true' span_id:473))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:477) (Token id:Id.Lit_Chars val:'\tgit config core.autocrlf false &&\n' span_id:478) (Token id:Id.Lit_Chars val:'\tprintf "testcase\\r\\n" >crlfinrepo &&\n' span_id:479) (Token id:Id.Lit_Chars val:'\t>.gitattributes &&\n' span_id:480) (Token id:Id.Lit_Chars val:'\tgit add crlfinrepo &&\n' span_id:481) (Token id:Id.Lit_Chars val:'\tgit commit -m "add crlfinrepo" &&\n' span_id:482) (Token id:Id.Lit_Chars val:'\tgit config core.autocrlf true &&\n' span_id:483) (Token id:Id.Lit_Chars val:'\tmv crlfinrepo tmp &&\n' span_id:484) (Token id:Id.Lit_Chars val:'\tgit checkout crlfinrepo &&\n' span_id:485) (Token id:Id.Lit_Chars val:'\trm tmp &&\n' span_id:486) (Token id:Id.Lit_Chars val:'\tgit blame crlfinrepo >actual &&\n' span_id:487) (Token id:Id.Lit_Chars val:'\tgrep "A U Thor" actual\n' span_id:488) ) } ) (C {(test_done)}) ] )