#!/usr/bin/env bash
# [ʞ] up.sh
# ~ lexi hale <lexi@hale.su>
# © CC0
# > ./up.sh [-q: don't display explanatory messages]
# this is a simple script to automate publishing a
# website generated by `tsunami` to github pages. on its
# first run it will ask you for some authentication
# details, initialize a git repository, and store the
# parameters you supply there. on subsequent runs, it
# will push all changes to the repository.
quiet=$1
msg() { echo " [1;3$1m*[;1m" "$2" '[m'; }
die() { ((0 == $1)) || { msg 1 "$3"; exit $2; } }
log() { while read ln; do echo " [34m| [94m$ln[m"; done }
say() { test "$quiet" = "-q" || echo $@; }
ask() {
test "$2" == "" &&
prompt="[1m$1[m:" ||
prompt="[1m$1[m [$2]:"
read -p " - $prompt " $1 || {
echo
msg 1 'user cancelled setup; bailing';
exit 1
}
test "${!1}" = "" && {
test "$2" == "" && {
msg 1 'invalid value supplied; bailing'
exit 2
} || {
read $1 <<< $2
}
}
}
cd out >/dev/null 2>&1; die $? 9 "directory 'out' does not exist"
test ! -e .git && {
# first run, set up a repo
say 'to use the tsunami upload script, you need to specify a'
say 'few parameters. firstly, what is your github username?'
ask username
say 'you also need to specify an email to associate with your'
say 'commits. this WILL be public. you should either use the'
say 'same email that is associated with your github account,'
say 'or a “cloak” email that github has generated for you.'
ask email
say 'up.sh uses oauth to communicate with github. generate an'
say 'access token and paste it in now.'
ask token
say 'what repository do you wish to store your site in? hit'
say 'enter if you want to use your account repo'
ask repo $username.github.io
test -e ../src/CNAME || {
say 'you don’t have a CNAME file in your src/ directory. if'
say 'you want to use your own domain to host this website,'
say 'key it in now; otherwise, just hit enter.'
ask domain .
test "$domain" == "." || {
echo "$domain" > ../src/CNAME
echo "$domain" > CNAME
}
}
msg 6 "initializing $repo.git"
git init 2>&1 | log
die ${PIPESTATUS[0]} 6 "could not initialize repo in out/"
git config --local user.name $username 2>&1 | log
git config --local user.email $email 2>&1 | log
git remote add origin "https://$token:x-oauth-basic@github.com/$username/$repo.git" 2>&1 | log
die ${PIPESTATUS[0]} 7 "could not add remote"
test "$repo" = "$username.github.io" || {
msg 6 "renaming branch “master” → “gh-pages”"
git branch -m master gh-pages 2>&1 | log
die ${PIPESTATUS[0]} 8 "could not rename branch"
}
msg 6 'making initial commit'
} || {
msg 6 'making new commit'
}
git add . 2>&1 | log
die ${PIPESTATUS[0]} 3 "failed to add files"
git commit -a -m "update site" 2>&1 | log
die ${PIPESTATUS[0]} 4 "failed to commit"
git push -u origin master --force 2>&1 | log
die ${PIPESTATUS[0]} 5 "failed to push"