Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #
- # Invocation:
- #
- # ftpdep.sh -u username -p password -h remote-host.net -d wwwdir/ -b master
- #
- # special keys:
- # --force : Force full upload instead of diff
- # --fake : Don't actually upload anything, just print file list
- #
- set -e
- BRANCH=master
- HASHFILE='.githash'
- FORCE=
- if [[ " $@ " == *\ --force\ * ]] ; then FORCE="Yes" ; fi
- FAKE=
- if [[ " $@ " == *\ --fake\ * ]] ; then FAKE="Yes" ; fi
- OUTDIROLD="$(mktemp -d)/"
- OUTDIRNEW="$(mktemp -d)/"
- while getopts ":u:p:h:d:b:o:n:f:" opt; do
- case $opt in
- u) USER="$OPTARG"
- ;;
- p) PASS="$OPTARG"
- ;;
- h) REMOTEHOST="$OPTARG"
- ;;
- d) REMOTEDIR="$OPTARG" # trailing slash!
- ;;
- b) BRANCH="$OPTARG"
- ;;
- esac
- done
- require_arg() {
- if [[ "$1" == "" ]] ; then
- echo $2
- exit 1
- fi
- }
- require_slash() {
- if [[ "${1: -1}" != "/" ]] ; then
- echo "Trailing slash in $2 required"
- exit 1
- fi
- }
- require_arg "$USER" "FTP user (-u) required"
- require_arg "$PASS" "FTP password (-p) required"
- require_arg "$REMOTEHOST" "FTP host (-h) required"
- if [[ "$REMOTEDIR" != "" ]] ; then require_slash "$REMOTEDIR" "-d" ; fi
- require_arg "$BRANCH" "Git branch (-b) required"
- USER="$USER:$PASS"
- unset $PASS
- declare -A OLDFILES
- declare -A NEWFILES
- find_files() {
- while read -r F ; do
- eval "${1}[\"\$F\"]=1"
- done <<< "$(cd ${2} ; find . -mindepth 1 -type f | cut -d '/' -f 2-)"
- }
- checkout_old() {
- git archive $1 | tar -x -C "$OUTDIROLD"
- (
- cd "$OUTDIROLD"
- python build.py > /dev/null
- )
- find_files OLDFILES "${OUTDIROLD}output/"
- }
- checkout_new() {
- git archive $BRANCH | tar -x -C "$OUTDIRNEW"
- (
- cd "$OUTDIRNEW"
- python build.py > /dev/null
- )
- find_files NEWFILES "${OUTDIRNEW}output/"
- }
- cleanup_checkouts() {
- rm -R "$OUTDIROLD"
- rm -R "$OUTDIRNEW"
- }
- read_remote_hash() {
- curl -s --user $USER "ftp://${REMOTEHOST}/${REMOTEDIR}${HASHFILE}"
- }
- upload_new_hash() {
- if [[ "$FAKE" != "" ]] ; then return 0 ; fi
- echo "Uploading new hash"
- git rev-parse $BRANCH | curl -s --user $USER -T - "ftp://${REMOTEHOST}/${REMOTEDIR}${HASHFILE}"
- }
- upload_file() {
- echo "Uploading $2 file $1"
- if [[ "$FAKE" != "" ]] ; then return 0 ; fi
- < "${OUTDIRNEW}output/$1" curl -s --user $USER -T - --ftp-create-dirs "ftp://${REMOTEHOST}/${REMOTEDIR}$1"
- }
- delete_file() {
- echo "Deleting file $1"
- if [[ "$FAKE" != "" ]] ; then return 0 ; fi
- curl -s --user $USER -X "DELE ${REMOTEDIR}$1" "ftp://${REMOTEHOST}/"
- }
- list_all_files() {
- for K in "${!NEWFILES[@]}" ; do
- echo "$K"
- done
- }
- list_new_files() {
- for K in "${!NEWFILES[@]}" ; do
- [ ${OLDFILES[$K]+abc} ] || echo "$K"
- done
- }
- list_removed_files() {
- for K in "${!OLDFILES[@]}" ; do
- [ ${NEWFILES[$K]+abc} ] || echo "$K"
- done
- }
- list_common_files() {
- for K in "${!NEWFILES[@]}" ; do
- [ ${OLDFILES[$K]+abc} ] && echo "$K"
- done
- }
- list_changed_files() {
- while read -r F ; do
- diff -q "${OUTDIROLD}output/$F" "${OUTDIRNEW}output/$F" > /dev/null 2> /dev/null || echo $F
- done <<< "$(list_common_files)"
- }
- full_upload() {
- while read -r F ; do
- if [[ "$F" == "" ]] ; then continue ; fi
- upload_file "$F" 'new'
- done <<< "$(list_all_files)"
- }
- diff_upload() {
- #echo 'new files:'
- while read -r F ; do
- if [[ "$F" == "" ]] ; then continue ; fi
- upload_file "$F" 'new'
- done <<< "$(list_new_files)"
- #echo 'changed files:'
- while read -r F ; do
- if [[ "$F" == "" ]] ; then continue ; fi
- upload_file "$F" 'changed'
- done <<< "$(list_changed_files)"
- #echo 'removed files:'
- while read -r F ; do
- if [[ "$F" == "" ]] ; then continue ; fi
- delete_file "$F"
- done <<< "$(list_removed_files)"
- }
- makeall() {
- echo -n "Reading last hash... "
- LASTCOMMIT=$(read_remote_hash) || LASTCOMMIT=''
- echo "$LASTCOMMIT"
- if [[ "$LASTCOMMIT" == $(git rev-parse $BRANCH) && "$FORCE" == "" ]] ; then
- echo "Already at revision $LASTCOMMIT"
- return 0
- fi
- if [[ "$LASTCOMMIT" == "" || "$FORCE" != "" ]] ; then
- echo 'Starting full upload'
- checkout_new
- full_upload
- else
- echo 'Starting diff upload'
- checkout_old "$LASTCOMMIT"
- checkout_new
- diff_upload
- fi
- #echo 'RAW DIFF'
- #LC_ALL=en_US diff -qr "${OUTDIROLD}output/" "${OUTDIRNEW}output/" || (( $? <= 1 ))
- #echo 'CHANGED FILES'
- #list_changed_files
- #echo 'REMOVED FILES'
- #list_removed_files
- #echo 'NEW FILES'
- #list_new_files
- cleanup_checkouts
- upload_new_hash
- echo "Successfully finished."
- }
- makeall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement