(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:'Test shared repository initialization' span_id:15))}
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.Simple
      words: [{(setfacl)} {(-k)} {(.)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'2>' span_id:33)
          fd: 2
          arg_word: {(/dev/null)}
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'shared = 0400 (faulty permission u-w)' span_id:43))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:47) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished "rm -rf sub" &&\n' span_id:48) (Token id:Id.Lit_Chars val:'\tmkdir sub && (\n' span_id:49) 
          (Token id:Id.Lit_Chars val:'\t\tcd sub &&\n' span_id:50) (Token id:Id.Lit_Chars val:'\t\ttest_must_fail git init --shared=0400\n' span_id:51) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:52)
        )
      }
    )
    (command.ShFunction
      name: modebits
      body: 
        (command.BraceGroup
          children: [
            (command.Pipeline
              children: [
                (C {(ls)} {(-l)} {(DQ ($ Id.VSub_Number '$1'))})
                (C {(sed)} {(-e)} 
                  {(SQ (Token id:Id.Lit_Chars val:'s|^\\(..........\\).*|\\1|' span_id:79))}
                )
              ]
              negated: F
            )
          ]
        )
    )
    (command.ForEach
      iter_name: u
      iter_words: [{(002)} {(022)}]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (C {(test_expect_success)} {(POSIXPERM)} 
              {(DQ ('shared=1 does not clear bits preset by umask ') ($ Id.VSub_DollarName '$u'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:108) 
                  (Token id:Id.Lit_Chars val:'\t\tmkdir sub && (\n' span_id:109) (Token id:Id.Lit_Chars val:'\t\t\tcd sub &&\n' span_id:110) 
                  (Token id:Id.Lit_Chars val:'\t\t\tumask $u &&\n' span_id:111) (Token id:Id.Lit_Chars val:'\t\t\tgit init --shared=1 &&\n' span_id:112) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\ttest 1 = "$(git config core.sharedrepository)"\n'
                    span_id: 113
                  ) (Token id:Id.Lit_Chars val:'\t\t) &&\n' span_id:114) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tactual=$(ls -l sub/.git/HEAD) &&\n'
                    span_id: 115
                  ) (Token id:Id.Lit_Chars val:'\t\tcase "$actual" in\n' span_id:116) 
                  (Token id:Id.Lit_Chars val:'\t\t-rw-rw-r--*)\n' span_id:117) (Token id:Id.Lit_Chars val:'\t\t\t: happy\n' span_id:118) 
                  (Token id:Id.Lit_Chars val:'\t\t\t;;\n' span_id:119) (Token id:Id.Lit_Chars val:'\t\t*)\n' span_id:120) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\techo Oops, .git/HEAD is not 0664 but $actual\n'
                    span_id: 121
                  ) (Token id:Id.Lit_Chars val:'\t\t\tfalse\n' span_id:122) 
                  (Token id:Id.Lit_Chars val:'\t\t\t;;\n' span_id:123) (Token id:Id.Lit_Chars val:'\t\tesac\n' span_id:124) (Token id:Id.Lit_Chars val:'\t' span_id:125)
                )
              }
            )
            (C {(rm)} {(-rf)} {(sub)})
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'shared=all' span_id:141))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:145) 
          (Token id:Id.Lit_Chars val:'\tmkdir sub &&\n' span_id:146) (Token id:Id.Lit_Chars val:'\tcd sub &&\n' span_id:147) 
          (Token id:Id.Lit_Chars val:'\tgit init --shared=all &&\n' span_id:148) (Token id:Id.Lit_Chars val:'\ttest 2 = $(git config core.sharedrepository)\n' span_id:149)
        )
      }
    )
    (C {(test_expect_success)} {(POSIXPERM)} 
      {(SQ (Token id:Id.Lit_Chars val:'update-server-info honors core.sharedRepository' span_id:158))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:162) 
          (Token id:Id.Lit_Chars val:'\t: > a1 &&\n' span_id:163) (Token id:Id.Lit_Chars val:'\tgit add a1 &&\n' span_id:164) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:165) (Token id:Id.Lit_Chars val:'\tgit commit -m a1 &&\n' span_id:166) 
          (Token id:Id.Lit_Chars val:'\tumask 0277 &&\n' span_id:167) (Token id:Id.Lit_Chars val:'\tgit update-server-info &&\n' span_id:168) 
          (Token id:Id.Lit_Chars val:'\tactual="$(ls -l .git/info/refs)" &&\n' span_id:169) (Token id:Id.Lit_Chars val:'\tcase "$actual" in\n' span_id:170) 
          (Token id:Id.Lit_Chars val:'\t-r--r--r--*)\n' span_id:171) (Token id:Id.Lit_Chars val:'\t\t: happy\n' span_id:172) 
          (Token id:Id.Lit_Chars val:'\t\t;;\n' span_id:173) (Token id:Id.Lit_Chars val:'\t*)\n' span_id:174) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo Oops, .git/info/refs is not 0444\n'
            span_id: 175
          ) (Token id:Id.Lit_Chars val:'\t\tfalse\n' span_id:176) 
          (Token id:Id.Lit_Chars val:'\t\t;;\n' span_id:177) (Token id:Id.Lit_Chars val:'\tesac\n' span_id:178)
        )
      }
    )
    (command.ForEach
      iter_name: u
      iter_words: [
        {(0660) (Id.Lit_Other ':') (rw-rw----)}
        {(0640) (Id.Lit_Other ':') (rw-r-----)}
        {(0600) (Id.Lit_Other ':') (rw-------)}
        {(0666) (Id.Lit_Other ':') (rw-rw-rw-)}
        {(0664) (Id.Lit_Other ':') (rw-rw-r--)}
      ]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (command.AndOr
              ops: [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:x)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:220)
                            command_list: 
                              (command.CommandList
                                children: [
                                  (C {(expr)} {(DQ ($ Id.VSub_DollarName '$u'))} {(Id.Lit_Other ':')} 
                                    {
                                      (DQ ('.*:') (Id.Lit_Other '\\') ('([rw-]*') (Id.Lit_Other '\\') 
                                        (')')
                                      )
                                    }
                                  )
                                ]
                              )
                          )
                        }
                      spids: [219]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:y)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:242)
                            command_list: 
                              (command.CommandList
                                children: [
                                  (command.Pipeline
                                    children: [
                                      (C {(echo)} {(DQ ($ Id.VSub_DollarName '$x'))})
                                      (C {(sed)} {(-e)} {(DQ (s/w/-/g))})
                                    ]
                                    negated: F
                                  )
                                ]
                              )
                          )
                        }
                      spids: [241]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:u)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:264)
                            command_list: 
                              (command.CommandList
                                children: [
                                  (C {(expr)} {(DQ ($ Id.VSub_DollarName '$u'))} {(Id.Lit_Other ':')} 
                                    {(DQ (Id.Lit_Other '\\') ('([0-7]*') (Id.Lit_Other '\\') (')'))}
                                  )
                                ]
                              )
                          )
                        }
                      spids: [263]
                    )
                  ]
                )
                (C {(git)} {(config)} {(core.sharedrepository)} {(DQ ($ Id.VSub_DollarName '$u'))})
                (C {(umask)} {(0277)})
                (C {(test_expect_success)} {(POSIXPERM)} 
                  {
                    (DQ ('shared = ') ($ Id.VSub_DollarName '$u') (' (') ($ Id.VSub_DollarName '$y') 
                      (') ro')
                    )
                  } 
                  {
                    (SQ (Token id:Id.Lit_Chars val:'\n' span_id:318) 
                      (Token id:Id.Lit_Chars val:'\n' span_id:319) (Token id:Id.Lit_Chars val:'\t\trm -f .git/info/refs &&\n' span_id:320) 
                      (Token
                        id: Id.Lit_Chars
                        val: '\t\tgit update-server-info &&\n'
                        span_id: 321
                      ) (Token id:Id.Lit_Chars val:'\t\tactual="$(modebits .git/info/refs)" &&\n' span_id:322) 
                      (Token
                        id: Id.Lit_Chars
                        val: '\t\tverbose test "x$actual" = "x-$y"\n'
                        span_id: 323
                      ) (Token id:Id.Lit_Chars val:'\n' span_id:324) (Token id:Id.Lit_Chars val:'\t' span_id:325)
                    )
                  }
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {(umask)} {(077)})
                (C {(test_expect_success)} {(POSIXPERM)} 
                  {
                    (DQ ('shared = ') ($ Id.VSub_DollarName '$u') (' (') ($ Id.VSub_DollarName '$x') 
                      (') rw')
                    )
                  } 
                  {
                    (SQ (Token id:Id.Lit_Chars val:'\n' span_id:350) 
                      (Token id:Id.Lit_Chars val:'\n' span_id:351) (Token id:Id.Lit_Chars val:'\t\trm -f .git/info/refs &&\n' span_id:352) 
                      (Token
                        id: Id.Lit_Chars
                        val: '\t\tgit update-server-info &&\n'
                        span_id: 353
                      ) (Token id:Id.Lit_Chars val:'\t\tactual="$(modebits .git/info/refs)" &&\n' span_id:354) 
                      (Token
                        id: Id.Lit_Chars
                        val: '\t\tverbose test "x$actual" = "x-$x"\n'
                        span_id: 355
                      ) (Token id:Id.Lit_Chars val:'\n' span_id:356) (Token id:Id.Lit_Chars val:'\t' span_id:357)
                    )
                  }
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(POSIXPERM)} 
      {(SQ (Token id:Id.Lit_Chars val:'info/refs respects umask in unshared repo' span_id:369))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:373) 
          (Token id:Id.Lit_Chars val:'\trm -f .git/info/refs &&\n' span_id:374) (Token id:Id.Lit_Chars val:'\ttest_unconfig core.sharedrepository &&\n' span_id:375) 
          (Token id:Id.Lit_Chars val:'\tumask 002 &&\n' span_id:376) (Token id:Id.Lit_Chars val:'\tgit update-server-info &&\n' span_id:377) 
          (Token id:Id.Lit_Chars val:'\techo "-rw-rw-r--" >expect &&\n' span_id:378) (Token id:Id.Lit_Chars val:'\tmodebits .git/info/refs >actual &&\n' span_id:379) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:380)
        )
      }
    )
    (C {(test_expect_success)} {(POSIXPERM)} 
      {(SQ (Token id:Id.Lit_Chars val:'git reflog expire honors core.sharedRepository' span_id:389))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:393) 
          (Token id:Id.Lit_Chars val:'\tumask 077 &&\n' span_id:394) (Token id:Id.Lit_Chars val:'\tgit config core.sharedRepository group &&\n' span_id:395) 
          (Token id:Id.Lit_Chars val:'\tgit reflog expire --all &&\n' span_id:396) (Token id:Id.Lit_Chars val:'\tactual="$(ls -l .git/logs/refs/heads/master)" &&\n' span_id:397) 
          (Token id:Id.Lit_Chars val:'\tcase "$actual" in\n' span_id:398) (Token id:Id.Lit_Chars val:'\t-rw-rw-*)\n' span_id:399) 
          (Token id:Id.Lit_Chars val:'\t\t: happy\n' span_id:400) (Token id:Id.Lit_Chars val:'\t\t;;\n' span_id:401) (Token id:Id.Lit_Chars val:'\t*)\n' span_id:402) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo Ooops, .git/logs/refs/heads/master is not 0662 [$actual]\n'
            span_id: 403
          ) (Token id:Id.Lit_Chars val:'\t\tfalse\n' span_id:404) 
          (Token id:Id.Lit_Chars val:'\t\t;;\n' span_id:405) (Token id:Id.Lit_Chars val:'\tesac\n' span_id:406)
        )
      }
    )
    (C {(test_expect_success)} {(POSIXPERM)} 
      {(SQ (Token id:Id.Lit_Chars val:'forced modes' span_id:415))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:419) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p templates/hooks &&\n' span_id:420) (Token id:Id.Lit_Chars val:'\techo update-server-info >templates/hooks/post-update &&\n' span_id:421) 
          (Token
            id: Id.Lit_Chars
            val: '\tchmod +x templates/hooks/post-update &&\n'
            span_id: 422
          ) (Token id:Id.Lit_Chars val:'\techo : >random-file &&\n' span_id:423) 
          (Token id:Id.Lit_Chars val:'\tmkdir new &&\n' span_id:424) (Token id:Id.Lit_Chars val:'\t(\n' span_id:425) 
          (Token id:Id.Lit_Chars val:'\t\tcd new &&\n' span_id:426) (Token id:Id.Lit_Chars val:'\t\tumask 002 &&\n' span_id:427) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit init --shared=0660 --template=../templates &&\n'
            span_id: 428
          ) (Token id:Id.Lit_Chars val:'\t\t>frotz &&\n' span_id:429) 
          (Token id:Id.Lit_Chars val:'\t\tgit add frotz &&\n' span_id:430) (Token id:Id.Lit_Chars val:'\t\tgit commit -a -m initial &&\n' span_id:431) 
          (Token id:Id.Lit_Chars val:'\t\tgit repack\n' span_id:432) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:433) 
          (Token
            id: Id.Lit_Chars
            val: '\t# List repository files meant to be protected; note that\n'
            span_id: 434
          ) (Token id:Id.Lit_Chars val:'\t# COMMIT_EDITMSG does not matter---0mode is not about a\n' span_id:435) 
          (Token id:Id.Lit_Chars val:'\t# repository with a work tree.\n' span_id:436) 
          (Token
            id: Id.Lit_Chars
            val: '\tfind new/.git -type f -name COMMIT_EDITMSG -prune -o -print |\n'
            span_id: 437
          ) (Token id:Id.Lit_Chars val:'\txargs ls -ld >actual &&\n' span_id:438) 
          (Token id:Id.Lit_Chars val:'\n' span_id:439) (Token id:Id.Lit_Chars val:'\t# Everything must be unaccessible to others\n' span_id:440) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -z "$(sed -e "/^.......---/d" actual)" &&\n'
            span_id: 441
          ) (Token id:Id.Lit_Chars val:'\n' span_id:442) 
          (Token
            id: Id.Lit_Chars
            val: '\t# All directories must have either 2770 or 770\n'
            span_id: 443
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -z "$(sed -n -e "/^drwxrw[sx]---/d" -e "/^d/p" actual)" &&\n'
            span_id: 444
          ) (Token id:Id.Lit_Chars val:'\n' span_id:445) 
          (Token id:Id.Lit_Chars val:'\t# post-update hook must be 0770\n' span_id:446) (Token id:Id.Lit_Chars val:'\ttest -z "$(sed -n -e "/post-update/{\n' span_id:447) 
          (Token id:Id.Lit_Chars val:'\t\t/^-rwxrwx---/d\n' span_id:448) (Token id:Id.Lit_Chars val:'\t\tp\n' span_id:449) 
          (Token id:Id.Lit_Chars val:'\t}" actual)" &&\n' span_id:450) (Token id:Id.Lit_Chars val:'\n' span_id:451) 
          (Token
            id: Id.Lit_Chars
            val: '\t# All files inside objects must be accessible by us\n'
            span_id: 452
          ) (Token id:Id.Lit_Chars val:'\ttest -z "$(sed -n -e "/objects\\//{\n' span_id:453) 
          (Token id:Id.Lit_Chars val:'\t\t/^d/d\n' span_id:454) (Token id:Id.Lit_Chars val:'\t\t/^-r.-r.----/d\n' span_id:455) 
          (Token id:Id.Lit_Chars val:'\t\tp\n' span_id:456) (Token id:Id.Lit_Chars val:'\t}" actual)"\n' span_id:457)
        )
      }
    )
    (C {(test_expect_success)} {(POSIXPERM)} 
      {(SQ (Token id:Id.Lit_Chars val:'remote init does not use config from cwd' span_id:466))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:470) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config core.sharedrepository 0666 &&\n'
            span_id: 471
          ) (Token id:Id.Lit_Chars val:'\tumask 0022 &&\n' span_id:472) 
          (Token id:Id.Lit_Chars val:'\tgit init --bare child.git &&\n' span_id:473) (Token id:Id.Lit_Chars val:'\techo "-rw-r--r--" >expect &&\n' span_id:474) 
          (Token
            id: Id.Lit_Chars
            val: '\tmodebits child.git/config >actual &&\n'
            span_id: 475
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:476)
        )
      }
    )
    (C {(test_expect_success)} {(POSIXPERM)} 
      {(SQ (Token id:Id.Lit_Chars val:'re-init respects core.sharedrepository (local)' span_id:485))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:489) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config core.sharedrepository 0666 &&\n'
            span_id: 490
          ) (Token id:Id.Lit_Chars val:'\tumask 0022 &&\n' span_id:491) 
          (Token id:Id.Lit_Chars val:'\techo whatever >templates/foo &&\n' span_id:492) (Token id:Id.Lit_Chars val:'\tgit init --template=templates &&\n' span_id:493) 
          (Token id:Id.Lit_Chars val:'\techo "-rw-rw-rw-" >expect &&\n' span_id:494) (Token id:Id.Lit_Chars val:'\tmodebits .git/foo >actual &&\n' span_id:495) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:496)
        )
      }
    )
    (C {(test_expect_success)} {(POSIXPERM)} 
      {(SQ (Token id:Id.Lit_Chars val:'re-init respects core.sharedrepository (remote)' span_id:505))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:509) 
          (Token id:Id.Lit_Chars val:'\trm -rf child.git &&\n' span_id:510) (Token id:Id.Lit_Chars val:'\tumask 0022 &&\n' span_id:511) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit init --bare --shared=0666 child.git &&\n'
            span_id: 512
          ) (Token id:Id.Lit_Chars val:'\ttest_path_is_missing child.git/foo &&\n' span_id:513) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit init --bare --template=../templates child.git &&\n'
            span_id: 514
          ) (Token id:Id.Lit_Chars val:'\techo "-rw-rw-rw-" >expect &&\n' span_id:515) 
          (Token id:Id.Lit_Chars val:'\tmodebits child.git/foo >actual &&\n' span_id:516) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:517)
        )
      }
    )
    (C {(test_expect_success)} {(POSIXPERM)} 
      {(SQ (Token id:Id.Lit_Chars val:'template can set core.sharedrepository' span_id:526))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:530) 
          (Token id:Id.Lit_Chars val:'\trm -rf child.git &&\n' span_id:531) (Token id:Id.Lit_Chars val:'\tumask 0022 &&\n' span_id:532) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config core.sharedrepository 0666 &&\n'
            span_id: 533
          ) (Token id:Id.Lit_Chars val:'\tcp .git/config templates/config &&\n' span_id:534) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit init --bare --template=../templates child.git &&\n'
            span_id: 535
          ) (Token id:Id.Lit_Chars val:'\techo "-rw-rw-rw-" >expect &&\n' span_id:536) 
          (Token id:Id.Lit_Chars val:'\tmodebits child.git/HEAD >actual &&\n' span_id:537) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:538)
        )
      }
    )
    (C {(test_done)})
  ]
)