#!/bin/bash # Load helper functions source "$( # The following is done because: # # * `readlink` on OS X outputs a relative path # * `misc.sh` is not publicly exposed # cd "$(dirname "${BASH_SOURCE[0]}")"; cd "$(dirname "$(readlink "${BASH_SOURCE[0]}")")"; pwd )/util/misc.sh" declare repository_url="" # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - commit_and_push_changes() { # Commit and push changes upstream, and # overwrite the content from the specified branch git config --global user.email "$GH_USER_EMAIL" \ && git config --global user.name "$GH_USER_NAME" \ && git init \ && git add -A \ && git commit --message "$2" \ && ( # If the distribution branch is `master`, # there is no need to switch as that is the default if [ "$1" != "master" ]; then git checkout --quiet -b "$1" fi ) \ && git push --quiet --force "$repository_url" "$1" } print_help_message() { cat < Specifies the commands that will be executed before everything else. -d, --directory Specifies the name of the distribution/build directory. --distribution-branch Specifies the name of the branch on which the content resulting from running the commands will be moved on. -m, --commit-message Specifies the commit message. --source-branch Specifies the name of the branch on which the commands are run on. EOF } remove_unneeded_files() { local tmpDir="" # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # If a directory was not specified, move to the next steps [ -z "$1" ] \ && return 0 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # If something other than a directory was specified, print an error if [ ! -d "$1" ]; then print_error "\"$1\" is not a directory" return 1 fi # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Otherwise, remove the unneeded files and move the content # from within the specified directory in the root of the project tmpDir="$(mktemp -u /tmp/XXXXX)" \ && cp -r "$1" "$tmpDir" \ && find . -delete \ && shopt -s dotglob \ && cp -r "$tmpDir"/* . \ && shopt -u dotglob } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - main() { local commands="" local commitMessage="" local directory="" local distributionBranch="" local sourceBranch="" # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - while :; do case $1 in -h|--help) print_help_message exit ;; -c|--commands) if [ "$2" ]; then commands="$2" shift 2 continue else print_error "ERROR: A non-empty \"-c/--commands \" argument needs to be specified" exit 1 fi ;; -d|--directory) if [ "$2" ]; then directory="$2" shift 2 continue else print_error "ERROR: A non-empty \"-d/--directory \" argument needs to be specified" exit 1 fi ;; --distribution-branch) if [ "$2" ]; then distributionBranch="$2" shift 2 continue else print_error "ERROR: A non-empty \"-db/--distribution-branch \" argument needs to be specified" exit 1 fi ;; -m|--commit-message) if [ "$2" ]; then commitMessage="$2" shift 2 continue else echo "ERROR: A non-empty \"-m/--commit-message \" argument needs to be specified" >&2 exit 1 fi ;; --source-branch) if [ "$2" ]; then sourceBranch="$2" shift 2 continue else echo "ERROR: A non-empty \"-sb/--source-branch \" argument needs to be specified" >&2 exit 1 fi ;; -?*) printf "WARNING: Unknown option (ignored): %s\n" "$1" >&2;; *) break esac shift done # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Check if all the required options are provided ( check_if_arg_is_provided "$commands" "-c/--commands " check_if_arg_is_provided "$commitMessage" "-m/--commit-message " check_if_arg_is_provided "$distributionBranch" "--distribution-branch " check_if_arg_is_provided "$sourceBranch" "--source-branch " ) \ || exit 1 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Only execute the following if the commit # was made to the specified source branch if [ "$TRAVIS_BRANCH" == "$sourceBranch" ] && \ [ "$TRAVIS_PULL_REQUEST" == "false" ]; then repository_url="$(get_repository_url)" execute "$commands" \ &> >(print_error_stream) \ 1> /dev/null print_result $? "Update content" \ || exit 1 remove_unneeded_files "$directory" \ &> >(print_error_stream) \ 1> /dev/null print_result $? "Remove unneeded content" \ || exit 1 commit_and_push_changes "$distributionBranch" "$commitMessage" \ &> >(print_error_stream) \ 1> /dev/null print_result $? "Commit and push changes" fi } main "$@" \ &> >(remove_sensitive_information "$GH_USER_EMAIL" "$GH_USER_NAME")