| #! /bin/sh |
| # Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. |
| # |
| # Licensed under the Apache License 2.0 (the "License"). You may not use |
| # this file except in compliance with the License. You can obtain a copy |
| # in the file LICENSE in the source distribution or at |
| # https://www.openssl.org/source/license.html |
| |
| # This will increase the version number and pre-release tag, according to the |
| # current state of the source tree, and the function's first argument (called |
| # |next| internally), which is how the caller tells what the next step should |
| # be. |
| # |
| # The possible current source tree states are: |
| # '' The source is in a released state. |
| # 'dev' The source is in development. This is the normal state. |
| # 'alpha', 'alphadev' |
| # The source is undergoing a series of alpha releases. |
| # 'beta', 'betadev' |
| # The source is undergoing a series of beta releases. |
| # These states are computed from $PRE_LABEL and $TYPE |
| # |
| # The possible |next| values are: |
| # 'alpha' The source tree should move to an alpha release state, or |
| # stay there. This trips the alpha / pre-release counter. |
| # 'beta' The source tree should move to a beta release state, or |
| # stay there. This trips the beta / pre-release counter. |
| # 'final' The source tree should move to a final release (assuming it's |
| # currently in one of the alpha or beta states). This turns |
| # off the alpha or beta states. |
| # '' The source tree should move to the next release. The exact |
| # meaning depends on the current source state. It may mean |
| # tripping the alpha / beta / pre-release counter, or increasing |
| # the PATCH number. |
| # |
| # 'minor' The source tree should move to the next minor version. This |
| # should only be used in the master branch when a release branch |
| # has been created. |
| # |
| # This function expects there to be a function called fixup_version(), which |
| # SHOULD take the |next| as first argument, and SHOULD increase the label |
| # counter or the PATCH number accordingly, but only when the current |
| # state is "in development". |
| |
| next_release_state () { |
| local next="$1" |
| local today="$(date '+%-d %b %Y')" |
| local retry=true |
| |
| local before="$PRE_LABEL$TYPE" |
| |
| while $retry; do |
| retry=false |
| |
| $DEBUG >&2 "DEBUG[next_release_state]: BEGIN: \$before=$before" |
| $DEBUG >&2 "DEBUG[next_release_state]: BEGIN: \$next=$next" |
| $DEBUG >&2 "DEBUG[next_release_state]: BEGIN: \$MAJOR=$MAJOR" |
| $DEBUG >&2 "DEBUG[next_release_state]: BEGIN: \$MINOR=$MINOR" |
| $DEBUG >&2 "DEBUG[next_release_state]: BEGIN: \$PATCH=$PATCH" |
| $DEBUG >&2 "DEBUG[next_release_state]: BEGIN: \$TYPE=$TYPE" |
| $DEBUG >&2 "DEBUG[next_release_state]: BEGIN: \$PRE_LABEL=$PRE_LABEL" |
| $DEBUG >&2 "DEBUG[next_release_state]: BEGIN: \$PRE_NUM=$PRE_NUM" |
| $DEBUG >&2 "DEBUG[next_release_state]: BEGIN: \$RELEASE_DATE=$RELEASE_DATE" |
| |
| case "$before+$next" in |
| # MAKING ALPHA RELEASES ################################## |
| |
| # Alpha releases can't be made from beta versions or real versions |
| beta*+alpha | +alpha ) |
| echo >&2 "Invalid state for an alpha release" |
| echo >&2 "Try --beta or --final, or perhaps nothing" |
| exit 1 |
| ;; |
| # For alpha releases, the tag update is dev => alpha or |
| # alpha dev => alpha for the release itself, and |
| # alpha => alpha dev for post release. |
| dev+alpha | alphadev+alpha ) |
| TYPE= |
| RELEASE_DATE="$today" |
| fixup_version "alpha" |
| ;; |
| alpha+alpha ) |
| TYPE=dev |
| RELEASE_DATE= |
| fixup_version "alpha" |
| ;; |
| |
| # MAKING BETA RELEASES ################################### |
| |
| # Beta releases can't be made from real versions |
| +beta ) |
| echo >&2 "Invalid state for beta release" |
| echo >&2 "Try --final, or perhaps nothing" |
| exit 1 |
| ;; |
| # For beta releases, the tag update is dev => beta1, or |
| # alpha{n}-dev => beta1 when transitioning from alpha to |
| # beta, or beta{n}-dev => beta{n} for the release itself, |
| # or beta{n} => beta{n+1}-dev for post release. |
| dev+beta | alphadev+beta | betadev+beta ) |
| TYPE= |
| RELEASE_DATE="$today" |
| fixup_version "beta" |
| ;; |
| beta+beta ) |
| TYPE=dev |
| RELEASE_DATE= |
| fixup_version "beta" |
| ;; |
| # It's possible to switch from alpha to beta in the |
| # post release. That's what --next-beta does. |
| alpha+beta ) |
| TYPE=dev |
| RELEASE_DATE= |
| fixup_version "beta" |
| ;; |
| |
| # MAKING FINAL RELEASES ################################## |
| |
| # Final releases can't be made from the main development branch |
| dev+final) |
| echo >&2 "Invalid state for final release" |
| echo >&2 "This should have been preceded by an alpha or a beta release" |
| exit 1 |
| ;; |
| # For final releases, the starting point must be a dev state |
| alphadev+final | betadev+final ) |
| TYPE= |
| RELEASE_DATE="$today" |
| fixup_version "final" |
| ;; |
| # The final step of a final release is to switch back to |
| # development |
| +final ) |
| TYPE=dev |
| RELEASE_DATE= |
| fixup_version "final" |
| ;; |
| |
| # SWITCHING TO THE NEXT MINOR RELEASE #################### |
| |
| *+minor ) |
| TYPE=dev |
| RELEASE_DATE= |
| fixup_version "minor" |
| ;; |
| |
| # MAKING DEFAULT RELEASES ################################ |
| |
| # If we're coming from a non-dev, simply switch to dev. |
| # fixup_version() should trip up the PATCH number. |
| + ) |
| TYPE=dev |
| fixup_version "" |
| ;; |
| |
| # If we're coming from development, switch to non-dev, unless |
| # the PATCH number is zero. If it is, we force the caller to |
| # go through the alpha and beta release process. |
| dev+ ) |
| if [ "$PATCH" = "0" ]; then |
| echo >&2 "Can't update PATCH version number from 0" |
| echo >&2 "Please use --alpha or --beta" |
| exit 1 |
| fi |
| TYPE= |
| RELEASE_DATE="$today" |
| fixup_version "" |
| ;; |
| |
| # If we're currently in alpha, we continue with alpha, as if |
| # the user had specified --alpha |
| alpha*+ ) |
| next=alpha |
| retry=true |
| ;; |
| |
| # If we're currently in beta, we continue with beta, as if |
| # the user had specified --beta |
| beta*+ ) |
| next=beta |
| retry=true |
| ;; |
| |
| *) |
| echo >&2 "Invalid combination of options" |
| exit 1 |
| ;; |
| esac |
| |
| $DEBUG >&2 "DEBUG[next_release_state]: END: \$before=$before" |
| $DEBUG >&2 "DEBUG[next_release_state]: END: \$next=$next" |
| $DEBUG >&2 "DEBUG[next_release_state]: END: \$MAJOR=$MAJOR" |
| $DEBUG >&2 "DEBUG[next_release_state]: END: \$MINOR=$MINOR" |
| $DEBUG >&2 "DEBUG[next_release_state]: END: \$PATCH=$PATCH" |
| $DEBUG >&2 "DEBUG[next_release_state]: END: \$TYPE=$TYPE" |
| $DEBUG >&2 "DEBUG[next_release_state]: END: \$PRE_LABEL=$PRE_LABEL" |
| $DEBUG >&2 "DEBUG[next_release_state]: END: \$PRE_NUM=$PRE_NUM" |
| $DEBUG >&2 "DEBUG[next_release_state]: END: \$RELEASE_DATE=$RELEASE_DATE" |
| done |
| } |