shopt -s extglob [ $(uname) == "Darwin" ] && SED_FLAG='-l' || SED_FLAG='-u' # Syntax sugar. indent() { RE="s/^/ /" sed $SED_FLAG "$RE" } # Clean up pip output cleanup() { sed $SED_FLAG -e 's/\.\.\.\+/.../g' | sed $SED_FLAG '/already satisfied/Id' | sed $SED_FLAG -e '/Overwriting/Id' | sed $SED_FLAG -e '/python executable/Id' | sed $SED_FLAG -e '/no previously-included files/Id' } # Buildpack Steps. function puts-step (){ echo "-----> $@" } # Buildpack Warnings. function puts-warn (){ echo " ! $@" } # Usage: $ set-env key value function set-env (){ echo "export $1=$2" >> $PROFILE_PATH } # Usage: $ set-default-env key value function set-default-env (){ echo "export $1=\${$1:-$2}" >> $PROFILE_PATH } # Usage: $ set-default-env key value function un-set-env (){ echo "unset $1" >> $PROFILE_PATH } # Does some serious copying. deep-cp() { declare source="$1" target="$2" mkdir -p "$target" # cp doesn't like being called without source params, # so make sure they expand to something first. # subshell to avoid surprising caller with shopts. ( shopt -s nullglob dotglob set -- "$source"/!(tmp|.|..) [[ $# == 0 ]] || cp -a "$@" "$target" ) } # Does some serious moving. function deep-mv (){ deep-cp $1 $2 rm -fr $1/!(tmp) find -H $1 -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec rm -fr '{}' \; }