(command.CommandList
  children: [
    (C {<Id.KW_Set set>} {<-o>} {<nounset>})
    (C {<Id.KW_Set set>} {<-o>} {<pipefail>})
    (C {<Id.KW_Set set>} {<-o>} {<errexit>})
    (C {<readonly>} 
      {<Id.Lit_VarLike 'OIL_VERSION='> 
        (command_sub
          left_token: <Id.Left_DollarParen '$('>
          command_list: 
            (command.CommandList
              children: [(C {<head>} {<-n>} {<1>} {<oil-version.txt>})]
            )
        )
      }
    )
    (C {<readonly>} 
      {<Id.Lit_VarLike 'OSH_RELEASE_BINARY='> <_tmp/oil-tar-test/oil-> 
        ($ Id.VSub_DollarName '$OIL_VERSION') </_bin/osh>
      }
    )
    (command.ShFunction
      name: log
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<echo>} {(DQ ($ Id.VSub_At '$@'))}]
              redirects: [(redir.Redir op:<Id.Redir_GreatAnd '1>&'> fd:1 arg_word:{<2>})]
            )
          ]
        )
    )
    (command.ShFunction
      name: _clean-tmp-dirs
      body: 
        (command.BraceGroup
          children: [
            (C {<rm>} {<-r>} {<-f>} 
              (word.BracedTree
                parts: [
                  <_tmp/>
                  (word_part.BracedTuple
                    words: [{<spec>} {<wild>} {<unit>} {<gold>} {<osh2oil>}]
                  )
                ]
              ) 
              (word.BracedTree
                parts: [
                  <_tmp/>
                  (word_part.BracedTuple
                    words: [{<osh-parser>} {<osh-runtime>} {<vm-baseline>} {<ovm-build>} {<oheap>}]
                  )
                ]
              ) {<_tmp/metrics>} {<_tmp/oil-tar-test>}
            )
          ]
        )
    )
    (command.ShFunction
      name: _clean
      body: 
        (command.BraceGroup
          children: [
            (C {<_clean-tmp-dirs>})
            (C {<rm>} {<-r>} {<-f>} {<_devbuild>})
            (C {<build/actions.sh>} {<clean-repo>})
          ]
        )
    )
    (command.ShFunction
      name: _dev-build
      body: (command.BraceGroup children:[(C {<build/dev.sh>} {<all>})])
    )
    (command.ShFunction
      name: _release-build
      body: 
        (command.BraceGroup
          children: [
            (C {<build/prepare.sh>} {<configure>})
            (C {<build/prepare.sh>} {<build-python>})
            (C {($ Id.VSub_Number '$0')} {<oil>})
            (C {<build/test.sh>} {<oil-tar>})
            (C {<ln>} {<-s>} {<-f>} {<--no-target-directory>} {<-v>} {<oil.ovm>} 
              {($ Id.VSub_DollarName '$OSH_RELEASE_BINARY')}
            )
          ]
        )
    )
    (command.ShFunction
      name: _test-release-build
      body: 
        (command.BraceGroup
          children: [
            (C {<test/alpine.sh>} {<copy-tar>} {(SQ )} {<oil>})
            (C {<test/alpine.sh>} {<test-tar>} {(SQ )} {<oil>})
            (C {<test/spec.sh>} {<link-busybox-ash>})
            (C {<test/spec.sh>} {<smoke>})
            (C {<test/osh2oil.sh>} {<run-for-release>})
            (C {<test/gold.sh>} {<run-for-release>})
            (command.Simple
              words: [{<test/spec.sh>} {<all>}]
              more_env: [
                (env_pair
                  name: OSH_OVM
                  val: {($ Id.VSub_DollarName '$OSH_RELEASE_BINARY')}
                  spids: [554]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: build-and-test
      body: 
        (command.BraceGroup
          children: [
            (C {<_clean>})
            (C {<_dev-build>})
            (C {<test/unit.sh>} {<run-for-release>})
            (C {<_release-build>})
            (C {<_test-release-build>})
          ]
        )
    )
    (command.ShFunction
      name: _install
      body: 
        (command.BraceGroup
          children: [
            (C {<test/spec.sh>} {<install-shells>})
            (C {<sudo>} {<apt>} {<install>} {<python-dev>})
          ]
        )
    )
    (command.ShFunction
      name: benchmark-build
      body: 
        (command.BraceGroup
          children: [(C {<_install>}) (C {<_clean>}) (C {<_dev-build>}) (C {<_release-build>})]
        )
    )
    (command.ShFunction
      name: benchmark-run
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<benchmarks/auto.sh>} {<all>}]
              more_env: [
                (env_pair
                  name: OSH_OVM
                  val: {($ Id.VSub_DollarName '$OSH_RELEASE_BINARY')}
                  spids: [666]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: benchmark-run-on-1-machine
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<benchmarks/oheap.sh>} {<measure>}]
              more_env: [
                (env_pair
                  name: OSH_OVM
                  val: {($ Id.VSub_DollarName '$OSH_RELEASE_BINARY')}
                  spids: [683]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: _compressed-tarball
      body: 
        (command.BraceGroup
          children: [
            (C {<local>} 
              {<Id.Lit_VarLike 'name='> 
                (braced_var_sub
                  token: <Id.VSub_Number 1>
                  suffix_op: (suffix_op.Unary op_id:Id.VTest_ColonHyphen arg_word:{<hello>})
                )
              }
            )
            (C {<local>} 
              {<Id.Lit_VarLike 'version='> 
                (braced_var_sub
                  token: <Id.VSub_Number 2>
                  suffix_op: (suffix_op.Unary op_id:Id.VTest_ColonHyphen arg_word:{<0.0.0>})
                )
              }
            )
            (C {<local>} {<Id.Lit_VarLike 'in='> <_release/> ($ Id.VSub_DollarName '$name') <.tar>})
            (C {<local>} 
              {<Id.Lit_VarLike 'out='> <_release/> ($ Id.VSub_DollarName '$name') <-> 
                ($ Id.VSub_DollarName '$version') <.tar.gz>
              }
            )
            (C {<build/actions.sh>} {<write-release-date>})
            (C {<make>} {($ Id.VSub_DollarName '$in')})
            (command.TimeBlock
              pipeline: 
                (command.Simple
                  words: [{<gzip>} {<-c>} {($ Id.VSub_DollarName '$in')}]
                  redirects: [
                    (redir.Redir
                      op: <Id.Redir_Great '>'>
                      fd: -1
                      arg_word: {($ Id.VSub_DollarName '$out')}
                    )
                  ]
                )
            )
            (C {<ls>} {<-l>} {($ Id.VSub_DollarName '$out')})
            (C {<local>} 
              {<Id.Lit_VarLike 'out2='> <_release/> ($ Id.VSub_DollarName '$name') <-> 
                ($ Id.VSub_DollarName '$version') <.tar.xz>
              }
            )
            (command.TimeBlock
              pipeline: 
                (command.Simple
                  words: [{<xz>} {<-c>} {($ Id.VSub_DollarName '$in')}]
                  redirects: [
                    (redir.Redir
                      op: <Id.Redir_Great '>'>
                      fd: -1
                      arg_word: {($ Id.VSub_DollarName '$out2')}
                    )
                  ]
                )
            )
            (C {<ls>} {<-l>} {($ Id.VSub_DollarName '$out2')})
          ]
        )
    )
    (command.ShFunction
      name: oil
      body: 
        (command.BraceGroup
          children: [(C {<_compressed-tarball>} {<oil>} {($ Id.VSub_DollarName '$OIL_VERSION')})]
        )
    )
    (command.ShFunction
      name: hello
      body: 
        (command.BraceGroup
          children: [
            (C {<_compressed-tarball>} {<hello>} 
              {
                (command_sub
                  left_token: <Id.Left_DollarParen '$('>
                  command_list: 
                    (command.CommandList
                      children: [(C {<head>} {<-n>} {<1>} {<build/testdata/hello-version.txt>})]
                    )
                )
              }
            )
          ]
        )
    )
    (command.ShFunction
      name: escape-segments
      body: 
        (command.BraceGroup
          children: [
            (C {<python>} {<-c>} 
              {
                (SQ <'\n'> <'import cgi, re, sys\n'> <'\n'> <'print re.sub(\n'> 
                  <'  r"\\x00(.*)\\x01", \n'> <'  lambda match: cgi.escape(match.group(1)),\n'> <'  sys.stdin.read())\n'>
                )
              }
            )
          ]
        )
    )
    (command.ShFunction
      name: _git-changelog-body
      body: 
        (command.BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'prev_branch='> ($ Id.VSub_Number '$1')})
            (C {<local>} {<Id.Lit_VarLike 'cur_branch='> ($ Id.VSub_Number '$2')})
            (C {<local>} 
              {<Id.Lit_VarLike 'format='> 
                (SQ <'<tr>\n'> <'    <td><a class="checksum"\n'> 
                  <'           href="https://github.com/oilshell/oil/commit/%H">%h</a>\n'> <'    </td>\n'> <'    <td class="date">%ad</td>\n'> <'    <td>%x00%an%x01</td>\n'> 
                  <'    <td class="subject">%x00%s%x01</td>\n'> <'  </tr>'>
                )
              }
            )
            (command.Pipeline
              children: [
                (C {<git>} {<log>} 
                  {($ Id.VSub_DollarName '$prev_branch') <..> ($ Id.VSub_DollarName '$cur_branch')} {<--reverse>} {<--pretty> <Id.Lit_Equals '='> (DQ <'format:'> ($ Id.VSub_DollarName '$format'))} 
                  {<--date> <Id.Lit_Equals '='> <short>}
                )
                (C {<escape-segments>})
              ]
              negated: F
            )
          ]
        )
    )
    (command.ShFunction
      name: _git-changelog-header
      body: 
        (command.BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'prev_branch='> ($ Id.VSub_Number '$1')})
            (C {<local>} {<Id.Lit_VarLike 'cur_branch='> ($ Id.VSub_Number '$2')})
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir.HereDoc
                  op: <Id.Redir_DLess '<<'>
                  fd: -1
                  here_begin: {<EOF>}
                  here_end_span_id: 1065
                  stdin_parts: [
                    <'<!DOCTYPE html>\n'>
                    <'<html>\n'>
                    <'  <head>\n'>
                    <'    <title>Commits Between '>
                    ($ Id.VSub_DollarName '$prev_branch')
                    <' and '>
                    ($ Id.VSub_DollarName '$cur_branch')
                    <'</title>\n'>
                    <'    <style>\n'>
                    <'      /* Make it centered and skinny for readability */\n'>
                    <'      body {\n'>
                    <'        margin: 0 auto;\n'>
                    <'        width: 60em;\n'>
                    <'      }\n'>
                    <'      table {\n'>
                    <'        width: 100%;\n'>
                    <'      }\n'>
                    <'      code {\n'>
                    <'        color: green;\n'>
                    <'      }\n'>
                    <'      .checksum {\n'>
                    <'        font-family: monospace;\n'>
                    <'      }\n'>
                    <'      .date {\n'>
                    <'        /*font-family: monospace;*/\n'>
                    <'      }\n'>
                    <'      .subject {\n'>
                    <'        font-family: monospace;\n'>
                    <'      }\n'>
                    <'\n'>
                    <'      /* Copied from oilshell.org bundle.css */\n'>
                    <'      .date {\n'>
                    <'        font-size: medium;\n'>
                    <'        color: #555;\n'>
                    <'        padding-left: 1em;\n'>
                    <'      }\n'>
                    <'    </style>\n'>
                    <'  </head>\n'>
                    <'  <body>\n'>
                    <'    <h3>Commits Between Branches <code>'>
                    ($ Id.VSub_DollarName '$prev_branch')
                    <'</code> and\n'>
                    <'       <code>'>
                    ($ Id.VSub_DollarName '$cur_branch')
                    <'</code></h3>\n'>
                    <'    <table>\n'>
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: _git-changelog
      body: 
        (command.BraceGroup
          children: [
            (C {<_git-changelog-header>} {(DQ ($ Id.VSub_At '$@'))})
            (C {<_git-changelog-body>} {(DQ ($ Id.VSub_At '$@'))})
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir.HereDoc
                  op: <Id.Redir_DLess '<<'>
                  fd: -1
                  here_begin: {<EOF>}
                  here_end_span_id: 1121
                  stdin_parts: [<'  </table>\n'>]
                )
              ]
            )
            (C {<_html-footer>})
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.1
      body: 
        (command.BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'version='> (SQ <0.1.0>)})
            (command.Simple
              words: [{<_git-changelog>} {<release/0.0.0>} {<release/0.1.0>}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: 
                    {<../oilshell.org__deploy/release/> ($ Id.VSub_DollarName '$version') 
                      </changelog.html>
                    }
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.2.alpha1
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<_git-changelog>} {<release/0.1.0>} {<release/0.2.alpha1>}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {<_release/VERSION/changelog.html>}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.2.0
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<_git-changelog>} {<release/0.1.0>} {<release/0.2.0>}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {<_release/VERSION/changelog.html>}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.3.alpha1
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<_git-changelog>} {<release/0.2.0>} {<release/0.3.alpha1>}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {<_release/VERSION/changelog.html>}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.3.0
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<_git-changelog>} {<release/0.2.0>} {<release/0.3.0>}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {<_release/VERSION/changelog.html>}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.4.0
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<_git-changelog>} {<release/0.3.0>} {<release/0.4.0>}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {<_release/VERSION/changelog.html>}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.5.alpha1
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<_git-changelog>} {<release/0.4.0>} {<release/0.5.alpha1>}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {<_release/VERSION/changelog.html>}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.5.alpha2
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<_git-changelog>} {<release/0.5.alpha1>} {<release/0.5.alpha2>}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {<_release/VERSION/changelog.html>}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.5.alpha3
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<_git-changelog>} {<release/0.5.alpha2>} {<release/0.5.alpha3>}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {<_release/VERSION/changelog.html>}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: html-redirect
      body: 
        (command.BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'url='> ($ Id.VSub_Number '$1')})
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir.HereDoc
                  op: <Id.Redir_DLess '<<'>
                  fd: -1
                  here_begin: {<EOF>}
                  here_end_span_id: 1386
                  stdin_parts: [
                    <'<!DOCTYPE html>\n'>
                    <'<html>\n'>
                    <'  <head>\n'>
                    <'    <meta http-equiv='>
                    <Id.Right_DoubleQuote '"'>
                    <refresh>
                    <Id.Right_DoubleQuote '"'>
                    <' content='>
                    <Id.Right_DoubleQuote '"'>
                    <'0; url='>
                    ($ Id.VSub_DollarName '$url')
                    <Id.Right_DoubleQuote '"'>
                    <' />\n'>
                    <'  </head>\n'>
                    <'  <body>\n'>
                    <'    <p>Redirect to<a href='>
                    <Id.Right_DoubleQuote '"'>
                    ($ Id.VSub_DollarName '$url')
                    <Id.Right_DoubleQuote '"'>
                    <'>'>
                    ($ Id.VSub_DollarName '$url')
                    <'</a></p>\n'>
                    <'  </body>\n'>
                    <'</html>  \n'>
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: no-announcement
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir.HereDoc
                  op: <Id.Redir_DLess '<<'>
                  fd: -1
                  here_begin: {<EOF>}
                  here_end_span_id: 1411
                  stdin_parts: [
                    <'<!DOCTYPE html>\n'>
                    <'<html>\n'>
                    <'  <head>\n'>
                    <'  </head>\n'>
                    <'  <body>\n'>
                    <'    <p>No announcement for this release.</p>\n'>
                    <'  </body>\n'>
                    <'</html>  \n'>
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: write-no-announcement
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<no-announcement>}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {<_release/VERSION/announcement.html>}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: announcement-0.0
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<html-redirect>} {(SQ </blog/2017/07/23.html>)}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {<../oilshell.org__deploy/release/0.0.0/announcement.html>}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: announcement-0.1
      body: 
        (command.BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'version='> (SQ <0.1.0>)})
            (command.Simple
              words: [{<html-redirect>} {(SQ </blog/2017/09/09.html>)}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: 
                    {<../oilshell.org__deploy/release/> ($ Id.VSub_DollarName '$version') 
                      </announcement.html>
                    }
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: announcement-0.2
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<html-redirect>} {(SQ </blog/2017/11/10.html>)}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {<_release/VERSION/announcement.html>}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: announcement-0.3
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<html-redirect>} {(SQ </blog/2017/12/22.html>)}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {<_release/VERSION/announcement.html>}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: announcement-0.4
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<html-redirect>} {(SQ </blog/2018/02/03.html>)}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {<_release/VERSION/announcement.html>}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: announcement-0.5.alpha3
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<html-redirect>} {(SQ </blog/2018/04/30.html>)}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {<_release/VERSION/announcement.html>}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: _link
      body: 
        (command.BraceGroup
          children: [
            (C {<ln>} {<-s>} {<-f>} {<-v>} {<--no-target-directory>} {(DQ ($ Id.VSub_At '$@'))})
          ]
        )
    )
    (command.ShFunction
      name: compress-txt
      body: 
        (command.BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'name='> ($ Id.VSub_Number '$1')})
            (C {<log>} {(DQ <'--- test/'> ($ Id.VSub_DollarName '$name'))})
            (C {<local>} 
              {<Id.Lit_VarLike 'out='> 
                (DQ ($ Id.VSub_DollarName '$root') </test/> ($ Id.VSub_DollarName '$name') <.wwz>)
              }
            )
            (C {<pushd>} {<_tmp/> ($ Id.VSub_DollarName '$name')})
            (command.TimeBlock
              pipeline: (C {<zip>} {<-r>} {<-q>} {($ Id.VSub_DollarName '$out')} {<.>})
            )
            (C {<popd>})
          ]
        )
    )
    (command.ShFunction
      name: compress
      body: 
        (command.BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'root='> ($ Id.VSub_DollarName '$PWD') </_release/VERSION/>})
            (C {<compress-txt>} {<osh2oil>})
            (C {<compress-txt>} {<gold>})
            (C {<log>} {(DQ <'--- test/unit'>)})
            (C {<local>} {<Id.Lit_VarLike 'out='> (DQ ($ Id.VSub_DollarName '$root') </test/unit.wwz>)})
            (C {<pushd>} {<_tmp/unit>})
            (command.TimeBlock
              pipeline: (C {<zip>} {<-r>} {<-q>} {($ Id.VSub_DollarName '$out')} {<.>})
            )
            (C {<popd>})
            (C {<log>} {(DQ <'--- test/spec'>)})
            (C {<local>} {<Id.Lit_VarLike 'out='> (DQ ($ Id.VSub_DollarName '$root') </test/spec.wwz>)})
            (C {<pushd>} {<_tmp/spec>})
            (command.TimeBlock
              pipeline: (C {<zip>} {<-r>} {<-q>} {($ Id.VSub_DollarName '$out')} {<.>})
            )
            (C {<popd>})
            (C {<log>} {(DQ <'--- test/wild'>)})
            (C {<local>} {<Id.Lit_VarLike 'out='> (DQ ($ Id.VSub_DollarName '$root') </test/wild.wwz>)})
            (C {<pushd>} {<_tmp/wild/www>})
            (command.TimeBlock
              pipeline: (C {<zip>} {<-r>} {<-q>} {($ Id.VSub_DollarName '$out')} {<.>})
            )
            (C {<popd>})
            (C {<log>} {(DQ <'--- metrics'>)})
            (C {<local>} {<Id.Lit_VarLike 'out='> (DQ ($ Id.VSub_DollarName '$root') </metrics.wwz>)})
            (C {<pushd>} {<_tmp/metrics>})
            (command.TimeBlock
              pipeline: (C {<zip>} {<-r>} {<-q>} {($ Id.VSub_DollarName '$out')} {<.>})
            )
            (C {<popd>})
            (C {<compress-benchmarks>})
            (C {<tree>} {<_release/VERSION>})
          ]
        )
    )
    (command.ShFunction
      name: compress-benchmarks
      body: 
        (command.BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'root='> ($ Id.VSub_DollarName '$PWD') </_release/VERSION/>})
            (C {<mkdir>} {<-p>} {($ Id.VSub_DollarName '$root')})
            (C {<log>} {(DQ <'--- benchmarks'>)})
            (C {<local>} {<Id.Lit_VarLike 'out='> (DQ ($ Id.VSub_DollarName '$root') </benchmarks.wwz>)})
            (C {<pushd>} {<_tmp>})
            (command.Pipeline
              children: [
                (C {<find>} 
                  (word.BracedTree
                    parts: [
                      <osh-parser/>
                      (word_part.BracedTuple
                        words: [{<stage1>} {<stage2>} {<index.html>}]
                      )
                    ]
                  ) 
                  (word.BracedTree
                    parts: [
                      <osh-runtime/>
                      (word_part.BracedTuple
                        words: [{<stage1>} {<stage2>} {<index.html>}]
                      )
                    ]
                  ) 
                  (word.BracedTree
                    parts: [
                      <vm-baseline/>
                      (word_part.BracedTuple
                        words: [{<stage1>} {<stage2>} {<index.html>}]
                      )
                    ]
                  ) 
                  (word.BracedTree
                    parts: [
                      <ovm-build/>
                      (word_part.BracedTuple
                        words: [{<stage1>} {<stage2>} {<index.html>}]
                      )
                    ]
                  ) 
                  (word.BracedTree
                    parts: [
                      <oheap/>
                      (word_part.BracedTuple
                        words: [{<stage1>} {<stage2>} {<index.html>}]
                      )
                    ]
                  ) {<-type>} {<f>}
                )
                (C {<xargs>} {<--verbose>} {<-->} {<zip>} {<-q>} {($ Id.VSub_DollarName '$out')})
              ]
              negated: F
            )
            (C {<popd>})
          ]
        )
    )
    (command.ShFunction
      name: line-counts
      body: 
        (command.BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'out='> ($ Id.VSub_Number '$1')})
            (C {<mkdir>} {<-p>} {($ Id.VSub_DollarName '$out')})
            (command.Simple
              words: [{<build/metrics.sh>} {<linecount-pydeps>}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {($ Id.VSub_DollarName '$out') </pydeps.txt>}
                )
              ]
            )
            (command.Simple
              words: [{<build/metrics.sh>} {<linecount-nativedeps>}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {($ Id.VSub_DollarName '$out') </nativedeps.txt>}
                )
              ]
            )
            (command.Simple
              words: [{<scripts/count.sh>} {<all>}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {($ Id.VSub_DollarName '$out') </src.txt>}
                )
              ]
            )
            (command.Simple
              words: [{<scripts/count.sh>} {<parser>}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {($ Id.VSub_DollarName '$out') </parser.txt>}
                )
              ]
            )
            (command.Simple
              words: [{<scripts/count.sh>} {<runtime>}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {($ Id.VSub_DollarName '$out') </runtime.txt>}
                )
              ]
            )
            (command.Simple
              words: [{<scripts/count.sh>} {<oil-osh-cloc>}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {($ Id.VSub_DollarName '$out') </oil-osh-cloc.txt>}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: metrics
      body: 
        (command.BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'out='> <_tmp/metrics>})
            (C {<mkdir>} {<-p>} {($ Id.VSub_DollarName '$out')})
            (command.Simple
              words: [{<build/metrics.sh>} {<pyc-bytes>}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {($ Id.VSub_DollarName '$out') </pyc-bytes.txt>}
                )
              ]
            )
            (C {<line-counts>} {($ Id.VSub_DollarName '$out') </line-counts>})
            (C {<tree>} {($ Id.VSub_DollarName '$out')})
          ]
        )
    )
    (command.ShFunction
      name: _copy-path
      body: 
        (command.BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'src='> ($ Id.VSub_Number '$1')} 
              {<Id.Lit_VarLike 'dest='> ($ Id.VSub_Number '$2')}
            )
            (C {<mkdir>} {<-p>} 
              {
                (command_sub
                  left_token: <Id.Left_DollarParen '$('>
                  command_list: 
                    (command.CommandList
                      children: [(C {<dirname>} {($ Id.VSub_DollarName '$dest')})]
                    )
                )
              }
            )
            (C {<cp>} {<-v>} {($ Id.VSub_DollarName '$src')} {($ Id.VSub_DollarName '$dest')})
          ]
        )
    )
    (command.ShFunction
      name: copy-web
      body: 
        (command.BraceGroup
          children: [
            (command.Pipeline
              children: [
                (C {<find>} {<web>} {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\('>)} 
                  {<-name>} {<_tmp>} {<-a>} {<-prune>} {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\)'>)} {<-o>} 
                  {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\('>)} {<-name>} {(SQ <'*.css'>)} {<-o>} {<-name>} {(SQ <'*.js'>)} 
                  {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\)'>)} {<-a>} {<-printf>} {(SQ <'%p _release/VERSION/%p\\n'>)}
                )
                (C {<xargs>} {<-n>} {<2>} {<-->} {($ Id.VSub_Number '$0')} {<_copy-path>})
              ]
              negated: F
            )
          ]
        )
    )
    (command.ShFunction
      name: build-tree
      body: 
        (command.BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'root='> <_release/VERSION>})
            (C {<mkdir>} {<-p>} 
              (word.BracedTree
                parts: [
                  ($ Id.VSub_DollarName '$root')
                  </>
                  (word_part.BracedTuple words:[{<doc>} {<test>}])
                ]
              )
            )
            (C {<cp>} {<-v>} {<_build/release-date.txt>} {<oil-version.txt>} 
              {($ Id.VSub_DollarName '$root')}
            )
            (C {<build/doc.sh>} {<osh-quick-ref>} {<_release/VERSION>})
            (C {<build/doc.sh>} {<install>})
            (C {<build/doc.sh>} {<release-index>} {($ Id.VSub_DollarName '$root') </index.html>})
            (C {<copy-web>})
            (C {<tree>} {($ Id.VSub_DollarName '$root')})
          ]
        )
    )
    (command.ShFunction
      name: deploy-doc
      body: 
        (command.BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'deploy_repo='> (SQ <../oilshell.org__deploy>)})
            (C {<local>} 
              {<Id.Lit_VarLike 'release_root_dir='> 
                (DQ ($ Id.VSub_DollarName '$deploy_repo') </release>)
              }
            )
            (C {<local>} 
              {<Id.Lit_VarLike 'release_dir='> 
                (DQ ($ Id.VSub_DollarName '$release_root_dir') </> 
                  ($ Id.VSub_DollarName '$OIL_VERSION')
                )
              }
            )
            (C {<cp>} {<-v>} {<-r>} {<--force>} {<--no-target-directory>} {<_release/VERSION/>} 
              {($ Id.VSub_DollarName '$release_dir') </>}
            )
            (C {<html-index>} {($ Id.VSub_DollarName '$release_root_dir')} {<_tmp/releases.html>})
            (C {<cp>} {<-v>} {<_tmp/releases.html>} {($ Id.VSub_DollarName '$deploy_repo')})
            (C {<tree>} {<-L>} {<3>} {($ Id.VSub_DollarName '$release_root_dir')})
            (C {<ls>} {<-l>} {($ Id.VSub_DollarName '$deploy_repo') </releases.html>})
          ]
        )
    )
    (command.ShFunction
      name: deploy-tar
      body: 
        (command.BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'download_dir='> (SQ <../oilshell.org__deploy/download/>)})
            (C {<mkdir>} {<-p>} {($ Id.VSub_DollarName '$download_dir')})
            (C {<cp>} {<-v>} 
              {<_release/oil-> ($ Id.VSub_DollarName '$OIL_VERSION') <.tar.> <Id.Lit_Star '*'>} {($ Id.VSub_DollarName '$download_dir')}
            )
            (C {<ls>} {<-l>} {($ Id.VSub_DollarName '$download_dir')})
          ]
        )
    )
    (command.ShFunction
      name: _release-files-html
      body: 
        (command.BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'version='> ($ Id.VSub_Number '$1')})
            (C {<echo>} {(SQ <'<table class="file-table">'>)})
            (C {<echo>} 
              {
                (SQ 
                  <'<tr><thead> <td>File</td> <td>Size</td> <td>SHA256 Checksum</td> </thead></tr>'>
                )
              }
            )
            (command.ForEach
              iter_name: name
              iter_words: [
                (word.BracedTree
                  parts: [
                    <oil->
                    ($ Id.VSub_DollarName '$version')
                    <.tar.>
                    (word_part.BracedTuple words:[{<xz>} {<gz>}])
                  ]
                )
              ]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (C {<local>} 
                      {<Id.Lit_VarLike 'url='> (DQ <download/> ($ Id.VSub_DollarName '$name'))}
                    )
                    (C {<local>} 
                      {<Id.Lit_VarLike 'path='> <../oilshell.org__deploy/download/> 
                        ($ Id.VSub_DollarName '$name')
                      }
                    )
                    (C {<local>} 
                      {<Id.Lit_VarLike 'checksum='> 
                        (command_sub
                          left_token: <Id.Left_DollarParen '$('>
                          command_list: 
                            (command.CommandList
                              children: [
                                (command.Pipeline
                                  children: [
                                    (C {<sha256sum>} {($ Id.VSub_DollarName '$path')})
                                    (C {<awk>} {(SQ <'{print $1}'>)})
                                  ]
                                  negated: F
                                )
                              ]
                            )
                        )
                      }
                    )
                    (C {<local>} 
                      {<Id.Lit_VarLike 'size='> 
                        (command_sub
                          left_token: <Id.Left_DollarParen '$('>
                          command_list: 
                            (command.CommandList
                              children: [
                                (C {<stat>} {<--format>} {(SQ <'%s'>)} {($ Id.VSub_DollarName '$path')})
                              ]
                            )
                        )
                      }
                    )
                    (C {<echo>} 
                      {(SQ <'<tr> <td class="filename"><a href="'>) ($ Id.VSub_DollarName '$url') 
                        (SQ <'">'>) ($ Id.VSub_DollarName '$name') (SQ <'</a></td>\n'> <'               <td class="size">'>) 
                        ($ Id.VSub_DollarName '$size') (SQ <'</td>\n'> <'               <td class="checksum">'>) ($ Id.VSub_DollarName '$checksum') 
                        (SQ <'</td>\n'> <'         </tr>'>)
                      }
                    )
                  ]
                )
            )
            (C {<echo>} {(SQ <'</table>'>)})
          ]
        )
    )
    (command.ShFunction
      name: _html-index
      body: 
        (command.BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'release_root_dir='> ($ Id.VSub_Number '$1')})
            (command.ForEach
              iter_name: entry
              iter_words: [{($ Id.VSub_DollarName '$release_root_dir') </> <Id.Lit_Star '*'>}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.Sentence
                              child: 
                                (command.Pipeline
                                  children: [(C {<test>} {<-d>} {($ Id.VSub_DollarName '$entry')})]
                                  negated: T
                                )
                              terminator: <Id.Op_Semi _>
                            )
                          ]
                          action: [(command.ControlFlow token:<Id.ControlFlow_Continue continue>)]
                          spids: [2801 2812]
                        )
                      ]
                    )
                    (C {<local>} {<Id.Lit_VarLike 'dir='> ($ Id.VSub_DollarName '$entry')})
                    (C {<local>} 
                      {<Id.Lit_VarLike 'version='> 
                        (command_sub
                          left_token: <Id.Left_DollarParen '$('>
                          command_list: 
                            (command.CommandList
                              children: [
                                (C {<head>} {<-n>} {<1>} 
                                  {($ Id.VSub_DollarName '$dir') </oil-version.txt>}
                                )
                              ]
                            )
                        )
                      }
                    )
                    (C {<local>} 
                      {<Id.Lit_VarLike 'release_date='> 
                        (command_sub
                          left_token: <Id.Left_DollarParen '$('>
                          command_list: 
                            (command.CommandList
                              children: [
                                (C {<head>} {<-n>} {<1>} 
                                  {($ Id.VSub_DollarName '$dir') </release-date.txt>}
                                )
                              ]
                            )
                        )
                      }
                    )
                    (C {<log>} {(DQ <'-- '> ($ Id.VSub_DollarName '$dir'))})
                    (C {<log>} {(DQ <'Version: '> ($ Id.VSub_DollarName '$version'))})
                    (C {<log>} {(DQ <'Release Date: '> ($ Id.VSub_DollarName '$release_date'))})
                    (C {<log>} {(DQ )})
                    (C {<echo>} 
                      {
                        (DQ ($ Id.VSub_DollarName '$release_date') <' '> 
                          ($ Id.VSub_DollarName '$version')
                        )
                      }
                    )
                  ]
                )
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {<_tmp/release-meta.txt>}
                )
              ]
            )
            (command.Simple
              words: [{<sort>} {<-r>} {<_tmp/release-meta.txt>}]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {<_tmp/sorted-releases.txt>}
                )
              ]
            )
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: [
                (command.Sentence
                  child: (C {<read>} {<date>} {<_>} {<version>})
                  terminator: <Id.Op_Semi _>
                )
              ]
              body: 
                (command.DoGroup
                  children: [
                    (C {<log>} {(DQ <'Release Date: '> ($ Id.VSub_DollarName '$date'))})
                    (C {<log>} {(DQ <'Version: '> ($ Id.VSub_DollarName '$version'))})
                    (C {<echo>} {(SQ <'<a name="'>) ($ Id.VSub_DollarName '$version') (SQ <'"></a>'>)})
                    (C {<echo>} {(DQ <'<h2>Version '> ($ Id.VSub_DollarName '$version') <'</h2>'>)})
                    (C {<echo>} 
                      {(DQ <'<p class='>) <date> (DQ <'>'> ($ Id.VSub_DollarName '$date') <'</p>'>)}
                    )
                    (C {<echo>} 
                      {(SQ <'<p>                 <a href="release/'>) 
                        ($ Id.VSub_DollarName '$version') 
                        (SQ <'/announcement.html">Release Announcement</a>\n'> 
                          <'              &nbsp; | &nbsp; <a href="release/'>
                        ) ($ Id.VSub_DollarName '$version') 
                        (SQ <'/doc/INSTALL.html">INSTALL</a>\n'> 
                          <'              &nbsp; | &nbsp; <a href="release/'>
                        ) ($ Id.VSub_DollarName '$version') (SQ <'/">Docs and Details</a>\n'> <'          </p>'>)
                      }
                    )
                    (C {<_release-files-html>} {($ Id.VSub_DollarName '$version')})
                  ]
                )
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Less '<'>
                  fd: -1
                  arg_word: {<_tmp/sorted-releases.txt>}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: _releases-html-header
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir.HereDoc
                  op: <Id.Redir_DLess '<<'>
                  fd: -1
                  here_begin: {<EOF>}
                  here_end_span_id: 3100
                  stdin_parts: [
                    <'<!DOCTYPE html>\n'>
                    <'<html>\n'>
                    <'  <head>\n'>
                    <'    <title>Oil Releases</title>\n'>
                    <'    <style>\n'>
                    <'      /* Make it centered and skinny for readability */\n'>
                    <'      body {\n'>
                    <'        margin: 0 auto;\n'>
                    <'        width: 60em;\n'>
                    <'      }\n'>
                    <'      h1 {\n'>
                    <'        text-align: center;\n'>
                    <'      }\n'>
                    <'      thead {\n'>
                    <'        font-weight: bold;\n'>
                    <'      }\n'>
                    <'      /* Style for checksum, file size, etc. */\n'>
                    <'\n'>
                    <'      .file-table {\n'>
                    <'        width: 100%;\n'>
                    <'      }\n'>
                    <'\n'>
                    <'      .filename {\n'>
                    <'        font-family: monospace;\n'>
                    <'      }\n'>
                    <'\n'>
                    <'      .size {\n'>
                    <'      }\n'>
                    <'      .checksum {\n'>
                    <'        font-family: monospace;\n'>
                    <'        color: #555;\n'>
                    <'      }\n'>
                    <'\n'>
                    <'      /* Copied from oilshell.org bundle.css */\n'>
                    <'      .date {\n'>
                    <'        font-size: medium;\n'>
                    <'        color: #555;\n'>
                    <'        padding-left: 1em;\n'>
                    <'      }\n'>
                    <'      #home-link {\n'>
                    <'        text-align: right;\n'>
                    <'      }\n'>
                    <'    </style>\n'>
                    <'  </head>\n'>
                    <'  <body>\n'>
                    <'    <p id='>
                    <Id.Right_DoubleQuote '"'>
                    <home-link>
                    <Id.Right_DoubleQuote '"'>
                    <'>\n'>
                    <'      <a href='>
                    <Id.Right_DoubleQuote '"'>
                    </>
                    <Id.Right_DoubleQuote '"'>
                    <'>oilshell.org</a>\n'>
                    <'    </p>\n'>
                    <'    <h1>Oil Releases</h1>\n'>
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: _html-footer
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir.HereDoc
                  op: <Id.Redir_DLess '<<'>
                  fd: -1
                  here_begin: {<EOF>}
                  here_end_span_id: 3119
                  stdin_parts: [<'  </body>\n'> <'</html>\n'>]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: html-index
      body: 
        (command.BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'release_root_dir='> ($ Id.VSub_Number '$1')})
            (C {<local>} 
              {<Id.Lit_VarLike 'out='> 
                (braced_var_sub
                  token: <Id.VSub_Number 2>
                  suffix_op: 
                    (suffix_op.Unary
                      op_id: Id.VTest_ColonHyphen
                      arg_word: {<_tmp> <Id.Lit_Slash /> <releases.html>}
                    )
                )
              }
            )
            (command.BraceGroup
              children: [
                (C {<_releases-html-header>})
                (C {<_html-index>} {($ Id.VSub_DollarName '$release_root_dir')})
                (C {<_html-footer>})
              ]
              redirects: [
                (redir.Redir
                  op: <Id.Redir_Great '>'>
                  fd: -1
                  arg_word: {($ Id.VSub_DollarName '$out')}
                )
              ]
            )
            (C {<ls>} {<-l>} {($ Id.VSub_DollarName '$out')})
          ]
        )
    )
    (C {(DQ ($ Id.VSub_At '$@'))})
  ]
)