(command.CommandList
  children: [
    (C {<Id.KW_Set set>} {<-euo>} {<pipefail>})
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.Subshell
                  command_list: 
                    (command.CommandList
                      children: [
                        (command.Pipeline
                          children: [
                            (C {<grep>} {<-r>} {<KJ_DBG>} {<src/> <Id.Lit_Star '*'>})
                            (C {<egrep>} {<-v>} {(SQ <'/(debug(-test)?|exception)[.]'>)})
                          ]
                          negated: F
                        )
                      ]
                    )
                )
              terminator: <Id.Op_Semi _>
            )
          ]
          action: [
            (command.Simple
              words: [{<echo>} {(SQ <'*** Error:  There are instances of KJ_DBG in the code.'>)}]
              redirects: [(redir.Redir op:<Id.Redir_GreatAnd '>&'> fd:-1 arg_word:{<2>})]
            )
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
          spids: [11 35]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: (C {<egrep>} {<-r>} {(SQ <'TODO\\(now\\)'>)} {<src/> <Id.Lit_Star '*'>})
              terminator: <Id.Op_Semi _>
            )
          ]
          action: [
            (command.Simple
              words: [{<echo>} {(SQ <'*** Error:  There are release-blocking TODOs in the code.'>)}]
              redirects: [(redir.Redir op:<Id.Redir_GreatAnd '>&'> fd:-1 arg_word:{<2>})]
            )
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
          spids: [55 69]
        )
      ]
    )
    (C {<make>} {<clean>})
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (C {<Id.Lit_LBracket '['>} 
                  {
                    (DQ <x> 
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        command_list: 
                          (command.CommandList
                            children: [(C {<git>} {<status>} {<--porcelain>})]
                          )
                      )
                    )
                  } {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ <x>)} {<Id.Lit_RBracket ']'>}
                )
              terminator: <Id.Op_Semi _>
            )
          ]
          action: [
            (command.Simple
              words: [{<echo>} {(DQ <'Please commit changes to git before releasing.'>)}]
              redirects: [(redir.Redir op:<Id.Redir_GreatAnd '>&'> fd:-1 arg_word:{<2>})]
            )
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
          spids: [94 119]
        )
      ]
    )
    (C {<.>} {<branch.conf>})
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (C {<Id.Lit_LBracket '['>} 
                  {
                    (command_sub
                      left_token: <Id.Left_DollarParen '$('>
                      command_list: 
                        (command.CommandList
                          children: [(C {<git>} {<rev-parse>} {<--abbrev-ref>} {<HEAD>})]
                        )
                    )
                  } {<Id.Lit_Equals '='>} {<master>} {<Id.Lit_RBracket ']'>}
                )
              terminator: <Id.Op_Semi _>
            )
          ]
          action: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:CHANNEL)
                  op: assign_op.Equal
                  rhs: {<dev>}
                  spids: [184]
                )
              ]
            )
          ]
          spids: [160 181]
        )
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (C {<Id.Lit_LBracket '['>} {($ Id.VSub_DollarName '$IS_STABLE')} {<Id.Lit_Equals '='>} 
                  {<true>} {<Id.Lit_RBracket ']'>}
                )
              terminator: <Id.Op_Semi _>
            )
          ]
          action: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:CHANNEL)
                  op: assign_op.Equal
                  rhs: {<stable>}
                  spids: [203]
                )
              ]
            )
          ]
          spids: [187 200]
        )
      ]
      else_action: [
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:CHANNEL)
              op: assign_op.Equal
              rhs: {<beta>}
              spids: [209]
            )
          ]
        )
      ]
    )
    (C {<echo>} 
      {
        (DQ <'**** Determining next build number for '> ($ Id.VSub_DollarName '$CHANNEL') 
          <' channel ****'>
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:LAST_BUILD)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: <Id.Left_DollarParen '$('>
                command_list: 
                  (command.CommandList
                    children: [
                      (C {<curl>} {<-fs>} 
                        {<https> <Id.Lit_Other ':'> <//install.sandstorm.io/> 
                          ($ Id.VSub_DollarName '$CHANNEL')
                        }
                      )
                    ]
                  )
              )
            }
          spids: [224]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.DParen
                  child: 
                    (arith_expr.Binary
                      op_id: Id.Arith_Great
                      left: 
                        (arith_expr.Binary
                          op_id: Id.Arith_Slash
                          left: (arith_expr.VarRef token:<Id.Lit_ArithVarLike LAST_BUILD>)
                          right: (arith_expr.ArithWord w:{<Id.Lit_Digits 1000>})
                        )
                      right: (arith_expr.VarRef token:<Id.Lit_ArithVarLike BRANCH_NUMBER>)
                    )
                )
              terminator: <Id.Op_Semi _>
            )
          ]
          action: [
            (command.Simple
              words: [
                {<echo>}
                {
                  (DQ <'ERROR: '> ($ Id.VSub_DollarName '$CHANNEL') 
                    <' has already moved past this branch!'>
                  )
                }
              ]
              redirects: [(redir.Redir op:<Id.Redir_GreatAnd '>&'> fd:-1 arg_word:{<2>})]
            )
            (command.Simple
              words: [{<echo>} {(DQ <'  I refuse to replace it with an older branch.'>)}]
              redirects: [(redir.Redir op:<Id.Redir_GreatAnd '>&'> fd:-1 arg_word:{<2>})]
            )
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
          spids: [237 255]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:BASE_BUILD)
          op: assign_op.Equal
          rhs: 
            {
              (word_part.ArithSub
                anode: 
                  (arith_expr.Binary
                    op_id: Id.Arith_Star
                    left: (arith_expr.VarRef token:<Id.Lit_ArithVarLike BRANCH_NUMBER>)
                    right: (arith_expr.ArithWord w:{<Id.Lit_Digits 1000>})
                  )
              )
            }
          spids: [287]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:BUILD)
          op: assign_op.Equal
          rhs: 
            {
              (word_part.ArithSub
                anode: 
                  (arith_expr.TernaryOp
                    cond: 
                      (arith_expr.Binary
                        op_id: Id.Arith_Great
                        left: (arith_expr.VarRef token:<Id.Lit_ArithVarLike BASE_BUILD>)
                        right: (arith_expr.VarRef token:<Id.Lit_ArithVarLike LAST_BUILD>)
                      )
                    true_expr: (arith_expr.VarRef token:<Id.Lit_ArithVarLike BASE_BUILD>)
                    false_expr: 
                      (arith_expr.Binary
                        op_id: Id.Arith_Plus
                        left: (arith_expr.VarRef token:<Id.Lit_ArithVarLike LAST_BUILD>)
                        right: (arith_expr.ArithWord w:{<Id.Lit_Digits 1>})
                      )
                  )
              )
            }
          spids: [299]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:BUILD_MINOR)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (word_part.ArithSub
                  anode: 
                    (arith_expr.Binary
                      op_id: Id.Arith_Percent
                      left: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$BUILD')})
                      right: (arith_expr.ArithWord w:{<Id.Lit_Digits 1000>})
                    )
                )
              )
            }
          spids: [323]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:DISPLAY_VERSION)
          op: assign_op.Equal
          rhs: {(DQ (${ Id.VSub_Name BRANCH_NUMBER) <.> (${ Id.VSub_Name BUILD_MINOR))}
          spids: [337]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:TAG_NAME)
          op: assign_op.Equal
          rhs: {(DQ <v> (${ Id.VSub_Name DISPLAY_VERSION))}
          spids: [348]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:SIGNING_KEY_ID)
          op: assign_op.Equal
          rhs: {<160D2D577518B58D94C9800B63F227499DA8CCBD>}
          spids: [356]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:EXPECTED_CHANGELOG)
          op: assign_op.Equal
          rhs: 
            {
              (DQ <'### '> ($ Id.VSub_DollarName '$TAG_NAME') <' ('> 
                (command_sub
                  left_token: <Id.Left_DollarParen '$('>
                  command_list: (command.CommandList children:[(C {<date>} {(SQ <'+%Y-%m-%d'>)})])
                ) <')'>
              )
            }
          spids: [363]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.DBracket
                  expr: 
                    (bool_expr.Binary
                      op_id: Id.BoolBinary_GlobNEqual
                      left: 
                        {
                          (DQ 
                            (command_sub
                              left_token: <Id.Left_DollarParen '$('>
                              command_list: 
                                (command.CommandList
                                  children: [(C {<head>} {<-n>} {<1>} {<CHANGELOG.md>})]
                                )
                            )
                          )
                        }
                      right: {(DQ ($ Id.VSub_DollarName '$EXPECTED_CHANGELOG')) <Id.Lit_Other '*'>}
                    )
                )
              terminator: <Id.Op_Semi _>
            )
          ]
          action: [
            (command.Simple
              words: [{<echo>} {(DQ <'Changelog not updated. First line should be:'>)}]
              redirects: [(redir.Redir op:<Id.Redir_GreatAnd '>&'> fd:-1 arg_word:{<2>})]
            )
            (command.Simple
              words: [{<echo>} {(DQ ($ Id.VSub_DollarName '$EXPECTED_CHANGELOG'))}]
              redirects: [(redir.Redir op:<Id.Redir_GreatAnd '>&'> fd:-1 arg_word:{<2>})]
            )
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
          spids: [378 404]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:TARBALL)
          op: assign_op.Equal
          rhs: {<sandstorm-> ($ Id.VSub_DollarName '$BUILD') <.tar.xz>}
          spids: [446]
        )
      ]
    )
    (C {<echo>} {(DQ <'**** Building build '> ($ Id.VSub_DollarName '$BUILD') <' ****'>)})
    (C {<make>} {<Id.Lit_VarLike 'BUILD='> ($ Id.VSub_DollarName '$BUILD')})
    (C {<echo>} {(DQ <'**** Tagging this commit ****'>)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:GIT_REVISION)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: <Id.Left_DollarParen '$('>
                  command_list: 
                    (command.CommandList
                      children: [
                        (command.Simple
                          redirects: [
                            (redir.Redir
                              op: <Id.Redir_Less '<'>
                              fd: -1
                              arg_word: {<bundle/git-revision>}
                            )
                          ]
                        )
                      ]
                    )
                )
              )
            }
          spids: [484]
        )
      ]
    )
    (C {<git>} {<tag>} {<-u>} {($ Id.VSub_DollarName '$SIGNING_KEY_ID')} 
      {(DQ ($ Id.VSub_DollarName '$TAG_NAME'))} {(DQ ($ Id.VSub_DollarName '$GIT_REVISION'))} {<-m>} 
      {(DQ <'Release Sandstorm '> (${ Id.VSub_Name DISPLAY_VERSION))}
    )
    (C {<git>} {<push>} {<origin>} {(DQ ($ Id.VSub_DollarName '$TAG_NAME'))})
    (C {<echo>} {(DQ <'**** Pushing build '> ($ Id.VSub_DollarName '$BUILD') <' ****'>)})
    (C {<rm>} {<-f>} {($ Id.VSub_DollarName '$TARBALL') <.sig>} 
      {($ Id.VSub_DollarName '$TARBALL') <.update-sig>} {<install.sh.sig>}
    )
    (C {<gpg>} {<-u>} {($ Id.VSub_DollarName '$SIGNING_KEY_ID')} {<--digest-algo>} {<SHA512>} 
      {<--detach-sig>} {($ Id.VSub_DollarName '$TARBALL')}
    )
    (C {<gpg>} {<-u>} {($ Id.VSub_DollarName '$SIGNING_KEY_ID')} {<--digest-algo>} {<SHA512>} 
      {<--detach-sig>} {<install.sh>}
    )
    (command.Simple
      words: [
        {<tmp/sandstorm/update-tool>}
        {<sign>}
        {(word_part.TildeSub token:<Id.Lit_TildeLike '~'>) </.sandstorm-update-keyring>}
        {($ Id.VSub_DollarName '$TARBALL')}
      ]
      redirects: [
        (redir.Redir
          op: <Id.Redir_Great '>'>
          fd: -1
          arg_word: {($ Id.VSub_DollarName '$TARBALL') <.update-sig>}
        )
      ]
    )
    (command.Simple
      words: [{<echo>} {($ Id.VSub_DollarName '$BUILD')}]
      redirects: [
        (redir.Redir
          op: <Id.Redir_Great '>'>
          fd: -1
          arg_word: {<tmp/> ($ Id.VSub_DollarName '$CHANNEL')}
        )
      ]
    )
    (C {<gce-ss>} {<copy-files>} {($ Id.VSub_DollarName '$TARBALL')} 
      {<fe> <Id.Lit_Other ':'> </var/www/dl.sandstorm.io>}
    )
    (C {<gce-ss>} {<copy-files>} {($ Id.VSub_DollarName '$TARBALL') <.sig>} 
      {<fe> <Id.Lit_Other ':'> </var/www/dl.sandstorm.io>}
    )
    (C {<gce-ss>} {<copy-files>} {($ Id.VSub_DollarName '$TARBALL') <.update-sig>} 
      {<fe> <Id.Lit_Other ':'> </var/www/dl.sandstorm.io>}
    )
    (C {<gce-ss>} {<copy-files>} {<tmp/> ($ Id.VSub_DollarName '$CHANNEL')} 
      {<fe> <Id.Lit_Other ':'> </var/www/install.sandstorm.io>}
    )
    (C {<gce-ss>} {<copy-files>} {<install.sh>} {<fe> <Id.Lit_Other ':'> </var/www/install.sandstorm.io>})
    (C {<gce-ss>} {<copy-files>} {<install.sh.sig>} 
      {<fe> <Id.Lit_Other ':'> </var/www/install.sandstorm.io>}
    )
    (C {<gce-ss>} {<ssh>} {<alpha>} {<--command>} {(SQ <'sudo service sandstorm update dev'>)})
  ]
)