(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <"git blame corner cases">)}
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./test-lib.sh)})
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:pick_fc)
          op: Equal
          rhs: {(SQ <"s/^[0-9a-f^]* *\\([^ ]*\\) *(\\([^ ]*\\) .*/\\1-\\2/">)}
          spids: [14]
        )
      ]
      spids: [14]
    )
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ <"\n"> <"\n"> <"\techo A A A A A >one &&\n"> <"\techo B B B B B >two &&\n"> 
          <"\techo C C C C C >tres &&\n"> <"\techo ABC >mouse &&\n"> <"\tfor i in 1 2 3 4 5 6 7 8 9\n"> <"\tdo\n"> <"\t\techo $i\n"> 
          <"\tdone >nine_lines &&\n"> <"\tfor i in 1 2 3 4 5 6 7 8 9 a\n"> <"\tdo\n"> <"\t\techo $i\n"> <"\tdone >ten_lines &&\n"> 
          <"\tgit add one two tres mouse nine_lines ten_lines &&\n"> <"\ttest_tick &&\n"> <"\tGIT_AUTHOR_NAME=Initial git commit -m Initial &&\n"> <"\n"> 
          <"\tcat one >uno &&\n"> <"\tmv two dos &&\n"> <"\tcat one >>tres &&\n"> <"\techo DEF >>mouse &&\n"> 
          <"\tgit add uno dos tres mouse &&\n"> <"\ttest_tick &&\n"> <"\tGIT_AUTHOR_NAME=Second git commit -a -m Second &&\n"> <"\n"> 
          <"\techo GHIJK >>mouse &&\n"> <"\tgit add mouse &&\n"> <"\ttest_tick &&\n"> <"\tGIT_AUTHOR_NAME=Third git commit -m Third &&\n"> 
          <"\n"> <"\tcat mouse >cow &&\n"> <"\tgit add cow &&\n"> <"\ttest_tick &&\n"> 
          <"\tGIT_AUTHOR_NAME=Fourth git commit -m Fourth &&\n"> <"\n"> <"\tcat >cow <<-\\EOF &&\n"> <"\tABC\n"> <"\tDEF\n"> <"\tXXXX\n"> <"\tGHIJK\n"> <"\tEOF\n"> 
          <"\tgit add cow &&\n"> <"\ttest_tick &&\n"> <"\tGIT_AUTHOR_NAME=Fifth git commit -m Fifth\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"straight copy without -C">)} 
      {(SQ <"\n"> <"\n"> <"\tgit blame uno | grep Second\n"> <"\n">)}
    )
    (C {(test_expect_success)} {(SQ <"straight move without -C">)} 
      {(SQ <"\n"> <"\n"> <"\tgit blame dos | grep Initial\n"> <"\n">)}
    )
    (C {(test_expect_success)} {(SQ <"straight copy with -C">)} 
      {(SQ <"\n"> <"\n"> <"\tgit blame -C1 uno | grep Second\n"> <"\n">)}
    )
    (C {(test_expect_success)} {(SQ <"straight move with -C">)} 
      {(SQ <"\n"> <"\n"> <"\tgit blame -C1 dos | grep Initial\n"> <"\n">)}
    )
    (C {(test_expect_success)} {(SQ <"straight copy with -C -C">)} 
      {(SQ <"\n"> <"\n"> <"\tgit blame -C -C1 uno | grep Initial\n"> <"\n">)}
    )
    (C {(test_expect_success)} {(SQ <"straight move with -C -C">)} 
      {(SQ <"\n"> <"\n"> <"\tgit blame -C -C1 dos | grep Initial\n"> <"\n">)}
    )
    (C {(test_expect_success)} {(SQ <"append without -C">)} 
      {(SQ <"\n"> <"\n"> <"\tgit blame -L2 tres | grep Second\n"> <"\n">)}
    )
    (C {(test_expect_success)} {(SQ <"append with -C">)} 
      {(SQ <"\n"> <"\n"> <"\tgit blame -L2 -C1 tres | grep Second\n"> <"\n">)}
    )
    (C {(test_expect_success)} {(SQ <"append with -C -C">)} 
      {(SQ <"\n"> <"\n"> <"\tgit blame -L2 -C -C1 tres | grep Second\n"> <"\n">)}
    )
    (C {(test_expect_success)} {(SQ <"append with -C -C -C">)} 
      {(SQ <"\n"> <"\n"> <"\tgit blame -L2 -C -C -C1 tres | grep Initial\n"> <"\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame wholesale copy">)} 
      {
        (SQ <"\n"> <"\n"> <"\tgit blame -f -C -C1 HEAD^ -- cow | sed -e \"$pick_fc\" >current &&\n"> 
          <"\tcat >expected <<-\\EOF &&\n"> <"\tmouse-Initial\n"> <"\tmouse-Second\n"> <"\tmouse-Third\n"> <"\tEOF\n"> 
          <"\ttest_cmp expected current\n"> <"\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame wholesale copy and more">)} 
      {
        (SQ <"\n"> <"\n"> <"\tgit blame -f -C -C1 HEAD -- cow | sed -e \"$pick_fc\" >current &&\n"> 
          <"\tcat >expected <<-\\EOF &&\n"> <"\tmouse-Initial\n"> <"\tmouse-Second\n"> <"\tcow-Fifth\n"> <"\tmouse-Third\n"> <"\tEOF\n"> 
          <"\ttest_cmp expected current\n"> <"\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame wholesale copy and more in the index">)} 
      {
        (SQ <"\n"> <"\n"> <"\tcat >horse <<-\\EOF &&\n"> <"\tABC\n"> <"\tDEF\n"> <"\tXXXX\n"> <"\tYYYY\n"> 
          <"\tGHIJK\n"> <"\tEOF\n"> <"\tgit add horse &&\n"> <"\ttest_when_finished \"git rm -f horse\" &&\n"> 
          <"\tgit blame -f -C -C1 -- horse | sed -e \"$pick_fc\" >current &&\n"> <"\tcat >expected <<-\\EOF &&\n"> <"\tmouse-Initial\n"> <"\tmouse-Second\n"> <"\tcow-Fifth\n"> 
          <"\thorse-Not\n"> <"\tmouse-Third\n"> <"\tEOF\n"> <"\ttest_cmp expected current\n"> <"\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame during cherry-pick with file rename conflict">)} 
      {
        (SQ <"\n"> <"\n"> <"\ttest_when_finished \"git reset --hard && git checkout master\" &&\n"> 
          <"\tgit checkout HEAD~3 &&\n"> <"\techo MOUSE >> mouse &&\n"> <"\tgit mv mouse rodent &&\n"> <"\tgit add rodent &&\n"> 
          <"\tGIT_AUTHOR_NAME=Rodent git commit -m \"rodent\" &&\n"> <"\tgit checkout --detach master &&\n"> <"\t(git cherry-pick HEAD@{1} || test $? -eq 1) &&\n"> 
          <"\tgit show HEAD@{1}:rodent > rodent &&\n"> <"\tgit add rodent &&\n"> <"\tgit blame -f -C -C1 rodent | sed -e \"$pick_fc\" >current &&\n"> 
          <"\tcat current &&\n"> <"\tcat >expected <<-\\EOF &&\n"> <"\tmouse-Initial\n"> <"\tmouse-Second\n"> <"\trodent-Not\n"> 
          <"\tEOF\n"> <"\ttest_cmp expected current\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame path that used to be a directory">)} 
      {
        (SQ <"\n"> <"\tmkdir path &&\n"> <"\techo A A A A A >path/file &&\n"> 
          <"\techo B B B B B >path/elif &&\n"> <"\tgit add path &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"path was a directory\" &&\n"> 
          <"\trm -fr path &&\n"> <"\techo A A A A A >path &&\n"> <"\tgit add path &&\n"> <"\ttest_tick &&\n"> 
          <"\tgit commit -m \"path is a regular file\" &&\n"> <"\tgit blame HEAD^.. -- path\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame to a commit with no author name">)} 
      {
        (SQ <"\n"> <"  TREE=$(git rev-parse HEAD:) &&\n"> <"  cat >badcommit <<EOF &&\n"> 
          <"tree $TREE\n"> <"author <noname> 1234567890 +0000\n"> 
          <"committer David Reiss <dreiss@facebook.com> 1234567890 +0000\n"> <"\n"> <"some message\n"> <"EOF\n"> <"  COMMIT=$(git hash-object -t commit -w badcommit) &&\n"> 
          <"  git --no-pager blame $COMMIT -- uno >/dev/null\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame -L with invalid start">)} 
      {
        (SQ <"\n"> <"\ttest_must_fail git blame -L5 tres 2>errors &&\n"> 
          <"\ttest_i18ngrep \"has only 2 lines\" errors\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame -L with invalid end">)} 
      {
        (SQ <"\n"> <"\ttest_must_fail git blame -L1,5 tres 2>errors &&\n"> 
          <"\ttest_i18ngrep \"has only 2 lines\" errors\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame parses <end> part of -L">)} 
      {
        (SQ <"\n"> <"\tgit blame -L1,1 tres >out &&\n"> <"\tcat out &&\n"> 
          <"\ttest $(wc -l < out) -eq 1\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"indent of line numbers, nine lines">)} 
      {(SQ <"\n"> <"\tgit blame nine_lines >actual &&\n"> <"\ttest $(grep -c \"  \" actual) = 0\n">)}
    )
    (C {(test_expect_success)} {(SQ <"indent of line numbers, ten lines">)} 
      {(SQ <"\n"> <"\tgit blame ten_lines >actual &&\n"> <"\ttest $(grep -c \"  \" actual) = 9\n">)}
    )
    (C {(test_expect_success)} {(SQ <"setup file with CRLF newlines">)} 
      {
        (SQ <"\n"> <"\tgit config core.autocrlf false &&\n"> 
          <"\tprintf \"testcase\\n\" >crlffile &&\n"> <"\tgit add crlffile &&\n"> <"\tgit commit -m testcase &&\n"> 
          <"\tprintf \"testcase\\r\\n\" >crlffile\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame file with CRLF core.autocrlf true">)} 
      {
        (SQ <"\n"> <"\tgit config core.autocrlf true &&\n"> <"\tgit blame crlffile >actual &&\n"> 
          <"\tgrep \"A U Thor\" actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame file with CRLF attributes text">)} 
      {
        (SQ <"\n"> <"\tgit config core.autocrlf false &&\n"> 
          <"\techo \"crlffile text\" >.gitattributes &&\n"> <"\tgit blame crlffile >actual &&\n"> <"\tgrep \"A U Thor\" actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame file with CRLF core.autocrlf=true">)} 
      {
        (SQ <"\n"> <"\tgit config core.autocrlf false &&\n"> 
          <"\tprintf \"testcase\\r\\n\" >crlfinrepo &&\n"> <"\t>.gitattributes &&\n"> <"\tgit add crlfinrepo &&\n"> <"\tgit commit -m \"add crlfinrepo\" &&\n"> 
          <"\tgit config core.autocrlf true &&\n"> <"\tmv crlfinrepo tmp &&\n"> <"\tgit checkout crlfinrepo &&\n"> <"\trm tmp &&\n"> 
          <"\tgit blame crlfinrepo >actual &&\n"> <"\tgrep \"A U Thor\" actual\n">
        )
      }
    )
    (C {(test_done)})
  ]
)