(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)})
  ]
)