I wanted to copy some files from one directory to another while I am working on my wordpress blog-in-blog plugin. Basically I needed to copy the files checked out from svn, from the working directory, to the root of the web directory on my local machine.
Feature requirements:
- Should only move a file if it has been edited. (we assume that the filesize will have changed by at least 1 byte!)
- Should not just sit there copying all the time.
- Should find out about all files in the specified directory.
- Should report when it updated the file and which file was updated
- First run should copy all files to the destination directory. (assumes I have updated my working copy from svn)
So after several attempts, here is a more polished version which stores the filename and the last size of the file in a ‘bash hash’. OK bash doesn’t have hashes (mores the pity) but reading around on the web I found this post with a comment from Scott Mcdermott which does the job nicely (once I had stripped offending characters from the file names).
So here is the full code of the deployment assistant:
#!/bin/bash # script to deploy code from SOURCEDIR to DELIVERDIR PROJECTNAME="blog-in-blog" SOURCEDIR=blog-in-blog/trunk DELIVERDIR=/var/www/wordpress/wp-content/plugins/blog-in-blog/ FILENAMES=blog-in-blog/trunk/* LASTFILESIZE=0 COUNTER=1 echo "======================================================" echo -e "delivering changes \n\tin \033[1m$SOURCEDIR\033[0m \n\tto \033[1m$DELIVERDIR\033[0m" echo "======================================================" if [ -z $1 ] then echo "usage$ $0 " exit 1 fi hash_insert () { local name=$1 key=$2 val=$3 eval __hash_${name}_${key}=$val } hash_find () { local name=$1 key=$2 local var=__hash_${name}_${key} echo -n ${!var} } while true do for FILE in $FILENAMES do FILESIZE=$(stat -c%s "$FILE") #tidy up file to avoid problems in variable name FILE=`basename $FILE` FILEORIG=$FILE FILE=`echo "$FILE" | sed 's/[\.\_-]//g'` LASTFILESIZE=`hash_find fileHash $FILE` #echo "filesize:"$FILESIZE #echo "lastfilesize:"$LASTFILESIZE if [ "$FILESIZE" != "$LASTFILESIZE" ] then echo "--- $COUNTER ---------------------------------------" date echo -e "deploying \033[1m$FILEORIG\033[0m from project $PROJECTNAME" echo "Size was $LASTFILESIZE bytes, now $FILESIZE bytes." cp $SOURCEDIR/$FILEORIG $DELIVERDIR hash_insert fileHash $FILE $FILESIZE UPDATE=1 elif [ "$UPDATE" -ne "1" ] then UPDATE=0 fi done if [ "$UPDATE" = 1 ] then echo "======================================================" let COUNTER+=1 UPDATE=0 fi sleep $1 done #ends