Skip to content

Instantly share code, notes, and snippets.

@augustohp
Created March 29, 2021 01:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save augustohp/6e11c0b523896f6b4e461af4dcb31129 to your computer and use it in GitHub Desktop.
Save augustohp/6e11c0b523896f6b4e461af4dcb31129 to your computer and use it in GitHub Desktop.
List terraform versions available (from GitHub releases).
#!/bin/bash -e
#
# Lists terraform releasesusing GitHub API.
APP_NAME=$(basename $0)
APP_VERSION="1.0.0"
OPTION_NUMBER_ONLY=""
OPTION_STABLE_ONLY=""
OPTION_ORDER=""
[[ -n "${DEBUG}" ]] && { set -x; }
# Usage: display_help
display_help()
{
cat <<-EOT
Usage: ${APP_NAME}
${APP_NAME} <-h|--help>
${APP_NAME} <-v|--version>
${APP_NAME} [options]
Will output latest terraform releases on GitHub.
Options:
-v | --version Displays script version information.
-h | --help Displays this message.
-n | --number-only Removes "v" prefix from versions.
-s | --stable-only Avoids alpha, beta and release candidates.
-o | --order Numerical order versions, olders first.
Bugs and suggestions can be sent to https://github.com/augustohp.
EOT
}
# Usage: assert_environment
assert_environment()
{
for dependency in curl jq sed
do
command -v "${dependency}" 2>&1 > /dev/null \
|| { echo "Error! Missing dependency ${dependency}." >&2; exit 42; }
done
}
# Usage: list_latest_releases | filter_stable_releases
filter_stable_releases()
{
if [ -n $OPTION_STABLE_ONLY ]
then
grep -v '\-alpha' \
| grep -v '\-beta' \
| grep -v '\-rc'
fi
}
# Usage: list_latest_releases | filter_numbers_only
filter_numbers_only()
{
if [ -n $OPTION_NUMBER_ONLY ]
then
sed 's/^v//'
fi
}
# Usage: list_latest_releases | filter_order
filter_order()
{
if [ -n $OPTION_ORDER ]
then
sort
fi
}
# Usage: list_latest_releases
list_latest_releases()
{
assert_environment
curl \
--silent \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/hashicorp/terraform/releases \
| jq ".[] | .tag_name" \
| sed 's/"//g' \
| filter_numbers_only \
| filter_stable_releases \
| filter_order
}
# Parses options and arguments
while :;
do
# If no argument/option left, stop
if [ $# -eq 0 ]
then
break
fi
# Matches current option/argument, configuring environment
case "$1" in
-h|--help|help)
display_help
exit 1
;;
-v|--version|version)
echo "${APP_NAME} ${APP_VERSION}"
exit 1
;;
-n|--number-only)
OPTION_NUMBER_ONLY=1
;;
-s|--stable-only)
OPTION_STABLE_ONLY=1
;;
-o|--order)
OPTION_ORDER=1
;;
*)
echo "Error! Unrecognized '${1}' as option or argument." >&2
exit 2
;;
esac
# Pop argument list, parses next argument on following iteration
shift
done
list_latest_releases
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment