canvas-lms/script/rebase_canvas_and_plugins.sh

177 lines
4.5 KiB
Bash
Executable File

#!/bin/bash
set -o pipefail
source script/common/utils/common.sh
source script/common/utils/spinner.sh
source script/common/canvas/build_helpers.sh
LOG="$(pwd)/log/rebase_canvas_and_plugins.log"
FAILED_REPOS=()
trap print_results EXIT
trap "printf '\nTerminated\n' && exit 130" SIGINT
usage () {
echo "usage:"
printf " --skip-canvas\t\t\t\tSkip rebasing of canvas repo.\n"
printf " --skip-plugins [<repo>,<repo2>,...]\tSpecify repos to skip, comma separated list.\n"
printf " \t\t\t\t\tOr leave blank to skip all plugins.\n"
printf " -h|--help\t\t\t\tDisplay usage\n\n"
}
die() {
echo "$*" 1>&2
usage
exit 1
}
while :; do
case $1 in
-h|-\?|--help)
usage # Display a usage synopsis.
exit
;;
--skip-canvas)
SKIP_CANVAS=true
;;
--skip-plugins)
if [[ "$2" ]] && [[ "$2" != --* ]]; then
repos=$2
IFS=',' read -r -a skip_repos <<< "$repos"
shift
else
SKIP_PLUGINS=true
fi
;;
?*)
die 'ERROR: Unknown option: ' "$1" >&2
;;
*)
break
esac
shift
done
function rebase_canvas {
start_spinner "Rebasing canvas-lms on HEAD ..."
_canvas_lms_track_with_log git pull --rebase origin master
exit_code=$?
if [ $exit_code -ne 0 ]; then
stop_spinner $exit_code
FAILED_REPOS+=("canvas-lms")
fi
stop_spinner
echo ""
}
function rebase_plugins {
message "Rebasing plugins..."
iterate_plugins rebase_plugin
}
function rebase_plugin {
start_spinner "> Rebasing plugin $1 ..."
_canvas_lms_track_with_log git pull --rebase origin master
exit_code=$?
if [ $exit_code -ne 0 ]; then
stop_spinner $exit_code
FAILED_REPOS+=("$1")
fi
stop_spinner
echo ""
}
function iterate_plugins {
COMMAND=$1
for dir in {gems,vendor}; do
if [ -d "$dir/plugins" ]; then
for plugin in $dir/plugins/*; do
[[ "${skip_repos[*]}" =~ $(basename "$plugin") ]] && continue
pushd "$plugin" > /dev/null
if is_git_dir; then
$COMMAND "$plugin"
fi
popd > /dev/null
done
fi
done
}
# Provide array of repos to stash.
function stash_repos {
repos=$*
for repo in ${repos[*]}; do
if [ "$repo" == "canvas-lms" ]; then
echo_console_and_log "Stashing $repo"
git stash push -m "Stashed as part of rebase_canvas_and_plugins" 2>&1 | tee -a "$LOG"
else
echo_console_and_log "Stashing plugin $repo"
pushd "$repo" > /dev/null && git stash push -m "Stashed as part of rebase_canvas_and_plugins" 2>&1 | tee -a "$LOG"
popd > /dev/null
fi
done
}
function stash_plugin_maybe {
if [ -n "$(git diff --name-only)" ]; then
stash_code+=("$1")
fi
}
function check_for_changes {
stash_code=()
# check for uncommitted tracked changes
if [[ -z "$SKIP_CANVAS" ]] && [ -n "$(git diff --name-only)" ]; then
stash_code+=("canvas-lms")
fi
if [[ -z "$SKIP_PLUGINS" ]]; then
iterate_plugins stash_plugin_maybe
fi
# If uncommitted changes, prompt to stash before running rebase.
if [ ${#stash_code[@]} -gt 0 ]; then
printf -v joined '%s, ' "${stash_code[@]}"
message "You have uncommitted changes in ${joined%, }." | tee -a "$LOG"
prompt " Ok to run \"git stash push -m 'Stashed as part of rebase_canvas_and_plugins'\" for each repo above? [y/n/skip]" run_stash
if [[ ${run_stash:-n} == 'skip' ]]; then
printf "\nSkipping stash, attempting to rebase with uncommitted changes.\n" | tee -a "$LOG" && return
elif [[ ${run_stash:-n} != 'y' ]]; then
printf "\nStash or commit your changes then run this script again.\n" | tee -a "$LOG" && exit
fi
stash_repos "${stash_code[@]}"
else
echo_console_and_log "No uncommitted changes found. \o/"
fi
}
function print_results {
exit_code=$?
stop_spinner $exit_code
set +e
if [ "${#FAILED_REPOS[@]}" -gt 0 ]; then
echo ""
message "Something went wrong. Check ${LOG} for details." | tee -a "$LOG"
for repo in ${FAILED_REPOS[*]}; do
echo_console_and_log " $repo failed to rebase cleanly!"
done
exit 1
elif [ "${exit_code}" == 0 ]; then
# if no stashing, don't print anymore.
[[ ${run_stash:-} == 'n' ]] && exit 1
echo ""
echo_console_and_log "\o/ SUCCESS!"
elif [ "${exit_code}" != 130 ]; then
echo ""
message "Something went wrong. Check ${LOG} for details." | tee -a "$LOG"
fi
exit ${exit_code}
}
ensure_in_canvas_root_directory
create_log_file
init_log_file "Rebase Canvas and Plugins"
check_for_changes
[[ -n "$SKIP_CANVAS" ]] || rebase_canvas
[[ -n "$SKIP_PLUGINS" ]] || rebase_plugins