#!/usr/bin/env sh
PROJECT_NAME="helm-diff"
PROJECT_GH="databus23/$PROJECT_NAME"
export GREP_COLOR="never"
if command -v cygpath >/dev/null 2>&1; then
HELM_BIN="$(cygpath -u "${HELM_BIN}")"
HELM_PLUGIN_DIR="$(cygpath -u "${HELM_PLUGIN_DIR}")"
fi
[ -z "$HELM_BIN" ] && HELM_BIN=$(command -v helm)
[ -z "$HELM_HOME" ] && HELM_HOME=$($HELM_BIN env | grep 'HELM_DATA_HOME' | cut -d '=' -f2 | tr -d '"')
mkdir -p "$HELM_HOME"
: "${HELM_PLUGIN_DIR:="$HELM_HOME/plugins/helm-diff"}"
if [ "$SKIP_BIN_INSTALL" = "1" ]; then
echo "Skipping binary install"
exit
fi
SCRIPT_MODE="install"
if [ "$1" = "-u" ]; then
SCRIPT_MODE="update"
fi
initArch() {
ARCH=$(uname -m)
case $ARCH in
armv5*) ARCH="armv5" ;;
armv6*) ARCH="armv6" ;;
armv7*) ARCH="armv7" ;;
aarch64) ARCH="arm64" ;;
x86) ARCH="386" ;;
x86_64) ARCH="amd64" ;;
i686) ARCH="386" ;;
i386) ARCH="386" ;;
ppc64le) ARCH="ppc64le" ;;
s390x) ARCH="s390x" ;;
esac
}
initOS() {
OS=$(uname -s)
case "$OS" in
Windows_NT) OS='windows' ;;
MSYS*) OS='windows' ;;
MINGW*) OS='windows' ;;
CYGWIN*) OS='windows' ;;
Darwin) OS='macos' ;;
Linux) OS='linux' ;;
esac
}
verifySupported() {
supported="linux-amd64\nlinux-arm64\nlinux-armv6\nlinux-armv7\nlinux-ppc64le\nlinux-s390x\nfreebsd-amd64\nfreebsd-arm64\nmacos-amd64\nmacos-arm64\nwindows-amd64\nwindows-arm64"
if ! echo "${supported}" | grep -q "${OS}-${ARCH}"; then
echo "No prebuild binary for ${OS}-${ARCH}."
exit 1
fi
if [ -z "$HELM_DIFF_BIN_TGZ" ]; then
if ! command -v curl >/dev/null 2>&1 && ! command -v wget >/dev/null 2>&1; then
echo "Either curl or wget is required"
exit 1
fi
fi
}
getDownloadURL() {
if [ -n "$HELM_DIFF_BIN_TGZ" ]; then
return
fi
version=$(git -C "$HELM_PLUGIN_DIR" describe --tags --exact-match 2>/dev/null || :)
if [ "$SCRIPT_MODE" = "install" ] && [ -n "$version" ]; then
DOWNLOAD_URL="https://github.com/$PROJECT_GH/releases/download/$version/helm-diff-$OS-$ARCH.tgz"
else
DOWNLOAD_URL="https://github.com/$PROJECT_GH/releases/latest/download/helm-diff-$OS-$ARCH.tgz"
fi
}
mkTempDir() {
HELM_TMP="$(mktemp -d -t "${PROJECT_NAME}-XXXXXX")"
}
rmTempDir() {
if [ -d "${HELM_TMP:-/tmp/helm-diff-tmp}" ]; then
rm -rf "${HELM_TMP:-/tmp/helm-diff-tmp}"
fi
}
downloadFile() {
PLUGIN_TMP_FILE="${HELM_TMP}/${PROJECT_NAME}.tgz"
if [ -n "$HELM_DIFF_BIN_TGZ" ]; then
echo "Using local package at $HELM_DIFF_BIN_TGZ"
if [ ! -f "$HELM_DIFF_BIN_TGZ" ]; then
echo "Error: file not found at $HELM_DIFF_BIN_TGZ"
exit 1
fi
cp "$HELM_DIFF_BIN_TGZ" "$PLUGIN_TMP_FILE"
return
fi
echo "Downloading $DOWNLOAD_URL"
dl_attempts=5
dl_attempt=1
dl_ok=0
while [ "$dl_attempt" -le "$dl_attempts" ]; do
if command -v curl >/dev/null 2>&1; then
if curl -sSfL "$DOWNLOAD_URL" >"$PLUGIN_TMP_FILE"; then
dl_ok=1
break
fi
elif command -v wget >/dev/null 2>&1; then
if wget -q -O "$PLUGIN_TMP_FILE" "$DOWNLOAD_URL"; then
dl_ok=1
break
fi
else
echo "Either curl or wget is required"
exit 1
fi
echo "Download failed (attempt $dl_attempt/$dl_attempts), retrying in $((dl_attempt * 3))s..."
sleep "$((dl_attempt * 3))"
dl_attempt=$((dl_attempt + 1))
done
if [ "$dl_ok" -ne 1 ]; then
echo "Error: failed to download $DOWNLOAD_URL after $dl_attempts attempts"
exit 1
fi
}
installFile() {
PLUGIN_TMP_FILE="${HELM_TMP}/${PROJECT_NAME}.tgz"
tar xzf "$PLUGIN_TMP_FILE" -C "$HELM_TMP"
HELM_TMP_BIN="$HELM_TMP/diff/bin/diff"
if [ "${OS}" = "windows" ]; then
HELM_TMP_BIN="$HELM_TMP_BIN.exe"
fi
echo "Preparing to install into ${HELM_PLUGIN_DIR}"
mkdir -p "$HELM_PLUGIN_DIR/bin"
cp "$HELM_TMP_BIN" "$HELM_PLUGIN_DIR/bin"
}
exit_trap() {
result=$?
rmTempDir
if [ "$result" != "0" ]; then
echo "Failed to install $PROJECT_NAME"
printf '\tFor support, go to https://github.com/databus23/helm-diff.\n'
fi
exit $result
}
alreadyInstalled() {
[ "$SCRIPT_MODE" = "install" ] || return 1
bin="$HELM_PLUGIN_DIR/bin/diff"
[ "$OS" = "windows" ] && bin="$bin.exe"
[ -x "$bin" ]
}
trap "exit_trap" EXIT
set -e
initArch
initOS
verifySupported
if alreadyInstalled; then
echo "Binary already present at $HELM_PLUGIN_DIR/bin/diff, skipping download"
trap - EXIT
exit 0
fi
getDownloadURL
mkTempDir
downloadFile
installFile