(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:'basic tests for fast-export --anonymize' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup simple repo' span_id:17))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:21) 
          (Token id:Id.Lit_Chars val:'\ttest_commit base &&\n' span_id:22) (Token id:Id.Lit_Chars val:'\ttest_commit foo &&\n' span_id:23) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -b other HEAD^ &&\n' span_id:24) (Token id:Id.Lit_Chars val:'\tmkdir subdir &&\n' span_id:25) 
          (Token id:Id.Lit_Chars val:'\ttest_commit subdir/bar &&\n' span_id:26) (Token id:Id.Lit_Chars val:'\ttest_commit subdir/xyzzy &&\n' span_id:27) 
          (Token id:Id.Lit_Chars val:'\tgit tag -m "annotated tag" mytag\n' span_id:28)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'export anonymized stream' span_id:35))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:39) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit fast-export --anonymize --all >stream\n'
            span_id: 40
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'stream omits path names' span_id:50))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:54) 
          (Token id:Id.Lit_Chars val:'\t! grep base stream &&\n' span_id:55) (Token id:Id.Lit_Chars val:'\t! grep foo stream &&\n' span_id:56) 
          (Token id:Id.Lit_Chars val:'\t! grep subdir stream &&\n' span_id:57) (Token id:Id.Lit_Chars val:'\t! grep bar stream &&\n' span_id:58) 
          (Token id:Id.Lit_Chars val:'\t! grep xyzzy stream\n' span_id:59)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'stream allows master as refname' span_id:66))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:70) 
          (Token id:Id.Lit_Chars val:'\tgrep master stream\n' span_id:71)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'stream omits other refnames' span_id:78))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:82) 
          (Token id:Id.Lit_Chars val:'\t! grep other stream &&\n' span_id:83) (Token id:Id.Lit_Chars val:'\t! grep mytag stream\n' span_id:84)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'stream omits identities' span_id:91))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:95) 
          (Token
            id: Id.Lit_Chars
            val: '\t! grep "$GIT_COMMITTER_NAME" stream &&\n'
            span_id: 96
          ) (Token id:Id.Lit_Chars val:'\t! grep "$GIT_COMMITTER_EMAIL" stream &&\n' span_id:97) 
          (Token id:Id.Lit_Chars val:'\t! grep "$GIT_AUTHOR_NAME" stream &&\n' span_id:98) (Token id:Id.Lit_Chars val:'\t! grep "$GIT_AUTHOR_EMAIL" stream\n' span_id:99)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'stream omits tag message' span_id:106))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:110) 
          (Token id:Id.Lit_Chars val:'\t! grep "annotated tag" stream\n' span_id:111)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'import stream to new repository' span_id:124))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:128) 
          (Token id:Id.Lit_Chars val:'\tgit init new &&\n' span_id:129) (Token id:Id.Lit_Chars val:'\tcd new &&\n' span_id:130) 
          (Token id:Id.Lit_Chars val:'\tgit fast-import <../stream\n' span_id:131)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'result has two branches' span_id:138))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:142) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit for-each-ref --format="%(refname)" refs/heads >branches &&\n'
            span_id: 143
          ) (Token id:Id.Lit_Chars val:'\ttest_line_count = 2 branches &&\n' span_id:144) 
          (Token
            id: Id.Lit_Chars
            val: '\tother_branch=$(grep -v refs/heads/master branches)\n'
            span_id: 145
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'repo has original shape and timestamps' span_id:152))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:156) 
          (Token id:Id.Lit_Chars val:'\tshape () {\n' span_id:157) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit log --format="%m %ct" --left-right --boundary "$@"\n'
            span_id: 158
          ) (Token id:Id.Lit_Chars val:'\t} &&\n' span_id:159) 
          (Token
            id: Id.Lit_Chars
            val: '\t(cd .. && shape master...other) >expect &&\n'
            span_id: 160
          ) (Token id:Id.Lit_Chars val:'\tshape master...$other_branch >actual &&\n' span_id:161) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:162)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'root tree has original shape' span_id:169))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:173) 
          (Token
            id: Id.Lit_Chars
            val: '\t# the output entries are not necessarily in the same\n'
            span_id: 174
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t# order, but we know at least that we will have one tree\n'
            span_id: 175
          ) (Token id:Id.Lit_Chars val:'\t# and one blob, so just check the sorted order\n' span_id:176) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:177) (Token id:Id.Lit_Chars val:'\tblob\n' span_id:178) (Token id:Id.Lit_Chars val:'\ttree\n' span_id:179) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:180) (Token id:Id.Lit_Chars val:'\tgit ls-tree $other_branch >root &&\n' span_id:181) 
          (Token
            id: Id.Lit_Chars
            val: '\tcut -d" " -f2 <root | sort >actual &&\n'
            span_id: 182
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:183)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'paths in subdir ended up in one tree' span_id:190))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:194) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:195) (Token id:Id.Lit_Chars val:'\tblob\n' span_id:196) (Token id:Id.Lit_Chars val:'\tblob\n' span_id:197) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:198) (Token id:Id.Lit_Chars val:'\ttree=$(grep tree root | cut -f2) &&\n' span_id:199) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-tree $other_branch:$tree >tree &&\n'
            span_id: 200
          ) (Token id:Id.Lit_Chars val:'\tcut -d" " -f2 <tree >actual &&\n' span_id:201) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:202)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'tag points to branch tip' span_id:209))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:213) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-parse $other_branch >expect &&\n'
            span_id: 214
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit for-each-ref --format="%(*objectname)" | grep . >actual &&\n'
            span_id: 215
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:216)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'idents are shared' span_id:223))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:227) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --all --format="%an <%ae>" >authors &&\n'
            span_id: 228
          ) (Token id:Id.Lit_Chars val:'\tsort -u authors >unique &&\n' span_id:229) 
          (Token id:Id.Lit_Chars val:'\ttest_line_count = 1 unique &&\n' span_id:230) (Token id:Id.Lit_Chars val:'\tgit log --all --format="%cn <%ce>" >committers &&\n' span_id:231) 
          (Token id:Id.Lit_Chars val:'\tsort -u committers >unique &&\n' span_id:232) (Token id:Id.Lit_Chars val:'\ttest_line_count = 1 unique &&\n' span_id:233) 
          (Token id:Id.Lit_Chars val:'\t! test_cmp authors committers\n' span_id:234)
        )
      }
    )
    (C {(test_done)})
  ]
)