Advertisement
Guest User

Untitled

a guest
Mar 1st, 2016
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.34 KB | None | 0 0
  1. #
  2. # Invocation:
  3. #
  4. # ftpdep.sh -u username -p password -h remote-host.net -d wwwdir/ -b master
  5. #
  6. # special keys:
  7. # --force : Force full upload instead of diff
  8. # --fake : Don't actually upload anything, just print file list
  9. #
  10.  
  11. set -e
  12.  
  13. BRANCH=master
  14. HASHFILE='.githash'
  15. FORCE=
  16. if [[ " $@ " == *\ --force\ * ]] ; then FORCE="Yes" ; fi
  17. FAKE=
  18. if [[ " $@ " == *\ --fake\ * ]] ; then FAKE="Yes" ; fi
  19. OUTDIROLD="$(mktemp -d)/"
  20. OUTDIRNEW="$(mktemp -d)/"
  21.  
  22. while getopts ":u:p:h:d:b:o:n:f:" opt; do
  23. case $opt in
  24. u) USER="$OPTARG"
  25. ;;
  26. p) PASS="$OPTARG"
  27. ;;
  28. h) REMOTEHOST="$OPTARG"
  29. ;;
  30. d) REMOTEDIR="$OPTARG" # trailing slash!
  31. ;;
  32. b) BRANCH="$OPTARG"
  33. ;;
  34. esac
  35. done
  36.  
  37. require_arg() {
  38. if [[ "$1" == "" ]] ; then
  39. echo $2
  40. exit 1
  41. fi
  42. }
  43. require_slash() {
  44. if [[ "${1: -1}" != "/" ]] ; then
  45. echo "Trailing slash in $2 required"
  46. exit 1
  47. fi
  48. }
  49.  
  50. require_arg "$USER" "FTP user (-u) required"
  51. require_arg "$PASS" "FTP password (-p) required"
  52. require_arg "$REMOTEHOST" "FTP host (-h) required"
  53. if [[ "$REMOTEDIR" != "" ]] ; then require_slash "$REMOTEDIR" "-d" ; fi
  54. require_arg "$BRANCH" "Git branch (-b) required"
  55.  
  56. USER="$USER:$PASS"
  57. unset $PASS
  58.  
  59.  
  60. declare -A OLDFILES
  61. declare -A NEWFILES
  62.  
  63.  
  64. find_files() {
  65. while read -r F ; do
  66. eval "${1}[\"\$F\"]=1"
  67. done <<< "$(cd ${2} ; find . -mindepth 1 -type f | cut -d '/' -f 2-)"
  68. }
  69.  
  70. checkout_old() {
  71. git archive $1 | tar -x -C "$OUTDIROLD"
  72. (
  73. cd "$OUTDIROLD"
  74. python build.py > /dev/null
  75. )
  76. find_files OLDFILES "${OUTDIROLD}output/"
  77. }
  78.  
  79. checkout_new() {
  80. git archive $BRANCH | tar -x -C "$OUTDIRNEW"
  81. (
  82. cd "$OUTDIRNEW"
  83. python build.py > /dev/null
  84. )
  85. find_files NEWFILES "${OUTDIRNEW}output/"
  86. }
  87.  
  88. cleanup_checkouts() {
  89. rm -R "$OUTDIROLD"
  90. rm -R "$OUTDIRNEW"
  91. }
  92.  
  93.  
  94. read_remote_hash() {
  95. curl -s --user $USER "ftp://${REMOTEHOST}/${REMOTEDIR}${HASHFILE}"
  96. }
  97.  
  98. upload_new_hash() {
  99. if [[ "$FAKE" != "" ]] ; then return 0 ; fi
  100. echo "Uploading new hash"
  101. git rev-parse $BRANCH | curl -s --user $USER -T - "ftp://${REMOTEHOST}/${REMOTEDIR}${HASHFILE}"
  102. }
  103.  
  104.  
  105. upload_file() {
  106. echo "Uploading $2 file $1"
  107. if [[ "$FAKE" != "" ]] ; then return 0 ; fi
  108. < "${OUTDIRNEW}output/$1" curl -s --user $USER -T - --ftp-create-dirs "ftp://${REMOTEHOST}/${REMOTEDIR}$1"
  109. }
  110.  
  111. delete_file() {
  112. echo "Deleting file $1"
  113. if [[ "$FAKE" != "" ]] ; then return 0 ; fi
  114. curl -s --user $USER -X "DELE ${REMOTEDIR}$1" "ftp://${REMOTEHOST}/"
  115. }
  116.  
  117. list_all_files() {
  118. for K in "${!NEWFILES[@]}" ; do
  119. echo "$K"
  120. done
  121. }
  122.  
  123. list_new_files() {
  124. for K in "${!NEWFILES[@]}" ; do
  125. [ ${OLDFILES[$K]+abc} ] || echo "$K"
  126. done
  127. }
  128.  
  129. list_removed_files() {
  130. for K in "${!OLDFILES[@]}" ; do
  131. [ ${NEWFILES[$K]+abc} ] || echo "$K"
  132. done
  133. }
  134.  
  135. list_common_files() {
  136. for K in "${!NEWFILES[@]}" ; do
  137. [ ${OLDFILES[$K]+abc} ] && echo "$K"
  138. done
  139. }
  140.  
  141. list_changed_files() {
  142. while read -r F ; do
  143. diff -q "${OUTDIROLD}output/$F" "${OUTDIRNEW}output/$F" > /dev/null 2> /dev/null || echo $F
  144. done <<< "$(list_common_files)"
  145. }
  146.  
  147.  
  148. full_upload() {
  149. while read -r F ; do
  150. if [[ "$F" == "" ]] ; then continue ; fi
  151. upload_file "$F" 'new'
  152. done <<< "$(list_all_files)"
  153. }
  154.  
  155.  
  156. diff_upload() {
  157. #echo 'new files:'
  158. while read -r F ; do
  159. if [[ "$F" == "" ]] ; then continue ; fi
  160. upload_file "$F" 'new'
  161. done <<< "$(list_new_files)"
  162. #echo 'changed files:'
  163. while read -r F ; do
  164. if [[ "$F" == "" ]] ; then continue ; fi
  165. upload_file "$F" 'changed'
  166. done <<< "$(list_changed_files)"
  167. #echo 'removed files:'
  168. while read -r F ; do
  169. if [[ "$F" == "" ]] ; then continue ; fi
  170. delete_file "$F"
  171. done <<< "$(list_removed_files)"
  172. }
  173.  
  174.  
  175. makeall() {
  176. echo -n "Reading last hash... "
  177. LASTCOMMIT=$(read_remote_hash) || LASTCOMMIT=''
  178. echo "$LASTCOMMIT"
  179. if [[ "$LASTCOMMIT" == $(git rev-parse $BRANCH) && "$FORCE" == "" ]] ; then
  180. echo "Already at revision $LASTCOMMIT"
  181. return 0
  182. fi
  183.  
  184. if [[ "$LASTCOMMIT" == "" || "$FORCE" != "" ]] ; then
  185. echo 'Starting full upload'
  186. checkout_new
  187. full_upload
  188. else
  189. echo 'Starting diff upload'
  190. checkout_old "$LASTCOMMIT"
  191. checkout_new
  192. diff_upload
  193. fi
  194. #echo 'RAW DIFF'
  195. #LC_ALL=en_US diff -qr "${OUTDIROLD}output/" "${OUTDIRNEW}output/" || (( $? <= 1 ))
  196. #echo 'CHANGED FILES'
  197. #list_changed_files
  198. #echo 'REMOVED FILES'
  199. #list_removed_files
  200. #echo 'NEW FILES'
  201. #list_new_files
  202. cleanup_checkouts
  203.  
  204. upload_new_hash
  205.  
  206. echo "Successfully finished."
  207. }
  208.  
  209. makeall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement