(command.CommandList
  children: [
    (C {<set>} {<-o>} {<nounset>})
    (C {<set>} {<-o>} {<pipefail>})
    (C {<set>} {<-o>} {<errexit>})
    (C {<readonly>} 
      {<Id.Lit_VarLike 'OIL_VERSION='> 
        (command_sub
          left_token: <Id.Left_DollarParen '$('>
          child: (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: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<echo>} {(DQ ($ Id.VSub_At '$@'))}]
              redirects: [(redir op:<Id.Redir_GreatAnd '1>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: _clean-tmp-dirs
      body: 
        (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: 
        (BraceGroup
          children: [
            (C {<_clean-tmp-dirs>})
            (C {<rm>} {<-r>} {<-f>} {<_devbuild>})
            (C {<'build/actions.sh'>} {<clean-repo>})
          ]
        )
    )
    (command.ShFunction
      name: _dev-build
      body: (BraceGroup children:[(C {<'build/dev.sh'>} {<all>})])
    )
    (command.ShFunction
      name: _release-build
      body: 
        (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: 
        (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]
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: build-and-test
      body: 
        (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: 
        (BraceGroup
          children: [
            (C {<'test/spec.sh'>} {<install-shells>})
            (C {<sudo>} {<apt>} {<install>} {<python-dev>})
          ]
        )
    )
    (command.ShFunction
      name: benchmark-build
      body: 
        (BraceGroup
          children: [(C {<_install>}) (C {<_clean>}) (C {<_dev-build>}) (C {<_release-build>})]
        )
    )
    (command.ShFunction
      name: benchmark-run
      body: 
        (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]
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: benchmark-run-on-1-machine
      body: 
        (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]
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: _compressed-tarball
      body: 
        (BraceGroup
          children: [
            (C {<local>} 
              {<Id.Lit_VarLike 'name='> 
                (braced_var_sub
                  token: <Id.VSub_Number 1>
                  suffix_op: (suffix_op.Unary tok:<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 tok:<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
                      op: <Id.Redir_Great '>'>
                      loc: (redir_loc.Fd fd:1)
                      arg: {($ Id.VSub_DollarName '$out')}
                    )
                  ]
                  do_fork: T
                )
            )
            (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
                      op: <Id.Redir_Great '>'>
                      loc: (redir_loc.Fd fd:1)
                      arg: {($ Id.VSub_DollarName '$out2')}
                    )
                  ]
                  do_fork: T
                )
            )
            (C {<ls>} {<-l>} {($ Id.VSub_DollarName '$out2')})
          ]
        )
    )
    (command.ShFunction
      name: oil
      body: 
        (BraceGroup
          children: [(C {<_compressed-tarball>} {<oil>} {($ Id.VSub_DollarName '$OIL_VERSION')})]
        )
    )
    (command.ShFunction
      name: hello
      body: 
        (BraceGroup
          children: [
            (C {<_compressed-tarball>} {<hello>} 
              {
                (command_sub
                  left_token: <Id.Left_DollarParen '$('>
                  child: (C {<head>} {<-n>} {<1>} {<'build/testdata/hello-version.txt'>})
                )
              }
            )
          ]
        )
    )
    (command.ShFunction
      name: escape-segments
      body: 
        (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: 
        (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: 
        (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
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      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'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: _git-changelog
      body: 
        (BraceGroup
          children: [
            (C {<_git-changelog-header>} {(DQ ($ Id.VSub_At '$@'))})
            (C {<_git-changelog-body>} {(DQ ($ Id.VSub_At '$@'))})
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {<EOF>}
                      here_end_span_id: 1121
                      stdin_parts: [<'  </table>\n'>]
                    )
                )
              ]
              do_fork: T
            )
            (C {<_html-footer>})
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.1
      body: 
        (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
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: 
                    {<'../oilshell.org__deploy/release/'> ($ Id.VSub_DollarName '$version') 
                      <'/changelog.html'>
                    }
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.2.alpha1
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<_git-changelog>} {<'release/0.1.0'>} {<'release/0.2.alpha1'>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<'_release/VERSION/changelog.html'>}
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.2.0
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<_git-changelog>} {<'release/0.1.0'>} {<'release/0.2.0'>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<'_release/VERSION/changelog.html'>}
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.3.alpha1
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<_git-changelog>} {<'release/0.2.0'>} {<'release/0.3.alpha1'>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<'_release/VERSION/changelog.html'>}
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.3.0
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<_git-changelog>} {<'release/0.2.0'>} {<'release/0.3.0'>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<'_release/VERSION/changelog.html'>}
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.4.0
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<_git-changelog>} {<'release/0.3.0'>} {<'release/0.4.0'>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<'_release/VERSION/changelog.html'>}
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.5.alpha1
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<_git-changelog>} {<'release/0.4.0'>} {<'release/0.5.alpha1'>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<'_release/VERSION/changelog.html'>}
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.5.alpha2
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<_git-changelog>} {<'release/0.5.alpha1'>} {<'release/0.5.alpha2'>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<'_release/VERSION/changelog.html'>}
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.5.alpha3
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<_git-changelog>} {<'release/0.5.alpha2'>} {<'release/0.5.alpha3'>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<'_release/VERSION/changelog.html'>}
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: html-redirect
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'url='> ($ Id.VSub_Number '$1')})
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      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'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: no-announcement
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      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'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: write-no-announcement
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<no-announcement>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<'_release/VERSION/announcement.html'>}
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: announcement-0.0
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<html-redirect>} {(SQ <'/blog/2017/07/23.html'>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<'../oilshell.org__deploy/release/0.0.0/announcement.html'>}
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: announcement-0.1
      body: 
        (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
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: 
                    {<'../oilshell.org__deploy/release/'> ($ Id.VSub_DollarName '$version') 
                      <'/announcement.html'>
                    }
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: announcement-0.2
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<html-redirect>} {(SQ <'/blog/2017/11/10.html'>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<'_release/VERSION/announcement.html'>}
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: announcement-0.3
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<html-redirect>} {(SQ <'/blog/2017/12/22.html'>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<'_release/VERSION/announcement.html'>}
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: announcement-0.4
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<html-redirect>} {(SQ <'/blog/2018/02/03.html'>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<'_release/VERSION/announcement.html'>}
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: announcement-0.5.alpha3
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<html-redirect>} {(SQ <'/blog/2018/04/30.html'>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<'_release/VERSION/announcement.html'>}
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: _link
      body: 
        (BraceGroup
          children: [
            (C {<ln>} {<-s>} {<-f>} {<-v>} {<--no-target-directory>} {(DQ ($ Id.VSub_At '$@'))})
          ]
        )
    )
    (command.ShFunction
      name: compress-txt
      body: 
        (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: 
        (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: 
        (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: 
        (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
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$out') <'/pydeps.txt'>}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<'build/metrics.sh'>} {<linecount-nativedeps>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$out') <'/nativedeps.txt'>}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<'scripts/count.sh'>} {<all>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$out') <'/src.txt'>}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<'scripts/count.sh'>} {<parser>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$out') <'/parser.txt'>}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<'scripts/count.sh'>} {<runtime>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$out') <'/runtime.txt'>}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<'scripts/count.sh'>} {<oil-osh-cloc>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$out') <'/oil-osh-cloc.txt'>}
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: metrics
      body: 
        (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
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$out') <'/pyc-bytes.txt'>}
                )
              ]
              do_fork: T
            )
            (C {<line-counts>} {($ Id.VSub_DollarName '$out') <'/line-counts'>})
            (C {<tree>} {($ Id.VSub_DollarName '$out')})
          ]
        )
    )
    (command.ShFunction
      name: _copy-path
      body: 
        (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 '$('>
                  child: (C {<dirname>} {($ Id.VSub_DollarName '$dest')})
                )
              }
            )
            (C {<cp>} {<-v>} {($ Id.VSub_DollarName '$src')} {($ Id.VSub_DollarName '$dest')})
          ]
        )
    )
    (command.ShFunction
      name: copy-web
      body: 
        (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: 
        (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: 
        (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: 
        (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: 
        (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_names: [name]
              iterable: 
                (for_iter.Words
                  words: [
                    (word.BracedTree
                      parts: [
                        <oil->
                        ($ Id.VSub_DollarName '$version')
                        <.tar.>
                        (word_part.BracedTuple words:[{<xz>} {<gz>}])
                      ]
                    )
                  ]
                )
              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 '$('>
                          child: 
                            (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 '$('>
                          child: 
                            (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: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'release_root_dir='> ($ Id.VSub_Number '$1')})
            (command.ForEach
              iter_names: [entry]
              iterable: 
                (for_iter.Words
                  words: [{($ Id.VSub_DollarName '$release_root_dir') <'/'> <Id.Lit_Star '*'>}]
                )
              body: 
                (command.DoGroup
                  children: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (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 '$('>
                          child: 
                            (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 '$('>
                          child: 
                            (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
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<'_tmp/release-meta.txt'>}
                )
              ]
            )
            (command.Simple
              words: [{<sort>} {<-r>} {<'_tmp/release-meta.txt'>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<'_tmp/sorted-releases.txt'>}
                )
              ]
              do_fork: T
            )
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: (C {<read>} {<date>} {<Id.Lit_Underscore _>} {<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
                  op: <Id.Redir_Less '<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: {<'_tmp/sorted-releases.txt'>}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: _releases-html-header
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      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'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: _html-footer
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {<EOF>}
                      here_end_span_id: 3119
                      stdin_parts: [<'  </body>\n'> <'</html>\n'>]
                    )
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: html-index
      body: 
        (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
                      tok: <Id.VTest_ColonHyphen ':-'>
                      arg_word: {<_tmp> <Id.Lit_Slash '/'> <releases.html>}
                    )
                )
              }
            )
            (BraceGroup
              children: [
                (C {<_releases-html-header>})
                (C {<_html-index>} {($ Id.VSub_DollarName '$release_root_dir')})
                (C {<_html-footer>})
              ]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName '$out')}
                )
              ]
            )
            (C {<ls>} {<-l>} {($ Id.VSub_DollarName '$out')})
          ]
        )
    )
    (C {(DQ ($ Id.VSub_At '$@'))})
  ]
)