193 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
#!/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
 |