(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: 'Compatibility with $XDG_CONFIG_HOME/git/ files'
                  span_id: 21
                )
              )
            }
          spids: [19]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'read config: xdg file exists and ~/.gitconfig doesn'
            span_id: 33
          )
        ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:35)) 
        (SQ (Token id:Id.Lit_Chars val:t span_id:37))
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:41) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p .config/git &&\n' span_id:42) (Token id:Id.Lit_Chars val:'\techo "[alias]" >.config/git/config &&\n' span_id:43) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "\tmyalias = !echo in_config" >>.config/git/config &&\n'
            span_id: 44
          ) (Token id:Id.Lit_Chars val:'\techo in_config >expected &&\n' span_id:45) 
          (Token id:Id.Lit_Chars val:'\tgit myalias >actual &&\n' span_id:46) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:47)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'read config: xdg file exists and ~/.gitconfig exists'
            span_id: 55
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:59) 
          (Token id:Id.Lit_Chars val:'\t>.gitconfig &&\n' span_id:60) (Token id:Id.Lit_Chars val:'\techo "[alias]" >.gitconfig &&\n' span_id:61) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "\tmyalias = !echo in_gitconfig" >>.gitconfig &&\n'
            span_id: 62
          ) (Token id:Id.Lit_Chars val:'\techo in_gitconfig >expected &&\n' span_id:63) 
          (Token id:Id.Lit_Chars val:'\tgit myalias >actual &&\n' span_id:64) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:65)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'read with --get: xdg file exists and ~/.gitconfig doesn'
            span_id: 73
          )
        ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:75)) 
        (SQ (Token id:Id.Lit_Chars val:t span_id:77))
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:81) 
          (Token id:Id.Lit_Chars val:'\trm .gitconfig &&\n' span_id:82) (Token id:Id.Lit_Chars val:'\techo "[user]" >.config/git/config &&\n' span_id:83) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "\tname = read_config" >>.config/git/config &&\n'
            span_id: 84
          ) (Token id:Id.Lit_Chars val:'\techo read_config >expected &&\n' span_id:85) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --get user.name >actual &&\n'
            span_id: 86
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:87)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'"$XDG_CONFIG_HOME overrides $HOME/.config/git' span_id:94))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:98) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p "$HOME"/xdg/git &&\n' span_id:99) (Token id:Id.Lit_Chars val:'\techo "[user]name = in_xdg" >"$HOME"/xdg/git/config &&\n' span_id:100) 
          (Token id:Id.Lit_Chars val:'\techo in_xdg >expected &&\n' span_id:101) 
          (Token
            id: Id.Lit_Chars
            val: '\tXDG_CONFIG_HOME="$HOME"/xdg git config --get-all user.name >actual &&\n'
            span_id: 102
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:103)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'read with --get: xdg file exists and ~/.gitconfig exists'
            span_id: 110
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:114) 
          (Token id:Id.Lit_Chars val:'\t>.gitconfig &&\n' span_id:115) (Token id:Id.Lit_Chars val:'\techo "[user]" >.gitconfig &&\n' span_id:116) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "\tname = read_gitconfig" >>.gitconfig &&\n'
            span_id: 117
          ) (Token id:Id.Lit_Chars val:'\techo read_gitconfig >expected &&\n' span_id:118) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --get user.name >actual &&\n'
            span_id: 119
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:120)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'read with --list: xdg file exists and ~/.gitconfig doesn'
            span_id: 128
          )
        ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:130)) 
        (SQ (Token id:Id.Lit_Chars val:t span_id:132))
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:136) 
          (Token id:Id.Lit_Chars val:'\trm .gitconfig &&\n' span_id:137) (Token id:Id.Lit_Chars val:'\techo user.name=read_config >expected &&\n' span_id:138) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --global --list >actual &&\n'
            span_id: 139
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:140)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'read with --list: xdg file exists and ~/.gitconfig exists'
            span_id: 148
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:152) 
          (Token id:Id.Lit_Chars val:'\t>.gitconfig &&\n' span_id:153) (Token id:Id.Lit_Chars val:'\techo "[user]" >.gitconfig &&\n' span_id:154) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "\tname = read_gitconfig" >>.gitconfig &&\n'
            span_id: 155
          ) (Token id:Id.Lit_Chars val:'\techo user.name=read_gitconfig >expected &&\n' span_id:156) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --global --list >actual &&\n'
            span_id: 157
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:158)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:Setup span_id:166))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:170) 
          (Token id:Id.Lit_Chars val:'\tgit init git &&\n' span_id:171) (Token id:Id.Lit_Chars val:'\tcd git &&\n' span_id:172) 
          (Token id:Id.Lit_Chars val:'\techo foo >to_be_excluded\n' span_id:173)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Exclusion of a file in the XDG ignore file' span_id:181))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:185) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p "$HOME"/.config/git/ &&\n' span_id:186) (Token id:Id.Lit_Chars val:'\techo to_be_excluded >"$HOME"/.config/git/ignore &&\n' span_id:187) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git add to_be_excluded\n'
            span_id: 188
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '$XDG_CONFIG_HOME overrides $HOME/.config/git/ignore'
            span_id: 195
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:199) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p "$HOME"/xdg/git &&\n' span_id:200) (Token id:Id.Lit_Chars val:'\techo content >excluded_by_xdg_only &&\n' span_id:201) 
          (Token
            id: Id.Lit_Chars
            val: '\techo excluded_by_xdg_only >"$HOME"/xdg/git/ignore &&\n'
            span_id: 202
          ) (Token id:Id.Lit_Chars val:'\ttest_when_finished "git read-tree --empty" &&\n' span_id:203) 
          (Token id:Id.Lit_Chars val:'\t(XDG_CONFIG_HOME="$HOME/xdg" &&\n' span_id:204) (Token id:Id.Lit_Chars val:'\t export XDG_CONFIG_HOME &&\n' span_id:205) 
          (Token id:Id.Lit_Chars val:'\t git add to_be_excluded &&\n' span_id:206) (Token id:Id.Lit_Chars val:'\t test_must_fail git add excluded_by_xdg_only\n' span_id:207) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:208)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Exclusion in both XDG and local ignore files' span_id:215))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:219) 
          (Token id:Id.Lit_Chars val:'\techo to_be_excluded >.gitignore &&\n' span_id:220) (Token id:Id.Lit_Chars val:'\ttest_must_fail git add to_be_excluded\n' span_id:221)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Exclusion in a non-XDG global ignore file' span_id:229))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:233) 
          (Token id:Id.Lit_Chars val:'\trm .gitignore &&\n' span_id:234) (Token id:Id.Lit_Chars val:'\techo >"$HOME"/.config/git/ignore &&\n' span_id:235) 
          (Token
            id: Id.Lit_Chars
            val: '\techo to_be_excluded >"$HOME"/my_gitignore &&\n'
            span_id: 236
          ) (Token id:Id.Lit_Chars val:'\tgit config core.excludesfile "$HOME"/my_gitignore &&\n' span_id:237) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git add to_be_excluded\n'
            span_id: 238
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Checking XDG ignore file when HOME is unset' span_id:245))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:249) 
          (Token id:Id.Lit_Chars val:'\t>expected &&\n' span_id:250) (Token id:Id.Lit_Chars val:'\t(sane_unset HOME &&\n' span_id:251) 
          (Token
            id: Id.Lit_Chars
            val: '\t git config --unset core.excludesfile &&\n'
            span_id: 252
          ) (Token id:Id.Lit_Chars val:'\t git ls-files --exclude-standard --ignored >actual) &&\n' span_id:253) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:254)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Checking attributes in the XDG attributes file' span_id:261))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:265) 
          (Token id:Id.Lit_Chars val:'\techo foo >f &&\n' span_id:266) (Token id:Id.Lit_Chars val:'\tgit check-attr -a f >actual &&\n' span_id:267) 
          (Token id:Id.Lit_Chars val:'\ttest_line_count -eq 0 actual &&\n' span_id:268) (Token id:Id.Lit_Chars val:'\techo "f attr_f" >"$HOME"/.config/git/attributes &&\n' span_id:269) 
          (Token id:Id.Lit_Chars val:'\techo "f: attr_f: set" >expected &&\n' span_id:270) (Token id:Id.Lit_Chars val:'\tgit check-attr -a f >actual &&\n' span_id:271) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:272)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Checking XDG attributes when HOME is unset' span_id:279))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:283) 
          (Token id:Id.Lit_Chars val:'\t>expected &&\n' span_id:284) (Token id:Id.Lit_Chars val:'\t(sane_unset HOME &&\n' span_id:285) 
          (Token id:Id.Lit_Chars val:'\t git check-attr -a f >actual) &&\n' span_id:286) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:287)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '$XDG_CONFIG_HOME overrides $HOME/.config/git/attributes'
            span_id: 294
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:298) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p "$HOME"/xdg/git &&\n' span_id:299) (Token id:Id.Lit_Chars val:'\techo "f attr_f=xdg" >"$HOME"/xdg/git/attributes &&\n' span_id:300) 
          (Token id:Id.Lit_Chars val:'\techo "f: attr_f: xdg" >expected &&\n' span_id:301) 
          (Token
            id: Id.Lit_Chars
            val: '\tXDG_CONFIG_HOME="$HOME/xdg" git check-attr -a f >actual &&\n'
            span_id: 302
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:303)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'Checking attributes in both XDG and local attributes files'
            span_id: 310
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:314) 
          (Token id:Id.Lit_Chars val:'\techo "f -attr_f" >.gitattributes &&\n' span_id:315) (Token id:Id.Lit_Chars val:'\techo "f: attr_f: unset" >expected &&\n' span_id:316) 
          (Token id:Id.Lit_Chars val:'\tgit check-attr -a f >actual &&\n' span_id:317) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:318)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'Checking attributes in a non-XDG global attributes file'
            span_id: 326
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:330) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_might_fail rm .gitattributes &&\n'
            span_id: 331
          ) (Token id:Id.Lit_Chars val:'\techo "f attr_f=test" >"$HOME"/my_gitattributes &&\n' span_id:332) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config core.attributesfile "$HOME"/my_gitattributes &&\n'
            span_id: 333
          ) (Token id:Id.Lit_Chars val:'\techo "f: attr_f: test" >expected &&\n' span_id:334) 
          (Token id:Id.Lit_Chars val:'\tgit check-attr -a f >actual &&\n' span_id:335) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:336)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'write: xdg file exists and ~/.gitconfig doesn' span_id:344)) 
        (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:346)) (SQ (Token id:Id.Lit_Chars val:t span_id:348))
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:352) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p "$HOME"/.config/git &&\n' span_id:353) (Token id:Id.Lit_Chars val:'\t>"$HOME"/.config/git/config &&\n' span_id:354) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_might_fail rm "$HOME"/.gitconfig &&\n'
            span_id: 355
          ) (Token id:Id.Lit_Chars val:'\tgit config --global user.name "write_config" &&\n' span_id:356) 
          (Token id:Id.Lit_Chars val:'\techo "[user]" >expected &&\n' span_id:357) (Token id:Id.Lit_Chars val:'\techo "\tname = write_config" >>expected &&\n' span_id:358) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp expected "$HOME"/.config/git/config\n'
            span_id: 359
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'write: xdg file exists and ~/.gitconfig exists' span_id:367))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:371) 
          (Token id:Id.Lit_Chars val:'\t>"$HOME"/.gitconfig &&\n' span_id:372) (Token id:Id.Lit_Chars val:'\tgit config --global user.name "write_gitconfig" &&\n' span_id:373) 
          (Token id:Id.Lit_Chars val:'\techo "[user]" >expected &&\n' span_id:374) (Token id:Id.Lit_Chars val:'\techo "\tname = write_gitconfig" >>expected &&\n' span_id:375) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp expected "$HOME"/.gitconfig\n'
            span_id: 376
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'write: ~/.config/git/ exists and config file doesn'
            span_id: 384
          )
        ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:386)) 
        (SQ (Token id:Id.Lit_Chars val:t span_id:388))
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:392) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_might_fail rm "$HOME"/.gitconfig &&\n'
            span_id: 393
          ) (Token id:Id.Lit_Chars val:'\ttest_might_fail rm "$HOME"/.config/git/config &&\n' span_id:394) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --global user.name "write_gitconfig" &&\n'
            span_id: 395
          ) (Token id:Id.Lit_Chars val:'\techo "[user]" >expected &&\n' span_id:396) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "\tname = write_gitconfig" >>expected &&\n'
            span_id: 397
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected "$HOME"/.gitconfig\n' span_id:398)
        )
      }
    )
    (C {(test_done)})
  ]
)