ci: add install script workflow (#7159)

* ci: add install script workflow

Add GitHub Actions workflow to test install.sh script.

This prevents regressions like the one reported in issue #7133 where
changes to the install script broke the recommended installation method.

The workflow includes:
- shellcheck for script linting (temporarily excludes SC3045)
- Integration test using curl piped to sh as documented on starship.rs

Signed-off-by: cappyzawa <cappyzawa@gmail.com>

* fixup! ci: add install script workflow

Signed-off-by: cappyzawa <cappyzawa@gmail.com>

* fixup! ci: add install script workflow

Signed-off-by: cappyzawa <cappyzawa@gmail.com>

* ci: add shfmt check and format install scripts

Add shfmt job to install-script workflow for consistent shell script
formatting. Apply shfmt to all scripts under install/ directory.

Signed-off-by: cappyzawa <cappyzawa@gmail.com>

---------

Signed-off-by: cappyzawa <cappyzawa@gmail.com>
This commit is contained in:
Shu Kutsuzawa
2025-12-29 05:19:25 +09:00
committed by GitHub
parent 74e13d1e59
commit 6e6664dea6
6 changed files with 482 additions and 433 deletions
+52
View File
@@ -0,0 +1,52 @@
name: Install Script
on:
push:
paths:
- "install/**"
pull_request:
paths:
- "install/**"
jobs:
shellcheck:
name: Shellcheck [Linter]
runs-on: ubuntu-latest
steps:
- name: Setup | Checkout
uses: actions/checkout@v6
- name: Lint | Run shellcheck
run: shellcheck --severity=warning install/**/*.sh
shfmt:
name: Shfmt [Formatter]
runs-on: ubuntu-latest
steps:
- name: Setup | Checkout
uses: actions/checkout@v6
- name: Setup | Install shfmt
run: |
curl -sS https://webi.sh/shfmt | sh
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
- name: Format | Check shfmt
run: shfmt -d install/**/*.sh
test_install_script:
name: Test Install Script
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Setup | Checkout
uses: actions/checkout@v6
- name: Test | Piped execution with curl
run: |
# Test the installation method described at https://starship.rs/
mkdir -p "$HOME/.test-install"
curl -sS "file://$(pwd)/install/install.sh" | sh -s -- --yes --bin-dir "$HOME/.test-install"
"$HOME/.test-install/starship" --version
+350 -353
View File
@@ -21,181 +21,181 @@ SUPPORTED_TARGETS="x86_64-unknown-linux-gnu x86_64-unknown-linux-musl \
x86_64-unknown-freebsd"
info() {
printf '%s\n' "${BOLD}${GREY}>${NO_COLOR} $*"
printf '%s\n' "${BOLD}${GREY}>${NO_COLOR} $*"
}
warn() {
printf '%s\n' "${YELLOW}! $*${NO_COLOR}"
printf '%s\n' "${YELLOW}! $*${NO_COLOR}"
}
error() {
printf '%s\n' "${RED}x $*${NO_COLOR}" >&2
printf '%s\n' "${RED}x $*${NO_COLOR}" >&2
}
completed() {
printf '%s\n' "${GREEN}${NO_COLOR} $*"
printf '%s\n' "${GREEN}${NO_COLOR} $*"
}
has() {
command -v "$1" 1>/dev/null 2>&1
command -v "$1" 1>/dev/null 2>&1
}
curl_is_snap() {
curl_path="$(command -v curl)"
case "$curl_path" in
/snap/*) return 0 ;;
*) return 1 ;;
esac
curl_path="$(command -v curl)"
case "$curl_path" in
/snap/*) return 0 ;;
*) return 1 ;;
esac
}
# Make sure user is not using zsh or non-POSIX-mode bash, which can cause issues
verify_shell_is_posix_or_exit() {
if [ -n "${ZSH_VERSION+x}" ]; then
error "Running installation script with \`zsh\` is known to cause errors."
error "Please use \`sh\` instead."
exit 1
elif [ -n "${BASH_VERSION+x}" ] && [ -z "${POSIXLY_CORRECT+x}" ]; then
error "Running installation script with non-POSIX \`bash\` may cause errors."
error "Please use \`sh\` instead."
exit 1
else
true # No-op: no issues detected
fi
if [ -n "${ZSH_VERSION+x}" ]; then
error "Running installation script with \`zsh\` is known to cause errors."
error "Please use \`sh\` instead."
exit 1
elif [ -n "${BASH_VERSION+x}" ] && [ -z "${POSIXLY_CORRECT+x}" ]; then
error "Running installation script with non-POSIX \`bash\` may cause errors."
error "Please use \`sh\` instead."
exit 1
else
true # No-op: no issues detected
fi
}
get_tmpfile() {
suffix="$1"
if has mktemp; then
printf "%s.%s" "$(mktemp)" "${suffix}"
else
# No really good options here--let's pick a default + hope
printf "/tmp/starship.%s" "${suffix}"
fi
suffix="$1"
if has mktemp; then
printf "%s.%s" "$(mktemp)" "${suffix}"
else
# No really good options here--let's pick a default + hope
printf "/tmp/starship.%s" "${suffix}"
fi
}
# Test if a location is writeable by trying to write to it. Windows does not let
# you test writeability other than by writing: https://stackoverflow.com/q/1999988
test_writeable() {
path="${1:-}/test.txt"
if touch "${path}" 2>/dev/null; then
rm "${path}"
return 0
else
return 1
fi
path="${1:-}/test.txt"
if touch "${path}" 2>/dev/null; then
rm "${path}"
return 0
else
return 1
fi
}
download() {
file="$1"
url="$2"
file="$1"
url="$2"
if has curl && curl_is_snap; then
warn "curl installed through snap cannot download starship."
warn "See https://github.com/starship/starship/issues/5403 for details."
warn "Searching for other HTTP download programs..."
fi
if has curl && curl_is_snap; then
warn "curl installed through snap cannot download starship."
warn "See https://github.com/starship/starship/issues/5403 for details."
warn "Searching for other HTTP download programs..."
fi
if has curl && ! curl_is_snap; then
cmd="curl --fail --silent --location --output $file $url"
elif has wget; then
cmd="wget --quiet --output-document=$file $url"
elif has fetch; then
cmd="fetch --quiet --output=$file $url"
else
error "No HTTP download program (curl, wget, fetch) found, exiting…"
return 1
fi
if has curl && ! curl_is_snap; then
cmd="curl --fail --silent --location --output $file $url"
elif has wget; then
cmd="wget --quiet --output-document=$file $url"
elif has fetch; then
cmd="fetch --quiet --output=$file $url"
else
error "No HTTP download program (curl, wget, fetch) found, exiting…"
return 1
fi
$cmd && return 0 || rc=$?
$cmd && return 0 || rc=$?
error "Command failed (exit code $rc): ${BLUE}${cmd}${NO_COLOR}"
printf "\n" >&2
info "This is likely due to Starship not yet supporting your configuration."
info "If you would like to see a build for your configuration,"
info "please create an issue requesting a build for ${MAGENTA}${TARGET}${NO_COLOR}:"
info "${BOLD}${UNDERLINE}https://github.com/starship/starship/issues/new/${NO_COLOR}"
return $rc
error "Command failed (exit code $rc): ${BLUE}${cmd}${NO_COLOR}"
printf "\n" >&2
info "This is likely due to Starship not yet supporting your configuration."
info "If you would like to see a build for your configuration,"
info "please create an issue requesting a build for ${MAGENTA}${TARGET}${NO_COLOR}:"
info "${BOLD}${UNDERLINE}https://github.com/starship/starship/issues/new/${NO_COLOR}"
return $rc
}
unpack() {
archive=$1
bin_dir=$2
sudo=${3-}
archive=$1
bin_dir=$2
sudo=${3-}
case "$archive" in
*.tar.gz)
flags=$(test -n "${VERBOSE-}" && echo "-xzvof" || echo "-xzof")
${sudo} tar "${flags}" "${archive}" -C "${bin_dir}"
return 0
;;
*.zip)
flags=$(test -z "${VERBOSE-}" && echo "-qqo" || echo "-o")
UNZIP="${flags}" ${sudo} unzip "${archive}" -d "${bin_dir}"
return 0
;;
esac
case "$archive" in
*.tar.gz)
flags=$(test -n "${VERBOSE-}" && echo "-xzvof" || echo "-xzof")
${sudo} tar "${flags}" "${archive}" -C "${bin_dir}"
return 0
;;
*.zip)
flags=$(test -z "${VERBOSE-}" && echo "-qqo" || echo "-o")
UNZIP="${flags}" ${sudo} unzip "${archive}" -d "${bin_dir}"
return 0
;;
esac
error "Unknown package extension."
printf "\n"
info "This almost certainly results from a bug in this script--please file a"
info "bug report at https://github.com/starship/starship/issues"
return 1
error "Unknown package extension."
printf "\n"
info "This almost certainly results from a bug in this script--please file a"
info "bug report at https://github.com/starship/starship/issues"
return 1
}
usage() {
printf "%s\n" \
"install.sh [option]" \
"" \
"Fetch and install the latest version of starship, if starship is already" \
"installed it will be updated to the latest version."
printf "%s\n" \
"install.sh [option]" \
"" \
"Fetch and install the latest version of starship, if starship is already" \
"installed it will be updated to the latest version."
printf "\n%s\n" "Options"
printf "\t%s\n\t\t%s\n\n" \
"-V, --verbose" "Enable verbose output for the installer" \
"-f, -y, --force, --yes" "Skip the confirmation prompt during installation" \
"-p, --platform" "Override the platform identified by the installer [default: ${PLATFORM}]" \
"-b, --bin-dir" "Override the bin installation directory [default: ${BIN_DIR}]" \
"-a, --arch" "Override the architecture identified by the installer [default: ${ARCH}]" \
"-B, --base-url" "Override the base URL used for downloading releases [default: ${BASE_URL}]" \
"-v, --version" "Install a specific version of starship [default: ${VERSION}]" \
"-h, --help" "Display this help message"
printf "\n%s\n" "Options"
printf "\t%s\n\t\t%s\n\n" \
"-V, --verbose" "Enable verbose output for the installer" \
"-f, -y, --force, --yes" "Skip the confirmation prompt during installation" \
"-p, --platform" "Override the platform identified by the installer [default: ${PLATFORM}]" \
"-b, --bin-dir" "Override the bin installation directory [default: ${BIN_DIR}]" \
"-a, --arch" "Override the architecture identified by the installer [default: ${ARCH}]" \
"-B, --base-url" "Override the base URL used for downloading releases [default: ${BASE_URL}]" \
"-v, --version" "Install a specific version of starship [default: ${VERSION}]" \
"-h, --help" "Display this help message"
}
elevate_priv() {
if ! has sudo; then
error 'Could not find the command "sudo", needed to get permissions for install.'
info "If you are on Windows, please run your shell as an administrator, then"
info "rerun this script. Otherwise, please run this script as root, or install"
info "sudo."
exit 1
fi
if ! sudo -v; then
error "Superuser not granted, aborting installation"
exit 1
fi
if ! has sudo; then
error 'Could not find the command "sudo", needed to get permissions for install.'
info "If you are on Windows, please run your shell as an administrator, then"
info "rerun this script. Otherwise, please run this script as root, or install"
info "sudo."
exit 1
fi
if ! sudo -v; then
error "Superuser not granted, aborting installation"
exit 1
fi
}
install() {
ext="$1"
ext="$1"
if test_writeable "${BIN_DIR}"; then
sudo=""
msg="Installing Starship, please wait…"
else
warn "Escalated permissions are required to install to ${BIN_DIR}"
elevate_priv
sudo="sudo"
msg="Installing Starship as root, please wait…"
fi
info "$msg"
if test_writeable "${BIN_DIR}"; then
sudo=""
msg="Installing Starship, please wait…"
else
warn "Escalated permissions are required to install to ${BIN_DIR}"
elevate_priv
sudo="sudo"
msg="Installing Starship as root, please wait…"
fi
info "$msg"
archive=$(get_tmpfile "$ext")
archive=$(get_tmpfile "$ext")
# download to the temp file
download "${archive}" "${URL}"
# download to the temp file
download "${archive}" "${URL}"
# unpack the temp file to the bin dir, using sudo if required
unpack "${archive}" "${BIN_DIR}" "${sudo}"
# unpack the temp file to the bin dir, using sudo if required
unpack "${archive}" "${BIN_DIR}" "${sudo}"
}
# Currently supporting:
@@ -205,20 +205,20 @@ install() {
# - linux_musl (Alpine)
# - freebsd
detect_platform() {
platform="$(uname -s | tr '[:upper:]' '[:lower:]')"
platform="$(uname -s | tr '[:upper:]' '[:lower:]')"
case "${platform}" in
msys_nt*) platform="pc-windows-msvc" ;;
cygwin_nt*) platform="pc-windows-msvc";;
# mingw is Git-Bash
mingw*) platform="pc-windows-msvc" ;;
# use the statically compiled musl bins on linux to avoid linking issues.
linux) platform="unknown-linux-musl" ;;
darwin) platform="apple-darwin" ;;
freebsd) platform="unknown-freebsd" ;;
esac
case "${platform}" in
msys_nt*) platform="pc-windows-msvc" ;;
cygwin_nt*) platform="pc-windows-msvc" ;;
# mingw is Git-Bash
mingw*) platform="pc-windows-msvc" ;;
# use the statically compiled musl bins on linux to avoid linking issues.
linux) platform="unknown-linux-musl" ;;
darwin) platform="apple-darwin" ;;
freebsd) platform="unknown-freebsd" ;;
esac
printf '%s' "${platform}"
printf '%s' "${platform}"
}
# Currently supporting:
@@ -227,203 +227,200 @@ detect_platform() {
# - arm
# - arm64
detect_arch() {
arch="$(uname -m | tr '[:upper:]' '[:lower:]')"
arch="$(uname -m | tr '[:upper:]' '[:lower:]')"
case "${arch}" in
amd64) arch="x86_64" ;;
armv*) arch="arm" ;;
arm64) arch="aarch64" ;;
esac
case "${arch}" in
amd64) arch="x86_64" ;;
armv*) arch="arm" ;;
arm64) arch="aarch64" ;;
esac
# `uname -m` in some cases mis-reports 32-bit OS as 64-bit, so double check
if [ "${arch}" = "x86_64" ] && [ "$(getconf LONG_BIT)" -eq 32 ]; then
arch=i686
elif [ "${arch}" = "aarch64" ] && [ "$(getconf LONG_BIT)" -eq 32 ]; then
arch=arm
fi
# `uname -m` in some cases mis-reports 32-bit OS as 64-bit, so double check
if [ "${arch}" = "x86_64" ] && [ "$(getconf LONG_BIT)" -eq 32 ]; then
arch=i686
elif [ "${arch}" = "aarch64" ] && [ "$(getconf LONG_BIT)" -eq 32 ]; then
arch=arm
fi
printf '%s' "${arch}"
printf '%s' "${arch}"
}
detect_target() {
arch="$1"
platform="$2"
target="$arch-$platform"
arch="$1"
platform="$2"
target="$arch-$platform"
if [ "${target}" = "arm-unknown-linux-musl" ]; then
target="${target}eabihf"
fi
if [ "${target}" = "arm-unknown-linux-musl" ]; then
target="${target}eabihf"
fi
printf '%s' "${target}"
printf '%s' "${target}"
}
confirm() {
if [ -z "${FORCE-}" ]; then
printf "%s " "${MAGENTA}?${NO_COLOR} $* ${BOLD}[y/N]${NO_COLOR}"
set +e
read -r yn </dev/tty
rc=$?
set -e
if [ $rc -ne 0 ]; then
error "Error reading from prompt (please re-run with the '--yes' option)"
exit 1
fi
if [ "$yn" != "y" ] && [ "$yn" != "yes" ]; then
error 'Aborting (please answer "yes" to continue)'
exit 1
fi
fi
if [ -z "${FORCE-}" ]; then
printf "%s " "${MAGENTA}?${NO_COLOR} $* ${BOLD}[y/N]${NO_COLOR}"
set +e
read -r yn </dev/tty
rc=$?
set -e
if [ $rc -ne 0 ]; then
error "Error reading from prompt (please re-run with the '--yes' option)"
exit 1
fi
if [ "$yn" != "y" ] && [ "$yn" != "yes" ]; then
error 'Aborting (please answer "yes" to continue)'
exit 1
fi
fi
}
check_bin_dir() {
bin_dir="${1%/}"
bin_dir="${1%/}"
if [ ! -d "$BIN_DIR" ]; then
error "Installation location $BIN_DIR does not appear to be a directory"
info "Make sure the location exists and is a directory, then try again."
usage
exit 1
fi
if [ ! -d "$BIN_DIR" ]; then
error "Installation location $BIN_DIR does not appear to be a directory"
info "Make sure the location exists and is a directory, then try again."
usage
exit 1
fi
# https://stackoverflow.com/a/11655875
good=$(
IFS=:
for path in $PATH; do
if [ "${path%/}" = "${bin_dir}" ]; then
printf 1
break
fi
done
)
# https://stackoverflow.com/a/11655875
good=$(
IFS=:
for path in $PATH; do
if [ "${path%/}" = "${bin_dir}" ]; then
printf 1
break
fi
done
)
if [ "${good}" != "1" ]; then
warn "Bin directory ${bin_dir} is not in your \$PATH"
fi
if [ "${good}" != "1" ]; then
warn "Bin directory ${bin_dir} is not in your \$PATH"
fi
}
print_install() {
# if the shell does not fit the default case change the config file
# and or the config cmd variable
for s in "bash" "zsh" "ion" "tcsh" "xonsh" "fish"
do
# shellcheck disable=SC2088
# we don't want these '~' expanding
config_file="~/.${s}rc"
config_cmd="eval \"\$(starship init ${s})\""
# if the shell does not fit the default case change the config file
# and or the config cmd variable
for s in "bash" "zsh" "ion" "tcsh" "xonsh" "fish"; do
# shellcheck disable=SC2088
# we don't want these '~' expanding
config_file="~/.${s}rc"
config_cmd="eval \"\$(starship init ${s})\""
case ${s} in
ion )
# shellcheck disable=SC2088
config_file="~/.config/ion/initrc"
config_cmd="eval \$(starship init ${s})"
;;
fish )
# shellcheck disable=SC2088
config_file="~/.config/fish/config.fish"
config_cmd="starship init fish | source"
;;
tcsh )
config_cmd="eval \`starship init ${s}\`"
;;
xonsh )
config_cmd="execx(\$(starship init xonsh))"
;;
esac
case ${s} in
ion)
# shellcheck disable=SC2088
config_file="~/.config/ion/initrc"
config_cmd="eval \$(starship init ${s})"
;;
fish)
# shellcheck disable=SC2088
config_file="~/.config/fish/config.fish"
config_cmd="starship init fish | source"
;;
tcsh)
config_cmd="eval \`starship init ${s}\`"
;;
xonsh)
config_cmd="execx(\$(starship init xonsh))"
;;
esac
printf " %s\n Add the following to the end of %s:\n\n\t%s\n\n" \
"${BOLD}${UNDERLINE}${s}${NO_COLOR}" \
"${BOLD}${config_file}${NO_COLOR}" \
"${config_cmd}"
done
printf " %s\n Add the following to the end of %s:\n\n\t%s\n\n" \
"${BOLD}${UNDERLINE}${s}${NO_COLOR}" \
"${BOLD}${config_file}${NO_COLOR}" \
"${config_cmd}"
done
for s in "elvish" "nushell"
do
for s in "elvish" "nushell"; do
warning="${BOLD}Warning${NO_COLOR}"
case ${s} in
elvish )
# shellcheck disable=SC2088
config_file="~/.config/elvish/rc.elv"
config_cmd="eval (starship init elvish)"
warning="${warning} Only elvish v0.17 or higher is supported."
;;
nushell )
# shellcheck disable=SC2088
config_file="${BOLD}your nu config file${NO_COLOR} (find it by running ${BOLD}\$nu.config-path${NO_COLOR} in Nushell)"
config_cmd="mkdir (\$nu.data-dir | path join \"vendor/autoload\")
warning="${BOLD}Warning${NO_COLOR}"
case ${s} in
elvish)
# shellcheck disable=SC2088
config_file="~/.config/elvish/rc.elv"
config_cmd="eval (starship init elvish)"
warning="${warning} Only elvish v0.17 or higher is supported."
;;
nushell)
# shellcheck disable=SC2088
config_file="${BOLD}your nu config file${NO_COLOR} (find it by running ${BOLD}\$nu.config-path${NO_COLOR} in Nushell)"
config_cmd="mkdir (\$nu.data-dir | path join \"vendor/autoload\")
starship init nu | save -f (\$nu.data-dir | path join \"vendor/autoload/starship.nu\")"
warning="${warning} This will change in the future.
warning="${warning} This will change in the future.
Only Nushell v0.96 or higher is supported."
;;
esac
printf " %s\n %s\n And add the following to the end of %s:\n\n\t%s\n\n" \
"${BOLD}${UNDERLINE}${s}${NO_COLOR}" \
"${warning}" \
"${config_file}" \
"${config_cmd}"
done
;;
esac
printf " %s\n %s\n And add the following to the end of %s:\n\n\t%s\n\n" \
"${BOLD}${UNDERLINE}${s}${NO_COLOR}" \
"${warning}" \
"${config_file}" \
"${config_cmd}"
done
printf " %s\n Add the following to the end of %s:\n %s\n\n\t%s\n\n" \
"${BOLD}${UNDERLINE}PowerShell${NO_COLOR}" \
"${BOLD}Microsoft.PowerShell_profile.ps1${NO_COLOR}" \
"You can check the location of this file by querying the \$PROFILE variable in PowerShell.
printf " %s\n Add the following to the end of %s:\n %s\n\n\t%s\n\n" \
"${BOLD}${UNDERLINE}PowerShell${NO_COLOR}" \
"${BOLD}Microsoft.PowerShell_profile.ps1${NO_COLOR}" \
"You can check the location of this file by querying the \$PROFILE variable in PowerShell.
Typically the path is ~\Documents\PowerShell\Microsoft.PowerShell_profile.ps1 or ~/.config/powershell/Microsoft.PowerShell_profile.ps1 on -Nix." \
"Invoke-Expression (&starship init powershell)"
"Invoke-Expression (&starship init powershell)"
printf " %s\n You need to use Clink (v1.2.30+) with Cmd. Add the following to a file %s and place this file in Clink scripts directory:\n\n\t%s\n\n" \
"${BOLD}${UNDERLINE}Cmd${NO_COLOR}" \
"${BOLD}starship.lua${NO_COLOR}" \
"load(io.popen('starship init cmd'):read(\"*a\"))()"
printf " %s\n You need to use Clink (v1.2.30+) with Cmd. Add the following to a file %s and place this file in Clink scripts directory:\n\n\t%s\n\n" \
"${BOLD}${UNDERLINE}Cmd${NO_COLOR}" \
"${BOLD}starship.lua${NO_COLOR}" \
"load(io.popen('starship init cmd'):read(\"*a\"))()"
printf "\n"
printf "\n"
}
is_build_available() {
arch="$1"
platform="$2"
target="$3"
arch="$1"
platform="$2"
target="$3"
good=$(
IFS=" "
for t in $SUPPORTED_TARGETS; do
if [ "${t}" = "${target}" ]; then
printf 1
break
fi
done
)
good=$(
IFS=" "
for t in $SUPPORTED_TARGETS; do
if [ "${t}" = "${target}" ]; then
printf 1
break
fi
done
)
if [ "${good}" != "1" ]; then
error "${arch} builds for ${platform} are not yet available for Starship"
printf "\n" >&2
info "If you would like to see a build for your configuration,"
info "please create an issue requesting a build for ${MAGENTA}${target}${NO_COLOR}:"
info "${BOLD}${UNDERLINE}https://github.com/starship/starship/issues/new/${NO_COLOR}"
printf "\n"
exit 1
fi
if [ "${good}" != "1" ]; then
error "${arch} builds for ${platform} are not yet available for Starship"
printf "\n" >&2
info "If you would like to see a build for your configuration,"
info "please create an issue requesting a build for ${MAGENTA}${target}${NO_COLOR}:"
info "${BOLD}${UNDERLINE}https://github.com/starship/starship/issues/new/${NO_COLOR}"
printf "\n"
exit 1
fi
}
# defaults
if [ -z "${PLATFORM-}" ]; then
PLATFORM="$(detect_platform)"
PLATFORM="$(detect_platform)"
fi
if [ -z "${BIN_DIR-}" ]; then
BIN_DIR=/usr/local/bin
BIN_DIR=/usr/local/bin
fi
if [ -z "${ARCH-}" ]; then
ARCH="$(detect_arch)"
ARCH="$(detect_arch)"
fi
if [ -z "${BASE_URL-}" ]; then
BASE_URL="https://github.com/starship/starship/releases"
BASE_URL="https://github.com/starship/starship/releases"
fi
if [ -z "${VERSION-}" ]; then
VERSION="latest"
VERSION="latest"
fi
# Non-POSIX shells can break once executing code due to semantic differences
@@ -431,76 +428,76 @@ verify_shell_is_posix_or_exit
# parse argv variables
while [ "$#" -gt 0 ]; do
case "$1" in
-p | --platform)
PLATFORM="$2"
shift 2
;;
-b | --bin-dir)
BIN_DIR="$2"
shift 2
;;
-a | --arch)
ARCH="$2"
shift 2
;;
-B | --base-url)
BASE_URL="$2"
shift 2
;;
-v | --version)
VERSION="$2"
shift 2
;;
case "$1" in
-p | --platform)
PLATFORM="$2"
shift 2
;;
-b | --bin-dir)
BIN_DIR="$2"
shift 2
;;
-a | --arch)
ARCH="$2"
shift 2
;;
-B | --base-url)
BASE_URL="$2"
shift 2
;;
-v | --version)
VERSION="$2"
shift 2
;;
-V | --verbose)
VERBOSE=1
shift 1
;;
-f | -y | --force | --yes)
FORCE=1
shift 1
;;
-h | --help)
usage
exit
;;
-V | --verbose)
VERBOSE=1
shift 1
;;
-f | -y | --force | --yes)
FORCE=1
shift 1
;;
-h | --help)
usage
exit
;;
-p=* | --platform=*)
PLATFORM="${1#*=}"
shift 1
;;
-b=* | --bin-dir=*)
BIN_DIR="${1#*=}"
shift 1
;;
-a=* | --arch=*)
ARCH="${1#*=}"
shift 1
;;
-B=* | --base-url=*)
BASE_URL="${1#*=}"
shift 1
;;
-v=* | --version=*)
VERSION="${1#*=}"
shift 1
;;
-V=* | --verbose=*)
VERBOSE="${1#*=}"
shift 1
;;
-f=* | -y=* | --force=* | --yes=*)
FORCE="${1#*=}"
shift 1
;;
-p=* | --platform=*)
PLATFORM="${1#*=}"
shift 1
;;
-b=* | --bin-dir=*)
BIN_DIR="${1#*=}"
shift 1
;;
-a=* | --arch=*)
ARCH="${1#*=}"
shift 1
;;
-B=* | --base-url=*)
BASE_URL="${1#*=}"
shift 1
;;
-v=* | --version=*)
VERSION="${1#*=}"
shift 1
;;
-V=* | --verbose=*)
VERBOSE="${1#*=}"
shift 1
;;
-f=* | -y=* | --force=* | --yes=*)
FORCE="${1#*=}"
shift 1
;;
*)
error "Unknown option: $1"
usage
exit 1
;;
esac
*)
error "Unknown option: $1"
usage
exit 1
;;
esac
done
TARGET="$(detect_target "${ARCH}" "${PLATFORM}")"
@@ -514,23 +511,23 @@ info "${BOLD}Arch${NO_COLOR}: ${GREEN}${ARCH}${NO_COLOR}"
# non-empty VERBOSE enables verbose untarring
if [ -n "${VERBOSE-}" ]; then
VERBOSE=v
info "${BOLD}Verbose${NO_COLOR}: yes"
VERBOSE=v
info "${BOLD}Verbose${NO_COLOR}: yes"
else
VERBOSE=
VERBOSE=
fi
printf '\n'
EXT=tar.gz
if [ "${PLATFORM}" = "pc-windows-msvc" ]; then
EXT=zip
EXT=zip
fi
if [ "${VERSION}" != "latest" ]; then
URL="${BASE_URL}/download/${VERSION}/starship-${TARGET}.${EXT}"
URL="${BASE_URL}/download/${VERSION}/starship-${TARGET}.${EXT}"
else
URL="${BASE_URL}/latest/download/starship-${TARGET}.${EXT}"
URL="${BASE_URL}/latest/download/starship-${TARGET}.${EXT}"
fi
info "Tarball URL: ${UNDERLINE}${BLUE}${URL}${NO_COLOR}"
+21 -21
View File
@@ -16,48 +16,48 @@ set -euo pipefail
# INSTALLATION_KEY_IDENT=E525359D0B5AE97B7B6F5BB465FEC872C117D681
usage() {
echo "Builds, signs, and notarizes starship."
echo "Read readme.md in the script directory to see the assumptions the script makes."
echo "Usage: $0 <path-to-starship-binary> <path-to-docs-directory> <arch> [pkgname]"
echo " Example: $0 target/release/starship docs/ x64"
echo " Example: $0 target/debug/starship docs/ arm64 starship-1.2.1-arm64.pkg"
echo ""
echo "If no pkgname is provided, the package will be named starship-<version>-<arch>.pkg"
echo "Builds, signs, and notarizes starship."
echo "Read readme.md in the script directory to see the assumptions the script makes."
echo "Usage: $0 <path-to-starship-binary> <path-to-docs-directory> <arch> [pkgname]"
echo " Example: $0 target/release/starship docs/ x64"
echo " Example: $0 target/debug/starship docs/ arm64 starship-1.2.1-arm64.pkg"
echo ""
echo "If no pkgname is provided, the package will be named starship-<version>-<arch>.pkg"
}
script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
source "$script_dir/common.sh"
if [[ -z ${KEYCHAIN_ENTRY+x} ]]; then
error "Environmental variable KEYCHAIN_ENTRY must be set."
error "Environmental variable KEYCHAIN_ENTRY must be set."
fi
if [[ -z ${RUNNER_TEMP+x} ]]; then
error "Environmental variable RUNNER_TEMP must be set."
error "Environmental variable RUNNER_TEMP must be set."
fi
if [[ -z ${KEYCHAIN_FILENAME+x} ]]; then
error "Environmental variable KEYCHAIN_FILENAME must be set."
error "Environmental variable KEYCHAIN_FILENAME must be set."
fi
keychain_path="$RUNNER_TEMP/$KEYCHAIN_FILENAME"
if [[ ! -f "$keychain_path" ]]; then
error "Could not find keychain at $keychain_path"
error "Could not find keychain at $keychain_path"
fi
if [[ -z ${APPLICATION_KEY_IDENT+x} ]]; then
APPLICATION_KEY_IDENT=E03290CABE09E9E42341C8FC82608E91241FAD4A
echo "APPLICATION_KEY_IDENT not set. Using default value of $APPLICATION_KEY_IDENT"
APPLICATION_KEY_IDENT=E03290CABE09E9E42341C8FC82608E91241FAD4A
echo "APPLICATION_KEY_IDENT not set. Using default value of $APPLICATION_KEY_IDENT"
fi
if [[ -z ${INSTALLATION_KEY_IDENT+x} ]]; then
INSTALLATION_KEY_IDENT=E525359D0B5AE97B7B6F5BB465FEC872C117D681
echo "INSTALLATION_KEY_IDENT not set. Using default value of $INSTALLATION_KEY_IDENT"
INSTALLATION_KEY_IDENT=E525359D0B5AE97B7B6F5BB465FEC872C117D681
echo "INSTALLATION_KEY_IDENT not set. Using default value of $INSTALLATION_KEY_IDENT"
fi
if [[ -z ${3+x} ]]; then
usage
exit 1
usage
exit 1
fi
starship_binary="$1"
@@ -66,7 +66,7 @@ arch="$3"
pkgname="${4:-}"
if [[ ! -d "$starship_docs_dir/.vitepress/dist" ]]; then
error "Documentation does not appear to have been built!"
error "Documentation does not appear to have been built!"
fi
echo ">>>> Signing binary"
@@ -74,7 +74,7 @@ codesign --timestamp --keychain "$keychain_path" --sign "$APPLICATION_KEY_IDENT"
# Make ZIP file to notarize binary
if [ "$starship_binary" != "starship" ]; then
cp "$starship_binary" starship
cp "$starship_binary" starship
fi
zip starship.zip starship
@@ -107,8 +107,8 @@ xcrun stapler staple starship.pkg
# Rename to expected name
if [ "$pkgname" = "" ]; then
version="$(starship_version "$starship_binary")"
pkgname="starship-$version-$arch.pkg"
version="$(starship_version "$starship_binary")"
pkgname="starship-$version-$arch.pkg"
fi
echo ">>>> Placing final output at $pkgname"
@@ -9,45 +9,45 @@ set -euo pipefail
# it is being run from within a starship repository if $1 is not provided.
usage() {
echo "Builds a component package for macOS."
echo "Assumes that the following items already exist:"
echo " - A starship binary which has already been notarized"
echo " - Documentation created by \`npm run build\`, usually in a dist"
echo " directory at <repo>/docs/.vitepress/dist"
echo "Usage: $0 <path-to-starship-binary> <path-to-dist-directory>"
echo "Builds a component package for macOS."
echo "Assumes that the following items already exist:"
echo " - A starship binary which has already been notarized"
echo " - Documentation created by \`npm run build\`, usually in a dist"
echo " directory at <repo>/docs/.vitepress/dist"
echo "Usage: $0 <path-to-starship-binary> <path-to-dist-directory>"
}
script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
source "$script_dir/common.sh"
cleanup_server() {
if [[ -n "${server_pid-}" ]]; then
echo "Killing HTTP server ($server_pid) to clean up."
kill "$server_pid"
rm "x86_64-apple-darwin-simple-http-server"
else
echo "No server found, exiting normally."
fi
if [[ -n "${server_pid-}" ]]; then
echo "Killing HTTP server ($server_pid) to clean up."
kill "$server_pid"
rm "x86_64-apple-darwin-simple-http-server"
else
echo "No server found, exiting normally."
fi
}
if [[ "$OSTYPE" != 'darwin'* ]]; then
error "This script only works on MacOS"
error "This script only works on MacOS"
fi
if [[ "${2-undefined}" = "undefined" ]]; then
usage
exit 1
usage
exit 1
fi
starship_program_file="$1"
starship_documentation_dir="$2"
if [ ! -f "$starship_program_file" ]; then
error "Could not find starship binary at $starship_program_file"
error "Could not find starship binary at $starship_program_file"
fi
if [ ! -d "$starship_documentation_dir" ]; then
error "Could not find starship documentation at $starship_documentation_dir"
error "Could not find starship documentation at $starship_documentation_dir"
fi
pkgdir="$(mktemp -d)"
@@ -5,33 +5,33 @@ resources="$2"
arch="$3"
usage() {
echo "Builds a distribution package for macOS."
echo "Assumes that the following items already exist:"
echo " - A starship component package"
echo " - Resources in a pkg_resources directory"
echo "Usage: $0 <path-to-component-package> <path-to-pkg-resources> <arch>"
echo " where arch is one of \"arm64\" or \"x86_64\""
echo "Builds a distribution package for macOS."
echo "Assumes that the following items already exist:"
echo " - A starship component package"
echo " - Resources in a pkg_resources directory"
echo "Usage: $0 <path-to-component-package> <path-to-pkg-resources> <arch>"
echo " where arch is one of \"arm64\" or \"x86_64\""
}
script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
source "$script_dir/common.sh"
if [[ "$OSTYPE" != 'darwin'* ]]; then
error "This script only works on MacOS"
error "This script only works on MacOS"
fi
if [[ "${3-undefined}" = "undefined" ]]; then
usage
exit 1
usage
exit 1
fi
# Generate a distribution file with the appropriate architecture plists
if [[ "$arch" == "x86_64" || "$arch" == "x64" ]]; then
archplist="$script_dir/x86_64.plist"
archplist="$script_dir/x86_64.plist"
elif [[ "$arch" == "arm64" || "$arch" == "aarch64" ]]; then
archplist="$script_dir/aarch64.plist"
archplist="$script_dir/aarch64.plist"
else
error "Invalid architecture: $arch"
error "Invalid architecture: $arch"
fi
productbuild --synthesize --package starship-component.pkg --product "$archplist" starship_raw.dist
@@ -41,13 +41,13 @@ productbuild --synthesize --package starship-component.pkg --product "$archplist
# Solution taken from https://www.theunixschool.com/2012/06/insert-line-before-or-after-pattern.html
while read -r line; do
echo "$line"
if echo "$line" | grep -qF '<installer-gui-script '; then
echo '<welcome file="welcome.html" mime-type="text-html" />'
echo '<license file="license.html" mime-type="text-html" />'
echo '<conclusion file="conclusion.html" mime-type="text-html" />'
echo '<background file="icon.png" scaling="proportional" alignment="bottomleft"/>'
fi
echo "$line"
if echo "$line" | grep -qF '<installer-gui-script '; then
echo '<welcome file="welcome.html" mime-type="text-html" />'
echo '<license file="license.html" mime-type="text-html" />'
echo '<conclusion file="conclusion.html" mime-type="text-html" />'
echo '<background file="icon.png" scaling="proportional" alignment="bottomleft"/>'
fi
done <starship_raw.dist >starship.dist
# The above script does not correctly take care of the last line. Apply fixup.
+22 -22
View File
@@ -1,30 +1,30 @@
#!/bin/bash
error() {
echo "[ERROR]: $1"
exit 1
echo "[ERROR]: $1"
exit 1
}
starship_version() {
starship_program_file="$1"
# Check if this is a relative path: if so, prepend './' to it
if [ "$1" = "${1#/}" ]; then
starship_program_file="./$starship_program_file"
fi
starship_program_file="$1"
# Check if this is a relative path: if so, prepend './' to it
if [ "$1" = "${1#/}" ]; then
starship_program_file="./$starship_program_file"
fi
# Try to get the version from three sources in the following order:
# - the STARSHIP_VERSION envar (usually set by the CI)
# - Running the binary file
# - By cutting out the first version tag in Cargo.toml
# These get increasingly fragile as we go down the list---ideally CI should
# always run with STARSHIP_VERSION set to avoid issues in determining version.
if [ "$STARSHIP_VERSION" != "" ]; then
echo "$STARSHIP_VERSION" | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+'
elif "$starship_program_file" -V >/dev/null 2>&1; then
"$starship_program_file" -V 2> /dev/null | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+'
else
pushd "$(git rev-parse --show-toplevel)" &> /dev/null || true
grep '^version = \"\(.*\)\"' Cargo.toml | head -n 1 | cut -f 2 -d '"' | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+'
popd &> /dev/null || true
fi
# Try to get the version from three sources in the following order:
# - the STARSHIP_VERSION envar (usually set by the CI)
# - Running the binary file
# - By cutting out the first version tag in Cargo.toml
# These get increasingly fragile as we go down the list---ideally CI should
# always run with STARSHIP_VERSION set to avoid issues in determining version.
if [ "$STARSHIP_VERSION" != "" ]; then
echo "$STARSHIP_VERSION" | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+'
elif "$starship_program_file" -V >/dev/null 2>&1; then
"$starship_program_file" -V 2>/dev/null | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+'
else
pushd "$(git rev-parse --show-toplevel)" &>/dev/null || true
grep '^version = \"\(.*\)\"' Cargo.toml | head -n 1 | cut -f 2 -d '"' | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+'
popd &>/dev/null || true
fi
}