Skip to content

Instantly share code, notes, and snippets.

@gsklee
Created October 18, 2011 09:40
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save gsklee/1295052 to your computer and use it in GitHub Desktop.
Save gsklee/1295052 to your computer and use it in GitHub Desktop.
Carefree CoffeeScript Auto-compiler
#!/bin/bash
#
# --------------------------------------------------------------------------------------
# http://blog.gantrithor.com/post/12535461464/carefree-coffeescript-auto-compiler-part-3
# --------------------------------------------------------------------------------------
DIR_ROOT="$(cd "$(dirname "$0")" && pwd)"
function compile_tree() {
find "$1" -name "*.coffee" -type f | while read PATH_COFFEE; do
DIR_JS="$(dirname "${PATH_COFFEE/#$DIR_ROOT\/public\/coffeescripts/$DIR_ROOT/public/javascripts}")"
FILE_JS="$(basename "${PATH_COFFEE/%.coffee/.js}")"
echo "--------------------------------"
echo " $2"
coffee -o "$DIR_JS" -c "$PATH_COFFEE"
echo " $PATH_COFFEE"
echo "==> $DIR_JS/$FILE_JS"
done
}
if [[ "$1" == "--all" ]]; then
compile_tree "$DIR_ROOT/public/coffeescripts" "`date '+%F %T'`"
else
inotifywait -m -r --timefmt '%F %T' --format '%w☀%f☀%e☀%T' -e ATTRIB,MOVE,CLOSE "$DIR_ROOT/public/coffeescripts" | while read LINE; do
IFS=☀ read -a ARRAY <<< "$LINE"
######## Safety Precautions ########
# If ${ARRAY[0]} doesn't contain $DIR_ROOT it means something is seriously fubar'd #
if [[ "${ARRAY[0]#$DIR_ROOT}" == "${ARRAY[0]}" ]]; then
continue
fi
# Do us no good if it's empty anyway #
if [[ "${ARRAY[1]}" == "" ]]; then
continue
fi
######## Safety Precautions ########
EVENT="${ARRAY[2]}"
TIME="${ARRAY[3]}"
if [[ "$EVENT" == *ISDIR* ]]; then
DIR_COFFEE="${ARRAY[0]}${ARRAY[1]}"
DIR_JS="${ARRAY[0]/#$DIR_ROOT\/public\/coffeescripts/$DIR_ROOT/public/javascripts}${ARRAY[1]}"
case "$EVENT" in
# Moving Directories #
*MOVED_TO*)
compile_tree "${ARRAY[0]}${ARRAY[1]}" "$TIME / $EVENT"
;;
# Trashing Directories #
*MOVED_FROM*)
# No `rm -rf` for Safety #
echo "--------------------------------"
echo " $TIME / $EVENT"
find "$DIR_JS" -name "*.js" -type f -delete
echo " X $DIR_JS"
find "$DIR_JS" -type d -depth -empty -exec rmdir "{}" \;
;;
esac
elif [[ "${ARRAY[1]}" == *.coffee ]]; then
DIR_COFFEE="${ARRAY[0]%}"
DIR_JS="${ARRAY[0]/#$DIR_ROOT\/public\/coffeescripts/$DIR_ROOT/public/javascripts}"
FILE_COFFEE="${ARRAY[1]}"
FILE_JS="${ARRAY[1]/%.coffee/.js}"
case "$EVENT" in
# Copying Directories; Copying/Creating/Moving Files #
*ATTRIB*|*CLOSE_WRITE*|*MOVED_TO*)
echo "--------------------------------"
echo " $TIME / $EVENT"
coffee -o "$DIR_JS" -c "$DIR_COFFEE$FILE_COFFEE"
echo " $DIR_COFFEE$FILE_COFFEE"
echo "==> $DIR_JS$FILE_JS"
;;
# Trashing Files #
*MOVED_FROM*)
echo "--------------------------------"
echo " $TIME / $EVENT"
rm "$DIR_JS$FILE_JS"
echo " X $DIR_JS$FILE_JS"
rmdir "$DIR_JS"
;;
esac
else
continue
fi
done
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment