fix: add checks and handle errors brew-bump.sh

feat(script): add steps-lib, is_env_var_set & test

feat(brew-bump): add check for VERSION

feat(brew-bump): check HOMEBREW_GITHUB_API_TOKEN

feat(steps-lib): add directory_exists helper fn

fix(brew-bump): check that git clone worked

feat(brew-bump): add check for remote upstream

fix: remove upstream command thing

feat(steps-lib): add file_exists helper function

feat(brew-bump): add check for git-askpass.sh

feat(steps-lib): add is_executable function & test

feat(brew-bump): add check for is_executable

refactor: use GIT_ASKPASS as variable
This commit is contained in:
Joe Previte 2021-09-23 16:08:28 -07:00
parent 8f72481712
commit e5f03e0b06
No known key found for this signature in database
GPG Key ID: 2C91590C6B742C24
3 changed files with 152 additions and 7 deletions

View File

@ -5,6 +5,21 @@ main() {
cd "$(dirname "$0")/../.."
# Only sourcing this so we get access to $VERSION
source ./ci/lib.sh
source ./ci/steps/steps-lib.sh
echo "Checking environment variables"
# We need VERSION to bump the brew formula
if [[ $(is_env_var_set "VERSION") -eq 1 ]]; then
echo "VERSION is not set"
exit 1
fi
# We need HOMEBREW_GITHUB_API_TOKEN to push up commits
if [[ $(is_env_var_set "HOMEBREW_GITHUB_API_TOKEN") -eq 1 ]]; then
echo "HOMEBREW_GITHUB_API_TOKEN is not set"
exit 1
fi
# NOTE: we need to make sure cdrci/homebrew-core
# is up-to-date
@ -13,27 +28,62 @@ main() {
echo "Cloning cdrci/homebrew-core"
git clone https://github.com/cdrci/homebrew-core.git
# Make sure the git clone step is successful
if [[ $(directory_exists "homebrew-core") -eq 1 ]]; then
echo "git clone failed. Cannot find homebrew-core directory."
ls -la
exit 1
fi
echo "Changing into homebrew-core directory"
cd homebrew-core && pwd
echo "Adding Homebrew/homebrew-core as $(upstream)"
echo "Adding Homebrew/homebrew-core"
git remote add upstream https://github.com/Homebrew/homebrew-core.git
# Make sure the git remote step is successful
if ! git config remote.upstream.url > /dev/null; then
echo "git remote add upstream failed."
echo "Could not find upstream in list of remotes."
git remote -v
exit 1
fi
# TODO@jsjoeio - can I somehow check that this succeeded?
echo "Fetching upstream Homebrew/hombrew-core commits"
git fetch upstream
# TODO@jsjoeio - can I somehow check that this succeeded?
echo "Merging in latest Homebrew/homebrew-core changes"
git merge upstream/master
echo "Pushing changes to cdrci/homebrew-core fork on GitHub"
# Source: https://serverfault.com/a/912788
# shellcheck disable=SC2016,SC2028
echo '#!/bin/sh\nexec echo "$HOMEBREW_GITHUB_API_TOKEN"' > "$HOME"/.git-askpass.sh
# Ensure it's executable since we just created it
chmod +x "$HOME/.git-askpass.sh"
# GIT_ASKPASS lets us use the password when pushing without revealing it in the process list
# See: https://serverfault.com/a/912788
GIT_ASKPASS="$HOME/.git-askpass.sh" git push https://cdr-oss@github.com/cdr-oss/homebrew-core.git --all
GIT_ASKPASS="$HOME/git-askpass.sh"
# Source: https://serverfault.com/a/912788
# shellcheck disable=SC2016,SC2028
echo '#!/bin/sh\nexec echo "$HOMEBREW_GITHUB_API_TOKEN"' > "$GIT_ASKPASS"
# Make sure the git-askpass.sh file creation is successful
if [[ $(file_exists "git-askpass.sh") -eq 1 ]]; then
echo "git-askpass.sh not found in $HOME."
ls -la "$HOME"
exit 1
fi
# Ensure it's executable since we just created it
chmod +x "$GIT_ASKPASS"
# Make sure the git-askpass.sh file is executable
if [[ $(is_executable "$GIT_ASKPASS") -eq 1 ]]; then
echo "git-askpass.sh is not executable."
ls -la "$GIT_ASKPASS"
exit 1
fi
git push https://cdr-oss@github.com/cdr-oss/homebrew-core.git --all
# Find the docs for bump-formula-pr here
# https://github.com/Homebrew/brew/blob/master/Library/Homebrew/dev-cmd/bump-formula-pr.rb#L18
@ -50,6 +100,8 @@ main() {
# Clean up and remove homebrew-core
cd ..
rm -rf homebrew-core
# TODO@jsjoeio - check that homebrew-core was removed
}
main "$@"

47
ci/steps/steps-lib.sh Executable file
View File

@ -0,0 +1,47 @@
#!/usr/bin/env bash
# This is a library which contains functions used inside ci/steps
#
# We separated it into it's own file so that we could easily unit test
# these functions and helpers
# Checks whether and environment variable is set.
# Source: https://stackoverflow.com/a/62210688/3015595
is_env_var_set() {
local name="${1:-}"
if test -n "${!name:-}"; then
echo 0
else
echo 1
fi
}
# Checks whether a directory exists.
directory_exists() {
local dir="${1:-}"
if [[ -d "${dir:-}" ]]; then
echo 0
else
echo 1
fi
}
# Checks whether a file exists.
file_exists() {
local file="${1:-}"
if test -f "${file:-}"; then
echo 0
else
echo 1
fi
}
# Checks whether a file is executable.
is_executable() {
local file="${1:-}"
if [ -f "${file}" ] && [ -r "${file}" ] && [ -x "${file}" ]; then
echo 0
else
echo 1
fi
}

View File

@ -0,0 +1,46 @@
#!/usr/bin/env bats
SCRIPT_NAME="steps-lib.sh"
SCRIPT="$BATS_TEST_DIRNAME/../../ci/steps/$SCRIPT_NAME"
source "$SCRIPT"
@test "is_env_var_set should return 1 if env var is not set" {
run is_env_var_set "ASDF_TEST_SET"
[ "$output" = 1 ]
}
@test "is_env_var_set should return 0 if env var is set" {
ASDF_TEST_SET="test" run is_env_var_set "ASDF_TEST_SET"
[ "$output" = 0 ]
}
@test "directory_exists should 1 if directory doesn't exist" {
run directory_exists "/tmp/asdfasdfasdf"
[ "$output" = 1 ]
}
@test "directory_exists should 0 if directory exists" {
run directory_exists "$(pwd)"
[ "$output" = 0 ]
}
@test "file_exists should 1 if file doesn't exist" {
run file_exists "hello-asfd.sh"
[ "$output" = 1 ]
}
@test "file_exists should 0 if file exists" {
run file_exists "$SCRIPT"
[ "$output" = 0 ]
}
@test "is_executable should 1 if file isn't executable" {
run is_executable "hello-asfd.sh"
[ "$output" = 1 ]
}
@test "is_executable should 0 if file is executable" {
run is_executable "$SCRIPT"
[ "$output" = 0 ]
}