(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: 
            {
              (DQ <'Tests of cwd/prefix/worktree/gitdir setup in all cases\n'> <'\n'> 
                <'A few rules for repo setup:\n'> <'\n'> <'1. GIT_DIR is relative to user\'s cwd. --git-dir is equivalent to\n'> <'   GIT_DIR.\n'> <'\n'> 
                <'2. .git file is relative to parent directory. .git file is basically\n'> <'   symlink in disguise. The directory where .git file points to will\n'> 
                <'   become new git_dir.\n'> <'\n'> <'3. core.worktree is relative to git_dir.\n'> <'\n'> 
                <'4. GIT_WORK_TREE is relative to user\'s cwd. --work-tree is\n'> <'   equivalent to GIT_WORK_TREE.\n'> <'\n'> 
                <'5. GIT_WORK_TREE/core.worktree was originally meant to work only if\n'> <'   GIT_DIR is set, but earlier git didn\'t enforce it, and some scripts\n'> 
                <'   depend on the implementation that happened to first discover .git by\n'> <'   going up from the users '> ($ Id.VSub_DollarName '$cwd') 
                <' and then using the specified working tree\n'> <'   that may or may not have any relation to where .git was found in.  This\n'> 
                <'   historical behaviour must be kept.\n'> <'\n'> <'6. Effective GIT_WORK_TREE overrides core.worktree and core.bare\n'> <'\n'> 
                <'7. Effective core.worktree conflicts with core.bare\n'> <'\n'> <'8. If GIT_DIR is set but neither worktree nor bare setting is given,\n'> 
                <'   original cwd becomes worktree.\n'> <'\n'> <'9. If .git discovery is done inside a repo, the repo becomes a bare\n'> 
                <'   repo. .git discovery is performed if GIT_DIR is not set.\n'> <'\n'> <'10. If no worktree is available, cwd remains unchanged, prefix is\n'> <'    NULL.\n'> <'\n'> 
                <'11. When user\'s cwd is outside worktree, cwd remains unchanged,\n'> <'    prefix is NULL.\n'>
              )
            }
          spids: [4]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:here)
          op: assign_op.Equal
          rhs: {(command_sub left_token:<Id.Left_DollarParen '$('> child:(C {<pwd>}))}
          spids: [53]
        )
      ]
    )
    (command.ShFunction
      name: test_repo
      body: 
        (BraceGroup
          children: [
            (command.Subshell
              child: 
                (command.AndOr
                  ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
                  children: [
                    (C {<cd>} {(DQ ($ Id.VSub_Number '$1'))})
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [(C {<test>} {<-n>} {(DQ ($ Id.VSub_Number '$2'))})]
                            )
                          action: [
                            (command.AndOr
                              ops: [Id.Op_DAmp]
                              children: [
                                (command.ShAssignment
                                  pairs: [
                                    (assign_pair
                                      lhs: (sh_lhs_expr.Name name:GIT_DIR)
                                      op: assign_op.Equal
                                      rhs: {(DQ ($ Id.VSub_Number '$2'))}
                                      spids: [93]
                                    )
                                  ]
                                )
                                (C {<export>} {<GIT_DIR>})
                              ]
                            )
                          ]
                          spids: [79 90]
                        )
                      ]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [(C {<test>} {<-n>} {(DQ ($ Id.VSub_Number '$3'))})]
                            )
                          action: [
                            (command.AndOr
                              ops: [Id.Op_DAmp]
                              children: [
                                (command.ShAssignment
                                  pairs: [
                                    (assign_pair
                                      lhs: (sh_lhs_expr.Name name:GIT_WORK_TREE)
                                      op: assign_op.Equal
                                      rhs: {(DQ ($ Id.VSub_Number '$3'))}
                                      spids: [125]
                                    )
                                  ]
                                )
                                (C {<export>} {<GIT_WORK_TREE>})
                              ]
                            )
                          ]
                          spids: [111 122]
                        )
                      ]
                    )
                    (C {<rm>} {<-f>} {<trace>})
                    (command.Simple
                      words: [{<git>} {<symbolic-ref>} {<HEAD>}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {<'/dev/null'>}
                        )
                      ]
                      more_env: [
                        (env_pair
                          name: GIT_TRACE_SETUP
                          val: 
                            {
                              (DQ (command_sub left_token:<Id.Left_DollarParen '$('> child:(C {<pwd>})) 
                                <'/trace'>
                              )
                            }
                          spids: [152]
                        )
                      ]
                      do_fork: T
                    )
                    (command.Simple
                      words: [{<grep>} {(SQ <'^setup: '>)} {<trace>}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {<result>}
                        )
                      ]
                      do_fork: T
                    )
                    (C {<test_cmp>} {<expected>} {<result>})
                  ]
                )
            )
          ]
        )
    )
    (command.ShFunction
      name: maybe_config
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:file)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_Number '$1')}
                      spids: [206]
                    )
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:var)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_Number '$2')}
                      spids: [209]
                    )
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:value)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_Number '$3')}
                      spids: [212]
                    )
                  ]
                )
                (command.If
                  arms: [
                    (if_arm
                      cond: 
                        (condition.Shell
                          commands: [
                            (C {<test>} {(DQ ($ Id.VSub_DollarName '$value'))} 
                              {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {<unset>}
                            )
                          ]
                        )
                      action: [
                        (C {<git>} {<config>} 
                          {<--file> <Id.Lit_Equals '='> (DQ ($ Id.VSub_DollarName '$file'))} {(DQ ($ Id.VSub_DollarName '$var'))} {(DQ ($ Id.VSub_DollarName '$value'))}
                        )
                      ]
                      spids: [218 232]
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: setup_repo
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:name)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_Number '$1')}
                      spids: [267]
                    )
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:worktreecfg)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_Number '$2')}
                      spids: [270]
                    )
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:gitfile)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_Number '$3')}
                      spids: [273]
                    )
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:barecfg)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_Number '$4')}
                      spids: [276]
                    )
                  ]
                )
                (C {<sane_unset>} {<GIT_DIR>} {<GIT_WORK_TREE>})
                (C {<git>} {<init>} {(DQ ($ Id.VSub_DollarName '$name'))})
                (C {<maybe_config>} {(DQ ($ Id.VSub_DollarName '$name') <'/.git/config'>)} 
                  {<core.worktree>} {(DQ ($ Id.VSub_DollarName '$worktreecfg'))}
                )
                (C {<maybe_config>} {(DQ ($ Id.VSub_DollarName '$name') <'/.git/config'>)} {<core.bare>} 
                  {(DQ ($ Id.VSub_DollarName '$barecfg'))}
                )
                (C {<mkdir>} {<-p>} {(DQ ($ Id.VSub_DollarName '$name') <'/sub/sub'>)})
                (command.If
                  arms: [
                    (if_arm
                      cond: 
                        (condition.Shell
                          commands: [
                            (C {<test>} 
                              {
                                (DQ 
                                  (braced_var_sub
                                    token: <Id.VSub_Name gitfile>
                                    suffix_op: 
                                      (suffix_op.Unary
                                        tok: <Id.VTest_ColonPlus ':+'>
                                        arg_word: {<set>}
                                      )
                                  )
                                )
                              }
                            )
                          ]
                        )
                      action: [
                        (command.AndOr
                          ops: [Id.Op_DAmp]
                          children: [
                            (C {<mv>} {(DQ ($ Id.VSub_DollarName '$name') <'/.git'>)} 
                              {(DQ ($ Id.VSub_DollarName '$name') <.git>)}
                            )
                            (command.Simple
                              words: [
                                {<echo>}
                                {(DQ <'gitdir: ../'> ($ Id.VSub_DollarName '$name') <.git>)}
                              ]
                              redirects: [
                                (redir
                                  op: <Id.Redir_Great '>'>
                                  loc: (redir_loc.Fd fd:1)
                                  arg: {(DQ ($ Id.VSub_DollarName '$name') <'/.git'>)}
                                )
                              ]
                              do_fork: T
                            )
                          ]
                        )
                      ]
                      spids: [348 361]
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: maybe_set
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:var)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_Number '$1')}
                      spids: [407]
                    )
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:value)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_Number '$2')}
                      spids: [410]
                    )
                  ]
                )
                (command.If
                  arms: [
                    (if_arm
                      cond: 
                        (condition.Shell
                          commands: [
                            (C {<test>} {(DQ ($ Id.VSub_DollarName '$value'))} 
                              {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {<unset>}
                            )
                          ]
                        )
                      action: [
                        (command.AndOr
                          ops: [Id.Op_DAmp]
                          children: [
                            (C {<eval>} 
                              {
                                (DQ ($ Id.VSub_DollarName '$var') <'='> 
                                  (word_part.EscapedLiteral
                                    token: <Id.Lit_EscapedChar '\\$'>
                                  ) <value>
                                )
                              }
                            )
                            (C {<export>} {($ Id.VSub_DollarName '$var')})
                          ]
                        )
                      ]
                      spids: [416 430]
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: setup_env
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:worktreenv)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_Number '$1')}
                      spids: [463]
                    )
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:gitdirenv)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_Number '$2')}
                      spids: [466]
                    )
                  ]
                )
                (C {<sane_unset>} {<GIT_DIR>} {<GIT_WORK_TREE>})
                (C {<maybe_set>} {<GIT_DIR>} {(DQ ($ Id.VSub_DollarName '$gitdirenv'))})
                (C {<maybe_set>} {<GIT_WORK_TREE>} {(DQ ($ Id.VSub_DollarName '$worktreeenv'))})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: expect
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(DQ ($ Id.VSub_Number '$1') <'/expected'>)}
                )
                (redir
                  op: <Id.Redir_DLessDash '<<-'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {<EOF>}
                      here_end_span_id: 538
                      stdin_parts: [
                        <'setup: git_dir: '>
                        ($ Id.VSub_Number '$2')
                        <'\n'>
                        <'setup: git_common_dir: '>
                        ($ Id.VSub_Number '$2')
                        <'\n'>
                        <'setup: worktree: '>
                        ($ Id.VSub_Number '$3')
                        <'\n'>
                        <'setup: cwd: '>
                        ($ Id.VSub_Number '$4')
                        <'\n'>
                        <'setup: prefix: '>
                        ($ Id.VSub_Number '$5')
                        <'\n'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: try_case
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:name)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_Number '$1')}
                      spids: [550]
                    )
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:worktreeenv)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_Number '$2')}
                      spids: [553]
                    )
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:gitdirenv)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_Number '$3')}
                      spids: [556]
                    )
                  ]
                )
                (C {<setup_env>} {(DQ ($ Id.VSub_DollarName '$worktreeenv'))} 
                  {(DQ ($ Id.VSub_DollarName '$gitdirenv'))}
                )
                (C {<expect>} {(DQ ($ Id.VSub_DollarName '$name'))} {(DQ ($ Id.VSub_Number '$4'))} 
                  {(DQ ($ Id.VSub_Number '$5'))} {(DQ ($ Id.VSub_Number '$6'))} {(DQ ($ Id.VSub_Number '$7'))}
                )
                (C {<test_repo>} {(DQ ($ Id.VSub_DollarName '$name'))})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: run_wt_tests
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:N)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [617]
                )
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:gitfile)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$2')}
                  spids: [620]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:absgit)
                  op: assign_op.Equal
                  rhs: 
                    {(DQ ($ Id.VSub_DollarName '$here') <'/'> ($ Id.VSub_DollarName '$N') <'/.git'>)}
                  spids: [625]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:dotgit)
                  op: assign_op.Equal
                  rhs: {<.git>}
                  spids: [634]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:dotdotgit)
                  op: assign_op.Equal
                  rhs: {<'../../.git'>}
                  spids: [638]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [(C {<test>} {(DQ ($ Id.VSub_DollarName '$gitfile'))})]
                    )
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:absgit)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (DQ ($ Id.VSub_DollarName '$here') <'/'> ($ Id.VSub_DollarName '$N') 
                                <.git>
                              )
                            }
                          spids: [655]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:dotgit)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_DollarName '$absgit')}
                          spids: [664]
                        )
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:dotdotgit)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_DollarName '$absgit')}
                          spids: [667]
                        )
                      ]
                    )
                  ]
                  spids: [643 652]
                )
              ]
            )
            (C {<test_expect_success>} 
              {
                (DQ <'#'> ($ Id.VSub_DollarName '$N') 
                  <': explicit GIT_WORK_TREE and GIT_DIR at toplevel'>
                )
              } 
              {
                (SQ <'\n'> <'\t\ttry_case $N "$here/$N" .git \\\n'> 
                  <'\t\t\t"$dotgit" "$here/$N" "$here/$N" "(null)" &&\n'> <'\t\ttry_case $N . .git \\\n'> <'\t\t\t"$dotgit" "$here/$N" "$here/$N" "(null)" &&\n'> 
                  <'\t\ttry_case $N "$here/$N" "$here/$N/.git" \\\n'> <'\t\t\t"$absgit" "$here/$N" "$here/$N" "(null)" &&\n'> <'\t\ttry_case $N . "$here/$N/.git" \\\n'> 
                  <'\t\t\t"$absgit" "$here/$N" "$here/$N" "(null)"\n'> <'\t'>
                )
              }
            )
            (C {<test_expect_success>} 
              {
                (DQ <'#'> ($ Id.VSub_DollarName '$N') 
                  <': explicit GIT_WORK_TREE and GIT_DIR in subdir'>
                )
              } 
              {
                (SQ <'\n'> <'\t\ttry_case $N/sub/sub "$here/$N" ../../.git \\\n'> 
                  <'\t\t\t"$absgit" "$here/$N" "$here/$N" sub/sub/ &&\n'> <'\t\ttry_case $N/sub/sub ../.. ../../.git \\\n'> 
                  <'\t\t\t"$absgit" "$here/$N" "$here/$N" sub/sub/ &&\n'> <'\t\ttry_case $N/sub/sub "$here/$N" "$here/$N/.git" \\\n'> 
                  <'\t\t\t"$absgit" "$here/$N" "$here/$N" sub/sub/ &&\n'> <'\t\ttry_case $N/sub/sub ../.. "$here/$N/.git" \\\n'> 
                  <'\t\t\t"$absgit" "$here/$N" "$here/$N" sub/sub/\n'> <'\t'>
                )
              }
            )
            (C {<test_expect_success>} 
              {
                (DQ <'#'> ($ Id.VSub_DollarName '$N') 
                  <': explicit GIT_WORK_TREE from parent of worktree'>
                )
              } 
              {
                (SQ <'\n'> <'\t\ttry_case $N "$here/$N/wt" .git \\\n'> 
                  <'\t\t\t"$dotgit" "$here/$N/wt" "$here/$N" "(null)" &&\n'> <'\t\ttry_case $N wt .git \\\n'> <'\t\t\t"$dotgit" "$here/$N/wt" "$here/$N" "(null)" &&\n'> 
                  <'\t\ttry_case $N wt "$here/$N/.git" \\\n'> <'\t\t\t"$absgit" "$here/$N/wt" "$here/$N" "(null)" &&\n'> 
                  <'\t\ttry_case $N "$here/$N/wt" "$here/$N/.git" \\\n'> <'\t\t\t"$absgit" "$here/$N/wt" "$here/$N" "(null)"\n'> <'\t'>
                )
              }
            )
            (C {<test_expect_success>} 
              {
                (DQ <'#'> ($ Id.VSub_DollarName '$N') 
                  <': explicit GIT_WORK_TREE from nephew of worktree'>
                )
              } 
              {
                (SQ <'\n'> <'\t\ttry_case $N/sub/sub "$here/$N/wt" ../../.git \\\n'> 
                  <'\t\t\t"$dotdotgit" "$here/$N/wt" "$here/$N/sub/sub" "(null)" &&\n'> <'\t\ttry_case $N/sub/sub ../../wt ../../.git \\\n'> 
                  <'\t\t\t"$dotdotgit" "$here/$N/wt" "$here/$N/sub/sub" "(null)" &&\n'> <'\t\ttry_case $N/sub/sub ../../wt "$here/$N/.git" \\\n'> 
                  <'\t\t\t"$absgit" "$here/$N/wt" "$here/$N/sub/sub" "(null)" &&\n'> <'\t\ttry_case $N/sub/sub "$here/$N/wt" "$here/$N/.git" \\\n'> 
                  <'\t\t\t"$absgit" "$here/$N/wt" "$here/$N/sub/sub" "(null)"\n'> <'\t'>
                )
              }
            )
            (C {<test_expect_success>} 
              {
                (DQ <'#'> ($ Id.VSub_DollarName '$N') 
                  <': chdir_to_toplevel uses worktree, not git dir'>
                )
              } 
              {
                (SQ <'\n'> <'\t\ttry_case $N "$here" .git \\\n'> 
                  <'\t\t\t"$absgit" "$here" "$here" $N/ &&\n'> <'\t\ttry_case $N .. .git \\\n'> <'\t\t\t"$absgit" "$here" "$here" $N/ &&\n'> 
                  <'\t\ttry_case $N .. "$here/$N/.git" \\\n'> <'\t\t\t"$absgit" "$here" "$here" $N/ &&\n'> <'\t\ttry_case $N "$here" "$here/$N/.git" \\\n'> 
                  <'\t\t\t"$absgit" "$here" "$here" $N/\n'> <'\t'>
                )
              }
            )
            (C {<test_expect_success>} 
              {
                (DQ <'#'> ($ Id.VSub_DollarName '$N') 
                  <': chdir_to_toplevel uses worktree (from subdir)'>
                )
              } 
              {
                (SQ <'\n'> <'\t\ttry_case $N/sub/sub "$here" ../../.git \\\n'> 
                  <'\t\t\t"$absgit" "$here" "$here" $N/sub/sub/ &&\n'> <'\t\ttry_case $N/sub/sub ../../.. ../../.git \\\n'> 
                  <'\t\t\t"$absgit" "$here" "$here" $N/sub/sub/ &&\n'> <'\t\ttry_case $N/sub/sub ../../../ "$here/$N/.git" \\\n'> 
                  <'\t\t\t"$absgit" "$here" "$here" $N/sub/sub/ &&\n'> <'\t\ttry_case $N/sub/sub "$here" "$here/$N/.git" \\\n'> 
                  <'\t\t\t"$absgit" "$here" "$here" $N/sub/sub/\n'> <'\t'>
                )
              }
            )
          ]
        )
    )
    (command.ShFunction
      name: try_repo
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:name)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_Number '$1')}
                      spids: [831]
                    )
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:worktreeenv)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_Number '$2')}
                      spids: [834]
                    )
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:gitdirenv)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_Number '$3')}
                      spids: [837]
                    )
                  ]
                )
                (C {<setup_repo>} {(DQ ($ Id.VSub_DollarName '$name'))} {(DQ ($ Id.VSub_Number '$4'))} 
                  {(DQ ($ Id.VSub_Number '$5'))} {(DQ ($ Id.VSub_Number '$6'))}
                )
                (C {<shift>} {<6>})
                (C {<try_case>} {(DQ ($ Id.VSub_DollarName '$name'))} 
                  {(DQ ($ Id.VSub_DollarName '$worktreeenv'))} {(DQ ($ Id.VSub_DollarName '$gitdirenv'))} {(DQ ($ Id.VSub_Number '$1'))} {(DQ ($ Id.VSub_Number '$2'))} 
                  {(DQ ($ Id.VSub_Number '$3'))} {(DQ ($ Id.VSub_Number '$4'))}
                )
                (C {<shift>} {<4>})
                (command.Case
                  to_match: {(DQ ($ Id.VSub_DollarName '$gitdirenv'))}
                  arms: [
                    (case_arm
                      pat_list: [
                        {<'/'> <Id.Lit_Star '*'>}
                        {<Id.Lit_QMark '?'> <Id.Lit_Colon ':'> <'/'> <Id.Lit_Star '*'>}
                        {<unset>}
                      ]
                      spids: [922 935 937 -1]
                    )
                    (case_arm
                      pat_list: [{<Id.Lit_Star '*'>}]
                      action: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:gitdirenv)
                              op: assign_op.Equal
                              rhs: {<'../'> ($ Id.VSub_DollarName '$gitdirenv')}
                              spids: [944]
                            )
                          ]
                        )
                      ]
                      spids: [940 941 948 -1]
                    )
                  ]
                )
                (C {<try_case>} {(DQ ($ Id.VSub_DollarName '$name') <'/sub'>)} 
                  {(DQ ($ Id.VSub_DollarName '$worktreeenv'))} {(DQ ($ Id.VSub_DollarName '$gitdirenv'))} {(DQ ($ Id.VSub_Number '$1'))} {(DQ ($ Id.VSub_Number '$2'))} 
                  {(DQ ($ Id.VSub_Number '$3'))} {(DQ ($ Id.VSub_Number '$4'))}
                )
              ]
            )
          ]
        )
    )
    (C {<test_expect_success>} {(SQ <'#0: nonbare repo, no explicit configuration'>)} 
      {
        (SQ <'\n'> <'\ttry_repo 0 unset unset unset "" unset \\\n'> 
          <'\t\t.git "$here/0" "$here/0" "(null)" \\\n'> <'\t\t.git "$here/0" "$here/0" sub/ 2>message &&\n'> <'\t! test -s message\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#1: GIT_WORK_TREE without explicit GIT_DIR is accepted'>)} 
      {
        (SQ <'\n'> <'\tmkdir -p wt &&\n'> <'\ttry_repo 1 "$here" unset unset "" unset \\\n'> 
          <'\t\t"$here/1/.git" "$here" "$here" 1/ \\\n'> <'\t\t"$here/1/.git" "$here" "$here" 1/sub/ 2>message &&\n'> <'\t! test -s message\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#2: worktree defaults to cwd with explicit GIT_DIR'>)} 
      {
        (SQ <'\n'> <'\ttry_repo 2 unset "$here/2/.git" unset "" unset \\\n'> 
          <'\t\t"$here/2/.git" "$here/2" "$here/2" "(null)" \\\n'> <'\t\t"$here/2/.git" "$here/2/sub" "$here/2/sub" "(null)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#2b: relative GIT_DIR'>)} 
      {
        (SQ <'\n'> <'\ttry_repo 2b unset ".git" unset "" unset \\\n'> 
          <'\t\t".git" "$here/2b" "$here/2b" "(null)" \\\n'> <'\t\t"../.git" "$here/2b/sub" "$here/2b/sub" "(null)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#3: setup'>)} 
      {(SQ <'\n'> <'\tsetup_repo 3 unset "" unset &&\n'> <'\tmkdir -p 3/sub/sub 3/wt/sub\n'>)}
    )
    (C {<run_wt_tests>} {<3>})
    (C {<test_expect_success>} {(SQ <'#4: core.worktree without GIT_DIR set is accepted'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 4 ../sub "" unset &&\n'> <'\tmkdir -p 4/sub sub &&\n'> 
          <'\ttry_case 4 unset unset \\\n'> <'\t\t.git "$here/4/sub" "$here/4" "(null)" \\\n'> 
          <'\t\t"$here/4/.git" "$here/4/sub" "$here/4/sub" "(null)" 2>message &&\n'> <'\t! test -s message\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#5: core.worktree + GIT_WORK_TREE is accepted'>)} 
      {
        (SQ <'\n'> <'\t# or: you cannot intimidate away the lack of GIT_DIR setting\n'> 
          <'\ttry_repo 5 "$here" unset "$here/5" "" unset \\\n'> <'\t\t"$here/5/.git" "$here" "$here" 5/ \\\n'> 
          <'\t\t"$here/5/.git" "$here" "$here" 5/sub/ 2>message &&\n'> <'\ttry_repo 5a .. unset "$here/5a" "" unset \\\n'> <'\t\t"$here/5a/.git" "$here" "$here" 5a/ \\\n'> 
          <'\t\t"$here/5a/.git" "$here/5a" "$here/5a" sub/ &&\n'> <'\t! test -s message\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#6: setting GIT_DIR brings core.worktree to life'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 6 "$here/6" "" unset &&\n'> <'\ttry_case 6 unset .git \\\n'> 
          <'\t\t.git "$here/6" "$here/6" "(null)" &&\n'> <'\ttry_case 6 unset "$here/6/.git" \\\n'> <'\t\t"$here/6/.git" "$here/6" "$here/6" "(null)" &&\n'> 
          <'\ttry_case 6/sub/sub unset ../../.git \\\n'> <'\t\t"$here/6/.git" "$here/6" "$here/6" sub/sub/ &&\n'> 
          <'\ttry_case 6/sub/sub unset "$here/6/.git" \\\n'> <'\t\t"$here/6/.git" "$here/6" "$here/6" sub/sub/\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#6b: GIT_DIR set, core.worktree relative'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 6b .. "" unset &&\n'> <'\ttry_case 6b unset .git \\\n'> 
          <'\t\t.git "$here/6b" "$here/6b" "(null)" &&\n'> <'\ttry_case 6b unset "$here/6b/.git" \\\n'> 
          <'\t\t"$here/6b/.git" "$here/6b" "$here/6b" "(null)" &&\n'> <'\ttry_case 6b/sub/sub unset ../../.git \\\n'> 
          <'\t\t"$here/6b/.git" "$here/6b" "$here/6b" sub/sub/ &&\n'> <'\ttry_case 6b/sub/sub unset "$here/6b/.git" \\\n'> 
          <'\t\t"$here/6b/.git" "$here/6b" "$here/6b" sub/sub/\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#6c: GIT_DIR set, core.worktree=../wt (absolute)'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 6c "$here/6c/wt" "" unset &&\n'> <'\tmkdir -p 6c/wt/sub &&\n'> <'\n'> 
          <'\ttry_case 6c unset .git \\\n'> <'\t\t.git "$here/6c/wt" "$here/6c" "(null)" &&\n'> <'\ttry_case 6c unset "$here/6c/.git" \\\n'> 
          <'\t\t"$here/6c/.git" "$here/6c/wt" "$here/6c" "(null)" &&\n'> <'\ttry_case 6c/sub/sub unset ../../.git \\\n'> 
          <'\t\t../../.git "$here/6c/wt" "$here/6c/sub/sub" "(null)" &&\n'> <'\ttry_case 6c/sub/sub unset "$here/6c/.git" \\\n'> 
          <'\t\t"$here/6c/.git" "$here/6c/wt" "$here/6c/sub/sub" "(null)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#6d: GIT_DIR set, core.worktree=../wt (relative)'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 6d "$here/6d/wt" "" unset &&\n'> <'\tmkdir -p 6d/wt/sub &&\n'> <'\n'> 
          <'\ttry_case 6d unset .git \\\n'> <'\t\t.git "$here/6d/wt" "$here/6d" "(null)" &&\n'> <'\ttry_case 6d unset "$here/6d/.git" \\\n'> 
          <'\t\t"$here/6d/.git" "$here/6d/wt" "$here/6d" "(null)" &&\n'> <'\ttry_case 6d/sub/sub unset ../../.git \\\n'> 
          <'\t\t../../.git "$here/6d/wt" "$here/6d/sub/sub" "(null)" &&\n'> <'\ttry_case 6d/sub/sub unset "$here/6d/.git" \\\n'> 
          <'\t\t"$here/6d/.git" "$here/6d/wt" "$here/6d/sub/sub" "(null)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#6e: GIT_DIR set, core.worktree=../.. (absolute)'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 6e "$here" "" unset &&\n'> <'\ttry_case 6e unset .git \\\n'> 
          <'\t\t"$here/6e/.git" "$here" "$here" 6e/ &&\n'> <'\ttry_case 6e unset "$here/6e/.git" \\\n'> <'\t\t"$here/6e/.git" "$here" "$here" 6e/ &&\n'> 
          <'\ttry_case 6e/sub/sub unset ../../.git \\\n'> <'\t\t"$here/6e/.git" "$here" "$here" 6e/sub/sub/ &&\n'> 
          <'\ttry_case 6e/sub/sub unset "$here/6e/.git" \\\n'> <'\t\t"$here/6e/.git" "$here" "$here" 6e/sub/sub/\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#6f: GIT_DIR set, core.worktree=../.. (relative)'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 6f ../../ "" unset &&\n'> <'\ttry_case 6f unset .git \\\n'> 
          <'\t\t"$here/6f/.git" "$here" "$here" 6f/ &&\n'> <'\ttry_case 6f unset "$here/6f/.git" \\\n'> <'\t\t"$here/6f/.git" "$here" "$here" 6f/ &&\n'> 
          <'\ttry_case 6f/sub/sub unset ../../.git \\\n'> <'\t\t"$here/6f/.git" "$here" "$here" 6f/sub/sub/ &&\n'> 
          <'\ttry_case 6f/sub/sub unset "$here/6f/.git" \\\n'> <'\t\t"$here/6f/.git" "$here" "$here" 6f/sub/sub/\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#7: setup'>)} 
      {(SQ <'\n'> <'\tsetup_repo 7 non-existent "" unset &&\n'> <'\tmkdir -p 7/sub/sub 7/wt/sub\n'>)}
    )
    (C {<run_wt_tests>} {<7>})
    (C {<test_expect_success>} {(SQ <'#8: gitfile, easy case'>)} 
      {
        (SQ <'\n'> <'\ttry_repo 8 unset unset unset gitfile unset \\\n'> 
          <'\t\t"$here/8.git" "$here/8" "$here/8" "(null)" \\\n'> <'\t\t"$here/8.git" "$here/8" "$here/8" sub/\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#9: GIT_WORK_TREE accepted with gitfile'>)} 
      {
        (SQ <'\n'> <'\tmkdir -p 9/wt &&\n'> <'\ttry_repo 9 wt unset unset gitfile unset \\\n'> 
          <'\t\t"$here/9.git" "$here/9/wt" "$here/9" "(null)" \\\n'> <'\t\t"$here/9.git" "$here/9/sub/wt" "$here/9/sub" "(null)" 2>message &&\n'> <'\t! test -s message\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#10: GIT_DIR can point to gitfile'>)} 
      {
        (SQ <'\n'> <'\ttry_repo 10 unset "$here/10/.git" unset gitfile unset \\\n'> 
          <'\t\t"$here/10.git" "$here/10" "$here/10" "(null)" \\\n'> <'\t\t"$here/10.git" "$here/10/sub" "$here/10/sub" "(null)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#10b: relative GIT_DIR can point to gitfile'>)} 
      {
        (SQ <'\n'> <'\ttry_repo 10b unset .git unset gitfile unset \\\n'> 
          <'\t\t"$here/10b.git" "$here/10b" "$here/10b" "(null)" \\\n'> <'\t\t"$here/10b.git" "$here/10b/sub" "$here/10b/sub" "(null)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#11: setup'>)} 
      {(SQ <'\n'> <'\tsetup_repo 11 unset gitfile unset &&\n'> <'\tmkdir -p 11/sub/sub 11/wt/sub\n'>)}
    )
    (C {<run_wt_tests>} {<11>} {<gitfile>})
    (C {<test_expect_success>} {(SQ <'#12: core.worktree with gitfile is accepted'>)} 
      {
        (SQ <'\n'> <'\ttry_repo 12 unset unset "$here/12" gitfile unset \\\n'> 
          <'\t\t"$here/12.git" "$here/12" "$here/12" "(null)" \\\n'> <'\t\t"$here/12.git" "$here/12" "$here/12" sub/ 2>message &&\n'> <'\t! test -s message\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#13: core.worktree+GIT_WORK_TREE accepted (with gitfile)'>)} 
      {
        (SQ <'\n'> <'\t# or: you cannot intimidate away the lack of GIT_DIR setting\n'> 
          <'\ttry_repo 13 non-existent-too unset non-existent gitfile unset \\\n'> <'\t\t"$here/13.git" "$here/13/non-existent-too" "$here/13" "(null)" \\\n'> 
          <
'\t\t"$here/13.git" "$here/13/sub/non-existent-too" "$here/13/sub" "(null)" 2>message &&\n'
          > <'\t! test -s message\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#14: core.worktree with GIT_DIR pointing to gitfile'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 14 "$here/14" gitfile unset &&\n'> <'\ttry_case 14 unset .git \\\n'> 
          <'\t\t"$here/14.git" "$here/14" "$here/14" "(null)" &&\n'> <'\ttry_case 14 unset "$here/14/.git" \\\n'> 
          <'\t\t"$here/14.git" "$here/14" "$here/14" "(null)" &&\n'> <'\ttry_case 14/sub/sub unset ../../.git \\\n'> 
          <'\t\t"$here/14.git" "$here/14" "$here/14" sub/sub/ &&\n'> <'\ttry_case 14/sub/sub unset "$here/14/.git" \\\n'> 
          <'\t\t"$here/14.git" "$here/14" "$here/14" sub/sub/ &&\n'> <'\n'> <'\tsetup_repo 14c "$here/14c/wt" gitfile unset &&\n'> <'\tmkdir -p 14c/wt/sub &&\n'> <'\n'> 
          <'\ttry_case 14c unset .git \\\n'> <'\t\t"$here/14c.git" "$here/14c/wt" "$here/14c" "(null)" &&\n'> 
          <'\ttry_case 14c unset "$here/14c/.git" \\\n'> <'\t\t"$here/14c.git" "$here/14c/wt" "$here/14c" "(null)" &&\n'> 
          <'\ttry_case 14c/sub/sub unset ../../.git \\\n'> <'\t\t"$here/14c.git" "$here/14c/wt" "$here/14c/sub/sub" "(null)" &&\n'> 
          <'\ttry_case 14c/sub/sub unset "$here/14c/.git" \\\n'> <'\t\t"$here/14c.git" "$here/14c/wt" "$here/14c/sub/sub" "(null)" &&\n'> <'\n'> 
          <'\tsetup_repo 14d "$here/14d/wt" gitfile unset &&\n'> <'\tmkdir -p 14d/wt/sub &&\n'> <'\n'> <'\ttry_case 14d unset .git \\\n'> 
          <'\t\t"$here/14d.git" "$here/14d/wt" "$here/14d" "(null)" &&\n'> <'\ttry_case 14d unset "$here/14d/.git" \\\n'> 
          <'\t\t"$here/14d.git" "$here/14d/wt" "$here/14d" "(null)" &&\n'> <'\ttry_case 14d/sub/sub unset ../../.git \\\n'> 
          <'\t\t"$here/14d.git" "$here/14d/wt" "$here/14d/sub/sub" "(null)" &&\n'> <'\ttry_case 14d/sub/sub unset "$here/14d/.git" \\\n'> 
          <'\t\t"$here/14d.git" "$here/14d/wt" "$here/14d/sub/sub" "(null)" &&\n'> <'\n'> <'\tsetup_repo 14e "$here" gitfile unset &&\n'> <'\ttry_case 14e unset .git \\\n'> 
          <'\t\t"$here/14e.git" "$here" "$here" 14e/ &&\n'> <'\ttry_case 14e unset "$here/14e/.git" \\\n'> <'\t\t"$here/14e.git" "$here" "$here" 14e/ &&\n'> 
          <'\ttry_case 14e/sub/sub unset ../../.git \\\n'> <'\t\t"$here/14e.git" "$here" "$here" 14e/sub/sub/ &&\n'> 
          <'\ttry_case 14e/sub/sub unset "$here/14e/.git" \\\n'> <'\t\t"$here/14e.git" "$here" "$here" 14e/sub/sub/\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#14b: core.worktree is relative to actual git dir'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 14b ../14b gitfile unset &&\n'> <'\ttry_case 14b unset .git \\\n'> 
          <'\t\t"$here/14b.git" "$here/14b" "$here/14b" "(null)" &&\n'> <'\ttry_case 14b unset "$here/14b/.git" \\\n'> 
          <'\t\t"$here/14b.git" "$here/14b" "$here/14b" "(null)" &&\n'> <'\ttry_case 14b/sub/sub unset ../../.git \\\n'> 
          <'\t\t"$here/14b.git" "$here/14b" "$here/14b" sub/sub/ &&\n'> <'\ttry_case 14b/sub/sub unset "$here/14b/.git" \\\n'> 
          <'\t\t"$here/14b.git" "$here/14b" "$here/14b" sub/sub/ &&\n'> <'\n'> <'\tsetup_repo 14f ../ gitfile unset &&\n'> <'\ttry_case 14f unset .git \\\n'> 
          <'\t\t"$here/14f.git" "$here" "$here" 14f/ &&\n'> <'\ttry_case 14f unset "$here/14f/.git" \\\n'> <'\t\t"$here/14f.git" "$here" "$here" 14f/ &&\n'> 
          <'\ttry_case 14f/sub/sub unset ../../.git \\\n'> <'\t\t"$here/14f.git" "$here" "$here" 14f/sub/sub/ &&\n'> 
          <'\ttry_case 14f/sub/sub unset "$here/14f/.git" \\\n'> <'\t\t"$here/14f.git" "$here" "$here" 14f/sub/sub/\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#15: setup'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 15 non-existent gitfile unset &&\n'> 
          <'\tmkdir -p 15/sub/sub 15/wt/sub\n'>
        )
      }
    )
    (C {<run_wt_tests>} {<15>} {<gitfile>})
    (C {<test_expect_success>} {(SQ <'#16a: implicitly bare repo (cwd inside .git dir)'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 16a unset "" unset &&\n'> <'\tmkdir -p 16a/.git/wt/sub &&\n'> <'\n'> 
          <'\ttry_case 16a/.git unset unset \\\n'> <'\t\t. "(null)" "$here/16a/.git" "(null)" &&\n'> <'\ttry_case 16a/.git/wt unset unset \\\n'> 
          <'\t\t"$here/16a/.git" "(null)" "$here/16a/.git/wt" "(null)" &&\n'> <'\ttry_case 16a/.git/wt/sub unset unset \\\n'> 
          <'\t\t"$here/16a/.git" "(null)" "$here/16a/.git/wt/sub" "(null)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#16b: bare .git (cwd inside .git dir)'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 16b unset "" true &&\n'> <'\tmkdir -p 16b/.git/wt/sub &&\n'> <'\n'> 
          <'\ttry_case 16b/.git unset unset \\\n'> <'\t\t. "(null)" "$here/16b/.git" "(null)" &&\n'> <'\ttry_case 16b/.git/wt unset unset \\\n'> 
          <'\t\t"$here/16b/.git" "(null)" "$here/16b/.git/wt" "(null)" &&\n'> <'\ttry_case 16b/.git/wt/sub unset unset \\\n'> 
          <'\t\t"$here/16b/.git" "(null)" "$here/16b/.git/wt/sub" "(null)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#16c: bare .git has no worktree'>)} 
      {
        (SQ <'\n'> <'\ttry_repo 16c unset unset unset "" true \\\n'> 
          <'\t\t.git "(null)" "$here/16c" "(null)" \\\n'> <'\t\t"$here/16c/.git" "(null)" "$here/16c/sub" "(null)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#16d: bareness preserved across alias'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 16d unset "" unset &&\n'> <'\t(\n'> <'\t\tcd 16d/.git &&\n'> 
          <'\t\ttest_must_fail git status &&\n'> <'\t\tgit config alias.st status &&\n'> <'\t\ttest_must_fail git st\n'> <'\t)\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#16e: bareness preserved by --bare'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 16e unset "" unset &&\n'> <'\t(\n'> <'\t\tcd 16e/.git &&\n'> 
          <'\t\ttest_must_fail git status &&\n'> <'\t\ttest_must_fail git --bare status\n'> <'\t)\n'>
        )
      }
    )
    (C {<test_expect_success>} 
      {(SQ <'#17: GIT_WORK_TREE without explicit GIT_DIR is accepted (bare case)'>)} 
      {
        (SQ <'\n'> <'\t# Just like #16.\n'> <'\tsetup_repo 17a unset "" true &&\n'> 
          <'\tsetup_repo 17b unset "" true &&\n'> <'\tmkdir -p 17a/.git/wt/sub &&\n'> <'\tmkdir -p 17b/.git/wt/sub &&\n'> <'\n'> 
          <'\ttry_case 17a/.git "$here/17a" unset \\\n'> <'\t\t"$here/17a/.git" "$here/17a" "$here/17a" .git/ \\\n'> <'\t\t2>message &&\n'> 
          <'\ttry_case 17a/.git/wt "$here/17a" unset \\\n'> <'\t\t"$here/17a/.git" "$here/17a" "$here/17a" .git/wt/ &&\n'> 
          <'\ttry_case 17a/.git/wt/sub "$here/17a" unset \\\n'> <'\t\t"$here/17a/.git" "$here/17a" "$here/17a" .git/wt/sub/ &&\n'> <'\n'> 
          <'\ttry_case 17b/.git "$here/17b" unset \\\n'> <'\t\t"$here/17b/.git" "$here/17b" "$here/17b" .git/ &&\n'> 
          <'\ttry_case 17b/.git/wt "$here/17b" unset \\\n'> <'\t\t"$here/17b/.git" "$here/17b" "$here/17b" .git/wt/ &&\n'> 
          <'\ttry_case 17b/.git/wt/sub "$here/17b" unset \\\n'> <'\t\t"$here/17b/.git" "$here/17b" "$here/17b" .git/wt/sub/ &&\n'> <'\n'> 
          <'\ttry_repo 17c "$here/17c" unset unset "" true \\\n'> <'\t\t.git "$here/17c" "$here/17c" "(null)" \\\n'> 
          <'\t\t"$here/17c/.git" "$here/17c" "$here/17c" sub/ 2>message &&\n'> <'\t! test -s message\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#18: bare .git named by GIT_DIR has no worktree'>)} 
      {
        (SQ <'\n'> <'\ttry_repo 18 unset .git unset "" true \\\n'> 
          <'\t\t.git "(null)" "$here/18" "(null)" \\\n'> <'\t\t../.git "(null)" "$here/18/sub" "(null)" &&\n'> 
          <'\ttry_repo 18b unset "$here/18b/.git" unset "" true \\\n'> <'\t\t"$here/18b/.git" "(null)" "$here/18b" "(null)" \\\n'> 
          <'\t\t"$here/18b/.git" "(null)" "$here/18b/sub" "(null)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#19: setup'>)} 
      {(SQ <'\n'> <'\tsetup_repo 19 unset "" true &&\n'> <'\tmkdir -p 19/sub/sub 19/wt/sub\n'>)}
    )
    (C {<run_wt_tests>} {<19>})
    (C {<test_expect_success>} {(SQ <'#20a: core.worktree without GIT_DIR accepted (inside .git)'>)} 
      {
        (SQ <'\n'> <'\t# Unlike case #16a.\n'> <'\tsetup_repo 20a "$here/20a" "" unset &&\n'> 
          <'\tmkdir -p 20a/.git/wt/sub &&\n'> <'\ttry_case 20a/.git unset unset \\\n'> 
          <'\t\t"$here/20a/.git" "$here/20a" "$here/20a" .git/ 2>message &&\n'> <'\ttry_case 20a/.git/wt unset unset \\\n'> 
          <'\t\t"$here/20a/.git" "$here/20a" "$here/20a" .git/wt/ &&\n'> <'\ttry_case 20a/.git/wt/sub unset unset \\\n'> 
          <'\t\t"$here/20a/.git" "$here/20a" "$here/20a" .git/wt/sub/ &&\n'> <'\t! test -s message\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#20b/c: core.worktree and core.bare conflict'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 20b non-existent "" true &&\n'> <'\tmkdir -p 20b/.git/wt/sub &&\n'> 
          <'\t(\n'> <'\t\tcd 20b/.git &&\n'> <'\t\ttest_must_fail git status >/dev/null\n'> <'\t) 2>message &&\n'> 
          <'\tgrep "core.bare and core.worktree" message\n'>
        )
      }
    )
    (C {<test_expect_success>} 
      {(SQ <'#20d: core.worktree and core.bare OK when working tree not needed'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 20d non-existent "" true &&\n'> <'\tmkdir -p 20d/.git/wt/sub &&\n'> 
          <'\t(\n'> <'\t\tcd 20d/.git &&\n'> <'\t\tgit config foo.bar value\n'> <'\t)\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#21: setup, core.worktree warns before overriding core.bare'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 21 non-existent "" unset &&\n'> <'\tmkdir -p 21/.git/wt/sub &&\n'> 
          <'\t(\n'> <'\t\tcd 21/.git &&\n'> <'\t\tGIT_WORK_TREE="$here/21" &&\n'> <'\t\texport GIT_WORK_TREE &&\n'> 
          <'\t\tgit status >/dev/null\n'> <'\t) 2>message &&\n'> <'\t! test -s message\n'> <'\n'>
        )
      }
    )
    (C {<run_wt_tests>} {<21>})
    (C {<test_expect_success>} {(SQ <'#22a: core.worktree = GIT_DIR = .git dir'>)} 
      {
        (SQ <'\n'> <'\t# like case #6.\n'> <'\n'> <'\tsetup_repo 22a "$here/22a/.git" "" unset &&\n'> 
          <'\tsetup_repo 22ab . "" unset &&\n'> <'\tmkdir -p 22a/.git/sub 22a/sub &&\n'> <'\tmkdir -p 22ab/.git/sub 22ab/sub &&\n'> 
          <'\ttry_case 22a/.git unset . \\\n'> <'\t\t. "$here/22a/.git" "$here/22a/.git" "(null)" &&\n'> 
          <'\ttry_case 22a/.git unset "$here/22a/.git" \\\n'> <'\t\t"$here/22a/.git" "$here/22a/.git" "$here/22a/.git" "(null)" &&\n'> 
          <'\ttry_case 22a/.git/sub unset .. \\\n'> <'\t\t"$here/22a/.git" "$here/22a/.git" "$here/22a/.git" sub/ &&\n'> 
          <'\ttry_case 22a/.git/sub unset "$here/22a/.git" \\\n'> <'\t\t"$here/22a/.git" "$here/22a/.git" "$here/22a/.git" sub/ &&\n'> <'\n'> 
          <'\ttry_case 22ab/.git unset . \\\n'> <'\t\t. "$here/22ab/.git" "$here/22ab/.git" "(null)" &&\n'> 
          <'\ttry_case 22ab/.git unset "$here/22ab/.git" \\\n'> <'\t\t"$here/22ab/.git" "$here/22ab/.git" "$here/22ab/.git" "(null)" &&\n'> 
          <'\ttry_case 22ab/.git/sub unset .. \\\n'> <'\t\t"$here/22ab/.git" "$here/22ab/.git" "$here/22ab/.git" sub/ &&\n'> 
          <'\ttry_case 22ab/.git unset "$here/22ab/.git" \\\n'> <'\t\t"$here/22ab/.git" "$here/22ab/.git" "$here/22ab/.git" "(null)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#22b: core.worktree child of .git, GIT_DIR=.git'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 22b "$here/22b/.git/wt" "" unset &&\n'> 
          <'\tsetup_repo 22bb wt "" unset &&\n'> <'\tmkdir -p 22b/.git/sub 22b/sub 22b/.git/wt/sub 22b/wt/sub &&\n'> 
          <'\tmkdir -p 22bb/.git/sub 22bb/sub 22bb/.git/wt 22bb/wt &&\n'> <'\n'> <'\ttry_case 22b/.git unset . \\\n'> 
          <'\t\t. "$here/22b/.git/wt" "$here/22b/.git" "(null)" &&\n'> <'\ttry_case 22b/.git unset "$here/22b/.git" \\\n'> 
          <'\t\t"$here/22b/.git" "$here/22b/.git/wt" "$here/22b/.git" "(null)" &&\n'> <'\ttry_case 22b/.git/sub unset .. \\\n'> 
          <'\t\t.. "$here/22b/.git/wt" "$here/22b/.git/sub" "(null)" &&\n'> <'\ttry_case 22b/.git/sub unset "$here/22b/.git" \\\n'> 
          <'\t\t"$here/22b/.git" "$here/22b/.git/wt" "$here/22b/.git/sub" "(null)" &&\n'> <'\n'> <'\ttry_case 22bb/.git unset . \\\n'> 
          <'\t\t. "$here/22bb/.git/wt" "$here/22bb/.git" "(null)" &&\n'> <'\ttry_case 22bb/.git unset "$here/22bb/.git" \\\n'> 
          <'\t\t"$here/22bb/.git" "$here/22bb/.git/wt" "$here/22bb/.git" "(null)" &&\n'> <'\ttry_case 22bb/.git/sub unset .. \\\n'> 
          <'\t\t.. "$here/22bb/.git/wt" "$here/22bb/.git/sub" "(null)" &&\n'> <'\ttry_case 22bb/.git/sub unset "$here/22bb/.git" \\\n'> 
          <'\t\t"$here/22bb/.git" "$here/22bb/.git/wt" "$here/22bb/.git/sub" "(null)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#22c: core.worktree = .git/.., GIT_DIR=.git'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 22c "$here/22c" "" unset &&\n'> 
          <'\tsetup_repo 22cb .. "" unset &&\n'> <'\tmkdir -p 22c/.git/sub 22c/sub &&\n'> <'\tmkdir -p 22cb/.git/sub 22cb/sub &&\n'> <'\n'> 
          <'\ttry_case 22c/.git unset . \\\n'> <'\t\t"$here/22c/.git" "$here/22c" "$here/22c" .git/ &&\n'> 
          <'\ttry_case 22c/.git unset "$here/22c/.git" \\\n'> <'\t\t"$here/22c/.git" "$here/22c" "$here/22c" .git/ &&\n'> <'\ttry_case 22c/.git/sub unset .. \\\n'> 
          <'\t\t"$here/22c/.git" "$here/22c" "$here/22c" .git/sub/ &&\n'> <'\ttry_case 22c/.git/sub unset "$here/22c/.git" \\\n'> 
          <'\t\t"$here/22c/.git" "$here/22c" "$here/22c" .git/sub/ &&\n'> <'\n'> <'\ttry_case 22cb/.git unset . \\\n'> 
          <'\t\t"$here/22cb/.git" "$here/22cb" "$here/22cb" .git/ &&\n'> <'\ttry_case 22cb/.git unset "$here/22cb/.git" \\\n'> 
          <'\t\t"$here/22cb/.git" "$here/22cb" "$here/22cb" .git/ &&\n'> <'\ttry_case 22cb/.git/sub unset .. \\\n'> 
          <'\t\t"$here/22cb/.git" "$here/22cb" "$here/22cb" .git/sub/ &&\n'> <'\ttry_case 22cb/.git/sub unset "$here/22cb/.git" \\\n'> 
          <'\t\t"$here/22cb/.git" "$here/22cb" "$here/22cb" .git/sub/\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#22.2: core.worktree and core.bare conflict'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 22 "$here/22" "" true &&\n'> <'\t(\n'> <'\t\tcd 22/.git &&\n'> 
          <'\t\tGIT_DIR=. &&\n'> <'\t\texport GIT_DIR &&\n'> <'\t\ttest_must_fail git status 2>result\n'> <'\t) &&\n'> <'\t(\n'> 
          <'\t\tcd 22 &&\n'> <'\t\tGIT_DIR=.git &&\n'> <'\t\texport GIT_DIR &&\n'> <'\t\ttest_must_fail git status 2>result\n'> 
          <'\t) &&\n'> <'\tgrep "core.bare and core.worktree" 22/.git/result &&\n'> 
          <'\tgrep "core.bare and core.worktree" 22/result\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#23: setup'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 23 non-existent "" true &&\n'> <'\tmkdir -p 23/sub/sub 23/wt/sub\n'>)
      }
    )
    (C {<run_wt_tests>} {<23>})
    (C {<test_expect_success>} {(SQ <'#24: bare repo has no worktree (gitfile case)'>)} 
      {
        (SQ <'\n'> <'\ttry_repo 24 unset unset unset gitfile true \\\n'> 
          <'\t\t"$here/24.git" "(null)" "$here/24" "(null)" \\\n'> <'\t\t"$here/24.git" "(null)" "$here/24/sub" "(null)"\n'>
        )
      }
    )
    (C {<test_expect_success>} 
      {(SQ <'#25: GIT_WORK_TREE accepted if GIT_DIR unset (bare gitfile case)'>)} 
      {
        (SQ <'\n'> <'\ttry_repo 25 "$here/25" unset unset gitfile true \\\n'> 
          <'\t\t"$here/25.git" "$here/25" "$here/25" "(null)"  \\\n'> <'\t\t"$here/25.git" "$here/25" "$here/25" "sub/" 2>message &&\n'> <'\t! test -s message\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#26: bare repo has no worktree (GIT_DIR -> gitfile case)'>)} 
      {
        (SQ <'\n'> <'\ttry_repo 26 unset "$here/26/.git" unset gitfile true \\\n'> 
          <'\t\t"$here/26.git" "(null)" "$here/26" "(null)" \\\n'> <'\t\t"$here/26.git" "(null)" "$here/26/sub" "(null)" &&\n'> 
          <'\ttry_repo 26b unset .git unset gitfile true \\\n'> <'\t\t"$here/26b.git" "(null)" "$here/26b" "(null)" \\\n'> 
          <'\t\t"$here/26b.git" "(null)" "$here/26b/sub" "(null)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#27: setup'>)} 
      {(SQ <'\n'> <'\tsetup_repo 27 unset gitfile true &&\n'> <'\tmkdir -p 27/sub/sub 27/wt/sub\n'>)}
    )
    (C {<run_wt_tests>} {<27>} {<gitfile>})
    (C {<test_expect_success>} {(SQ <'#28: core.worktree and core.bare conflict (gitfile case)'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 28 "$here/28" gitfile true &&\n'> <'\t(\n'> <'\t\tcd 28 &&\n'> 
          <'\t\ttest_must_fail git status\n'> <'\t) 2>message &&\n'> <'\tgrep "core.bare and core.worktree" message\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#29: setup'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 29 non-existent gitfile true &&\n'> 
          <'\tmkdir -p 29/sub/sub 29/wt/sub &&\n'> <'\t(\n'> <'\t\tcd 29 &&\n'> <'\t\tGIT_WORK_TREE="$here/29" &&\n'> <'\t\texport GIT_WORK_TREE &&\n'> 
          <'\t\tgit status\n'> <'\t) 2>message &&\n'> <'\t! test -s message\n'>
        )
      }
    )
    (C {<run_wt_tests>} {<29>} {<gitfile>})
    (C {<test_expect_success>} {(SQ <'#30: core.worktree and core.bare conflict (gitfile version)'>)} 
      {
        (SQ <'\n'> <'\t# Just like case #22.\n'> <'\tsetup_repo 30 "$here/30" gitfile true &&\n'> 
          <'\t(\n'> <'\t\tcd 30 &&\n'> <'\t\ttest_must_fail env GIT_DIR=.git git status 2>result\n'> <'\t) &&\n'> 
          <'\tgrep "core.bare and core.worktree" 30/result\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'#31: setup'>)} 
      {
        (SQ <'\n'> <'\tsetup_repo 31 non-existent gitfile true &&\n'> 
          <'\tmkdir -p 31/sub/sub 31/wt/sub\n'>
        )
      }
    )
    (C {<run_wt_tests>} {<31>} {<gitfile>})
    (C {<test_done>})
  ]
)