github.com/moov-io/imagecashletter@v0.10.1/tagged-release.sh (about)

     1  #!/bin/bash
     2  
     3  [ $# -eq 0 ] && { echo "Usage: $0 version_tag"; exit 1; }
     4  
     5  newVersionTag=$1
     6  if ! [[ "$newVersionTag" =~ v[0-9]+\.[0-9]+\.[0-9]+ ]]
     7  then
     8    echo "invalid version tag $newVersionTag"
     9    exit 1
    10  fi
    11  
    12  # make sure this is a new tag
    13  if git show-ref --tags | grep -q "$newVersionTag"; then
    14    echo "$newVersionTag already exists!"
    15    exit
    16  fi
    17  
    18  # aborts if the git command fails
    19  if ! current=$(git describe --tags --abbrev=0); then
    20      exit 1
    21  fi
    22  parts=( $( echo "$current" | grep -o -E '[0-9]+') )
    23  major=${parts[0]}
    24  minor=${parts[1]}
    25  bug=${parts[2]}
    26  
    27  newMajorVersion=v$((major+1)).0.0
    28  newMinorVersion=v$major.$((minor+1)).0
    29  newBugVersion=v$major.$minor.$((bug+1))
    30  
    31  if [[ "$newVersionTag" == "$newMajorVersion" ]]; then
    32    echo "releasing new major version $newVersionTag (currently on $current)"
    33  elif [[ "$newVersionTag" == "$newMinorVersion" ]]; then
    34    echo "releasing new minor version $newVersionTag (currently on $current)"
    35  elif [[ "$newVersionTag" == "$newBugVersion" ]]; then
    36    echo "releasing new bug fix $newVersionTag (currently on $current)"
    37  else
    38    echo cannot increment version from "$current" to "$newVersionTag"
    39    exit 1
    40  fi
    41  
    42  read -p "Do you want to continue? (y/n) " -n 1 -r
    43  echo
    44  if [[ ! $REPLY =~ ^[Yy]$ ]]
    45  then
    46      echo "aborting release"
    47      exit 0
    48  fi
    49  
    50  # releases should be created from master branch
    51  if [ "$(git branch --show-current)" != "master" ]
    52  then
    53      echo "switching to branch 'master'"
    54      git checkout master > /dev/null 2>&1
    55  fi
    56  
    57  # only 2 files should be changed
    58  status=$(git status --porcelain)
    59  if [ "$(echo "$status" | wc -l)" -ne 2 ]
    60  then
    61    echo "Only version.go and CHANGELOG.md should be updated!"
    62    if [ -n "$status" ]
    63    then
    64      printf "Pending changes:\n%s\n" "$status"
    65    fi
    66    exit
    67  elif ! echo "$status" | grep -q "CHANGELOG.md" && ! echo "$status" | grep -q "version.go"
    68  then
    69      echo "version.go and changelog.md must be updated to proceed"
    70      exit
    71  fi
    72  
    73  firstLine=$(head -n 1 CHANGELOG.md)
    74  if ! echo "$firstLine" | grep -q "$newVersionTag"; then
    75    echo "new tag ($newVersionTag) doesn't match CHANGELOG ($firstLine)"
    76    exit
    77  fi
    78  
    79  expectedHeader=$(printf "## $newVersionTag (Released %s)" "$(date +"%Y-%m-%d")")
    80  if [ "$firstLine" != "$expectedHeader" ]
    81  then
    82    echo "Did you update the CHANGELOG's header? Expected \"$expectedHeader\", found \"$firstLine\""
    83    exit
    84  fi
    85  
    86  git add CHANGELOG.md version.go
    87  git commit -m "release $newVersionTag"
    88  git tag "$newVersionTag"
    89  git push origin master
    90  git push origin "$newVersionTag"