(command.CommandList
  children: [
    (command.AndOr
      children: [
        (command.Simple
          blame_tok: <Id.Lit_LBracket '['>
          more_env: []
          words: [
            {<Id.Lit_LBracket '['>}
            {<-n>}
            {(DQ ($ Id.VSub_DollarName PROJROOT))}
            {<Id.Lit_RBracket ']'>}
          ]
          redirects: []
          do_fork: T
        )
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Sentence
              child: 
                (command.Simple
                  blame_tok: <echo>
                  more_env: []
                  words: [{<echo>} {(DQ <'Require environment var PROJROOT'>)}]
                  redirects: [(Redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
                  do_fork: T
                )
              terminator: <Id.Op_Semi _>
            )
            (command.Sentence
              child: (command.ControlFlow keyword:<Id.ControlFlow_Exit exit> arg_word:{<1>})
              terminator: <Id.Op_Semi _>
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
      ]
      ops: [<Id.Op_DPipe _>]
    )
    (command.Simple
      blame_tok: <echo>
      more_env: []
      words: [{<echo>} {(DQ <' -> Checking Version'>)}]
      redirects: [(Redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
      do_fork: T
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'version_parts='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'version_parts='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'version_parts='> name:version_parts)
          op: assign_op.Equal
          rhs: 
            {
              (CommandSub
                left_token: <Id.Left_DollarParen '$('>
                child: 
                  (command.Pipeline
                    children: [
                      (command.Simple
                        blame_tok: <grep>
                        more_env: []
                        words: [
                          {<grep>}
                          {<-i>}
                          {<version>}
                          {($ Id.VSub_DollarName PROJROOT) <'/Changes'>}
                        ]
                        redirects: []
                        do_fork: T
                      )
                      (command.Simple
                        blame_tok: <head>
                        more_env: []
                        words: [{<head>} {<-n>} {<1>}]
                        redirects: []
                        do_fork: T
                      )
                      (command.Simple
                        blame_tok: <sed>
                        more_env: []
                        words: [
                          {<sed>}
                          {<-ne>}
                          {
                            (SQ 
                              <
's/Version *\\([0-9]*\\)\\.\\([0-9]*\\)\\.\\([0-9]*\\)[^0-9]*\\([-0-9]*\\)/\\1 \\2 \\3 \\4/p'
                              >
                            )
                          }
                        ]
                        redirects: []
                        do_fork: T
                      )
                    ]
                    ops: [<Id.Op_Pipe _> <Id.Op_Pipe _>]
                  )
                right: <Id.Eof_RParen _>
              )
            }
        )
      ]
      redirects: []
    )
    (command.Simple
      blame_tok: <read>
      more_env: []
      words: [{<read>} {<major>} {<minor>} {<release>} {<date>}]
      redirects: [
        (Redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.HereDoc
              here_begin: {<END>}
              here_end_tok: <Id.Undefined_Tok ''>
              stdin_parts: [($ Id.VSub_DollarName version_parts) <'\n'>]
            )
        )
      ]
      do_fork: T
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'extra='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'extra='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'extra='> name:extra)
          op: assign_op.Equal
          rhs: {(SQ )}
        )
      ]
      redirects: []
    )
    (command.If
      if_kw: <Id.KW_If if>
      arms: [
        (IfArm
          keyword: <Id.KW_If if>
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (command.Simple
                      blame_tok: <Id.Lit_LBracket '['>
                      more_env: []
                      words: [
                        {<Id.Lit_LBracket '['>}
                        {<-z>}
                        {(DQ ($ Id.VSub_DollarName major))}
                        {<-o>}
                        {<-z>}
                        {(DQ ($ Id.VSub_DollarName date))}
                        {<Id.Lit_RBracket ']'>}
                      ]
                      redirects: []
                      do_fork: T
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          then_kw: <Id.KW_Then then>
          action: [
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'Can\'t get version from ./Changes'>)}]
              redirects: [(Redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
              do_fork: T
            )
            (command.ControlFlow keyword:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
          spids: [96 117]
        )
      ]
      else_action: []
      fi_kw: <Id.KW_Fi fi>
      redirects: []
    )
    (command.Simple
      blame_tok: <echo>
      more_env: []
      words: [
        {<echo>}
        {
          (DQ <'    Changes version is '> ($ Id.VSub_DollarName major) <.> ($ Id.VSub_DollarName minor) 
            <.> ($ Id.VSub_DollarName release) <' ('> ($ Id.VSub_DollarName date) <')'>
          )
        }
      ]
      redirects: [(Redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
      do_fork: T
    )
    (command.If
      if_kw: <Id.KW_If if>
      arms: [
        (IfArm
          keyword: <Id.KW_If if>
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (command.Simple
                      blame_tok: <Id.Lit_LBracket '['>
                      more_env: []
                      words: [
                        {<Id.Lit_LBracket '['>}
                        {<-d>}
                        {(DQ ($ Id.VSub_DollarName PROJROOT) <'/.git'>)}
                        {<Id.Lit_RBracket ']'>}
                      ]
                      redirects: []
                      do_fork: T
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          then_kw: <Id.KW_Then then>
          action: [
            (command.Simple
              blame_tok: <export>
              more_env: []
              words: [
                {<export>}
                {<Id.Lit_VarLike 'GIT_DIR='> (DQ ($ Id.VSub_DollarName PROJROOT) <'/.git'>)}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <export>
              more_env: []
              words: [
                {<export>}
                {<Id.Lit_VarLike 'GIT_WORK_TREE='> (DQ ($ Id.VSub_DollarName PROJROOT))}
              ]
              redirects: []
              do_fork: T
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'head_hash='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'head_hash='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'head_hash='> name:head_hash)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (CommandSub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Simple
                            blame_tok: <git>
                            more_env: []
                            words: [
                              {<git>}
                              {<log>}
                              {<-n>}
                              {<1>}
                              {<--format> <Id.Lit_Equals '='> <format> <Id.Lit_Colon ':'> 
                                <Id.Lit_Other '%'> <h>
                              }
                            ]
                            redirects: []
                            do_fork: T
                          )
                        right: <Id.Eof_RParen _>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'tag_hash='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'tag_hash='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'tag_hash='> name:tag_hash)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (CommandSub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Simple
                            blame_tok: <git>
                            more_env: []
                            words: [
                              {<git>}
                              {<log>}
                              {<-n>}
                              {<1>}
                              {<--format> <Id.Lit_Equals '='> <format> <Id.Lit_Colon ':'> 
                                <Id.Lit_Other '%'> <h>
                              }
                              {<v> ($ Id.VSub_DollarName major) <.> ($ Id.VSub_DollarName minor) <.> 
                                ($ Id.VSub_DollarName release)
                              }
                              {<-->}
                            ]
                            redirects: [
                              (Redir
                                op: <Id.Redir_Great '2>'>
                                loc: (redir_loc.Fd fd:2)
                                arg: {<'/dev/null'>}
                              )
                            ]
                            do_fork: T
                          )
                        right: <Id.Eof_RParen _>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'git_dirty='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'git_dirty='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'git_dirty='> name:git_dirty)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (CommandSub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Pipeline
                            children: [
                              (command.Simple
                                blame_tok: <git>
                                more_env: []
                                words: [{<git>} {<status>} {<--porcelain>}]
                                redirects: []
                                do_fork: T
                              )
                              (command.Simple
                                blame_tok: <wc>
                                more_env: []
                                words: [{<wc>} {<-l>}]
                                redirects: []
                                do_fork: T
                              )
                            ]
                            ops: [<Id.Op_Pipe _>]
                          )
                        right: <Id.Eof_RParen _>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Simple
                              blame_tok: <Id.Lit_LBracket '['>
                              more_env: []
                              words: [
                                {<Id.Lit_LBracket '['>}
                                {(DQ ($ Id.VSub_DollarName git_dirty))}
                                {<-gt>}
                                {<0>}
                                {<-o>}
                                {(DQ ($ Id.VSub_DollarName tag_hash))}
                                {<Id.KW_Bang '!'> <Id.Lit_Equals '='>}
                                {(DQ ($ Id.VSub_DollarName head_hash))}
                                {<Id.Lit_RBracket ']'>}
                              ]
                              redirects: []
                              do_fork: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'    Git state differs from ./Changes'>)}]
                      redirects: [(Redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
                      do_fork: T
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'extra='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'extra='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'extra='> name:extra)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_DollarName head_hash))}
                        )
                      ]
                      redirects: []
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'date='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'date='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'date='> name:date)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (DQ 
                                (CommandSub
                                  left_token: <Id.Left_DollarParen '$('>
                                  child: 
                                    (command.Pipeline
                                      children: [
                                        (command.Simple
                                          blame_tok: <git>
                                          more_env: []
                                          words: [
                                            {<git>}
                                            {<log>}
                                            {<-n>}
                                            {<1>}
                                            {<--format> <Id.Lit_Equals '='> <format> <Id.Lit_Colon ':'> 
                                              <Id.Lit_Other '%'> <ci>
                                            }
                                          ]
                                          redirects: []
                                          do_fork: T
                                        )
                                        (command.Simple
                                          blame_tok: <sed>
                                          more_env: []
                                          words: [{<sed>} {<-e>} {(SQ <'s/ /T/;s/ //'>)}]
                                          redirects: []
                                          do_fork: T
                                        )
                                      ]
                                      ops: [<Id.Op_Pipe _>]
                                    )
                                  right: <Id.Eof_RParen _>
                                )
                              )
                            }
                        )
                      ]
                      redirects: []
                    )
                    (command.If
                      if_kw: <Id.KW_If if>
                      arms: [
                        (IfArm
                          keyword: <Id.KW_If if>
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (command.Simple
                                      blame_tok: <Id.Lit_LBracket '['>
                                      more_env: []
                                      words: [
                                        {<Id.Lit_LBracket '['>}
                                        {(DQ ($ Id.VSub_DollarName git_dirty))}
                                        {<-gt>}
                                        {<0>}
                                        {<Id.Lit_RBracket ']'>}
                                      ]
                                      redirects: []
                                      do_fork: T
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          then_kw: <Id.KW_Then then>
                          action: [
                            (command.ShAssignment
                              left: <Id.Lit_VarLike 'extra='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike 'extra='>
                                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'extra='> name:extra)
                                  op: assign_op.Equal
                                  rhs: {(DQ ($ Id.VSub_DollarName extra) <'+changes'>)}
                                )
                              ]
                              redirects: []
                            )
                            (command.Sentence
                              child: 
                                (command.ShAssignment
                                  left: <Id.Lit_VarLike 'date='>
                                  pairs: [
                                    (AssignPair
                                      left: <Id.Lit_VarLike 'date='>
                                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'date='> name:date)
                                      op: assign_op.Equal
                                      rhs: 
                                        {
                                          (CommandSub
                                            left_token: <Id.Left_Backtick '`'>
                                            child: 
                                              (command.Simple
                                                blame_tok: <date>
                                                more_env: []
                                                words: [{<date>} {(DQ <'+%Y-%m-%dT%H:%M:%S'>)}]
                                                redirects: []
                                                do_fork: T
                                              )
                                            right: <Id.Backtick_Right '`'>
                                          )
                                        }
                                    )
                                  ]
                                  redirects: []
                                )
                              terminator: <Id.Op_Semi _>
                            )
                          ]
                          spids: [332 347]
                        )
                      ]
                      else_action: []
                      fi_kw: <Id.KW_Fi fi>
                      redirects: []
                    )
                  ]
                  spids: [254 282]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
          ]
          spids: [154 168]
        )
      ]
      else_action: []
      fi_kw: <Id.KW_Fi fi>
      redirects: []
    )
    (command.Sentence
      child: 
        (command.Simple
          blame_tok: <echo>
          more_env: []
          words: [
            {<echo>}
            {
              (DQ <'    Version is '> ($ Id.VSub_DollarName major) <' '> ($ Id.VSub_DollarName minor) 
                <' '> ($ Id.VSub_DollarName release) <' '> ($ Id.VSub_DollarName extra) <' '> ($ Id.VSub_DollarName date)
              )
            }
          ]
          redirects: [(Redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
          do_fork: T
        )
      terminator: <Id.Op_Semi _>
    )
    (command.Sentence
      child: 
        (command.AndOr
          children: [
            (command.Simple
              blame_tok: <Id.Lit_LBracket '['>
              more_env: []
              words: [
                {<Id.Lit_LBracket '['>}
                {<-n>}
                {(DQ ($ Id.VSub_DollarName extra))}
                {<Id.Lit_RBracket ']'>}
              ]
              redirects: []
              do_fork: T
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'suffix='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'suffix='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'suffix='> name:suffix)
                  op: assign_op.Equal
                  rhs: {(DQ <-> ($ Id.VSub_DollarName extra))}
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'suffix='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'suffix='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'suffix='> name:suffix)
                  op: assign_op.Equal
                  rhs: {(SQ )}
                )
              ]
              redirects: []
            )
          ]
          ops: [<Id.Op_DAmp _> <Id.Op_DPipe _>]
        )
      terminator: <Id.Op_Semi _>
    )
    (command.Simple
      blame_tok: <echo>
      more_env: []
      words: [{<echo>} {(DQ <' -> Regenerating Version.c'>)}]
      redirects: [(Redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
      do_fork: T
    )
    (command.Simple
      blame_tok: <cat>
      more_env: []
      words: [{<cat>}]
      redirects: [
        (Redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.HereDoc
              here_begin: {<END>}
              here_end_tok: <Id.Undefined_Tok ''>
              stdin_parts: [
                <'/* Generated by build-version.sh */\n'>
                <'\n'>
                <'const int CGLVER_Major='>
                ($ Id.VSub_DollarName major)
                <';\n'>
                <'const int CGLVER_Minor='>
                ($ Id.VSub_DollarName minor)
                <';\n'>
                <'const int CGLVER_Release='>
                ($ Id.VSub_DollarName release)
                <';\n'>
                <'const char* CGLVER_Extra='>
                <Id.Right_DoubleQuote '"'>
                ($ Id.VSub_DollarName extra)
                <Id.Right_DoubleQuote '"'>
                <';\n'>
                <'const char* CGLVER_Date='>
                <Id.Right_DoubleQuote '"'>
                ($ Id.VSub_DollarName date)
                <Id.Right_DoubleQuote '"'>
                <';\n'>
                <'const char* CGLVER_String='>
                <Id.Right_DoubleQuote '"'>
                ($ Id.VSub_DollarName major)
                <.>
                ($ Id.VSub_DollarName minor)
                <.>
                ($ Id.VSub_DollarName release)
                ($ Id.VSub_DollarName suffix)
                <Id.Right_DoubleQuote '"'>
                <';\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
  ]
)