| #!/usr/bin/env bash |
| set -o errexit |
| |
| copy_contents() { |
| local source="$1" |
| status "Copying contents from $source" |
| if [[ ! "$dryrun" == "1" ]]; then |
| (cd "$source" >/dev/null && tar c .) | tar xv |
| else |
| _ "(cd \"$source\" >/dev/null && tar c .) | tar xv" |
| fi |
| } |
| |
| # Sets git config |
| set_config() { |
| if [ -n "$GIT_NAME" ]; then _ git config user.name "$GIT_NAME"; fi |
| if [ -n "$GIT_EMAIL" ]; then _ git config user.email "$GIT_EMAIL"; fi |
| } |
| |
| # Runs the deployment |
| run() { |
| if [ ! -d "$source" ]; then |
| echo "Source is not a directory: $source" |
| exit 1 |
| fi |
| |
| local tmpdir="$(mktemp -d)" |
| |
| if [[ "$force" == "1" ]]; then |
| _ cd "$tmpdir" |
| _ git init |
| _ git checkout -b "$branch" |
| copy_contents "$source" |
| if [[ "$useenv" == "1" ]]; then set_config; fi |
| _ git add -A . |
| git_commit |
| git_push --force |
| else |
| _ cd "$tmpdir" |
| _ git clone "$repo" . -b "$branch" || ( \ |
| _ git init && \ |
| _ git checkout -b "$branch") |
| if [[ "$keep" == "0" ]]; then _ rm -rf ./*; fi |
| copy_contents "$source" |
| if [[ "$useenv" == "1" ]]; then set_config; fi |
| _ git add -A . |
| git_commit || true |
| git_push |
| fi |
| _ rm -rf "$tmpdir" |
| status_ "Done" |
| } |
| |
| git_commit() { |
| if [ -z "$author" ]; then |
| _ git commit -m "$message" |
| else |
| _ git commit -m "$message" --author "$author" |
| fi |
| } |
| |
| git_push() { |
| if [ -z "$GITHUB_TOKEN" ]; then |
| _ git push "${repo}" "$branch" "$@" |
| else |
| status "Pushing via \$GITHUB_TOKEN $@" |
| _ git push "https://${GITHUB_TOKEN}@github.com/${repospec}.git" "$branch" "$@" \ |
| --quiet >/dev/null 2>&1 || \ |
| ( status_ "Failed to push"; exit 1 ) |
| fi |
| } |
| |
| status() { |
| echo -e "\n\033[34m==>\033[0;1m" "$@\033[0m" |
| } |
| status_() { |
| echo -e "\033[33;1m==>\033[0m" "$@" |
| } |
| |
| _() { |
| echo "" |
| status_ "$@" |
| if [[ ! "$dryrun" == "1" ]]; then "$@"; fi |
| } |
| |
| help() { |
| local cmd="$(basename $0)" |
| echo 'Usage:' |
| echo " $cmd <REPO> <SOURCE>" |
| echo '' |
| echo 'Parameters:' |
| echo " REPO repository to push to in 'user/repo' form" |
| echo " SOURCE path to upload to repository's gh-pages branch" |
| echo '' |
| echo 'Options:' |
| echo ' -h, --help show help screen' |
| echo ' -f, --force force push' |
| echo ' -n, --dry-run run in simulation mode' |
| echo ' -e, --use-env pick up arguments from environment variables' |
| echo ' -b, --branch use this branch name (default: gh-pages)' |
| echo ' -a, --author set the author' |
| echo ' -k, --keep keep existing files in the repo' |
| echo '' |
| echo 'Env var options:' |
| echo ' GITHUB_TOKEN if set, use this to push to the repo' |
| echo '' |
| echo 'Optional env vars:' |
| echo " Run with '-e' to enable the use of these variables." |
| echo " GIT_NAME set this as the repos user.name" |
| echo ' GIT_EMAIL set this as the repos user.email' |
| echo ' GITHUB_REPO substitute as the REPO (1st argument)' |
| echo ' GIT_SOURCE substitute as the SOURCE (2nd argument)' |
| echo ' GIT_BRANCH use this branch name (--branch)' |
| echo '' |
| echo 'Example:' |
| echo " $cmd rstacruz/myproject doc" |
| echo " # pushes './doc' into the gh-pages branch of rstacruz/myproject" |
| echo '' |
| echo " export GITHUB_REPO='xyz/abc'" |
| echo " export GIT_SOURCE='docs'" |
| echo " $cmd -e" |
| echo " # pushes './doc' into the gh-pages branch of xyz/abc" |
| } |
| |
| # |
| # Defaults |
| # |
| |
| force=0 |
| dryrun=0 |
| repospec= |
| source= |
| branch= |
| message="Update" |
| useenv=0 |
| author="" |
| keep=0 |
| |
| # |
| # Parse args |
| # |
| |
| while [[ "$1" =~ ^- && ! "$1" == '--' ]]; do case $1 in |
| -h | --help ) |
| help |
| exit |
| ;; |
| -b | --branch ) |
| shift |
| branch="$1" |
| ;; |
| -n | --dry-run ) |
| dryrun=1 |
| ;; |
| -e | --use-env ) |
| useenv=1 |
| ;; |
| -k | --keep ) |
| keep=1 |
| ;; |
| -a | --author) |
| shift |
| author="$1" |
| ;; |
| -f | --force ) |
| force=1 |
| ;; |
| esac; shift; done |
| if [[ "$1" == '--' ]]; then shift; fi |
| |
| if [[ "$useenv" == "1" ]] && [[ -n "$GIT_BRANCH" ]] && [[ -z "$branch" ]]; then |
| branch="$GIT_BRANCH" |
| fi |
| |
| if [[ "$useenv" == "1" ]] && [[ -n "$GITHUB_REPO" ]] && [[ -n "$GIT_SOURCE" ]] && [[ -z "$2" ]]; then |
| repospec="$GITHUB_REPO" |
| source="$GIT_SOURCE" |
| else |
| repospec="$1" |
| source="$2" |
| fi |
| |
| : ${branch:="gh-pages"} |
| |
| if [ -z "$source" ]; then |
| help |
| exit 1 |
| fi |
| |
| source="`pwd -LP`/$source" |
| repo="https://github.com/${repospec}.git" |
| |
| run |