70 lines
1.3 KiB
Bash
Executable file
70 lines
1.3 KiB
Bash
Executable file
#!/bin/sh
|
|
#
|
|
# A minimal alternative to djb redo that doesn't support incremental builds.
|
|
# For the full version, visit http://github.com/apenwarr/redo
|
|
#
|
|
export REDO="$(dirname "$0")/$(basename "$0")"
|
|
IFS="
|
|
"
|
|
|
|
if [ -z "$DO_BUILT" ]; then
|
|
export DO_BUILT="$PWD/.do_built"
|
|
if [ -e "$DO_BUILT" ]; then
|
|
echo "Removing previously built files..." >&2
|
|
sort "$DO_BUILT" | uniq | tee "$DO_BUILT.new" | xargs rm -f
|
|
mv "$DO_BUILT.new" "$DO_BUILT"
|
|
fi
|
|
fi
|
|
|
|
|
|
_do()
|
|
{
|
|
DIR="$1"
|
|
TARGET="$2"
|
|
if [ ! -e "$TARGET" ]; then
|
|
printf '\033[32mdo %s\033[1m%s\033[m\n' \
|
|
"$DO_DEPTH" "$DIR$TARGET" >&2
|
|
echo "$PWD/$TARGET" >>"$DO_BUILT"
|
|
dof=".$TARGET"
|
|
DOFILE="$TARGET.do"
|
|
while [ ! -e "$DOFILE" ]; do
|
|
dof2=$(echo "$dof" | sed 's/\.[^\.]*//')
|
|
[ "$dof" = "$dof2" ] && break
|
|
dof="$dof2"
|
|
DOFILE="default$dof.do"
|
|
done
|
|
set "$TARGET" "" "$TARGET.tmp"
|
|
(
|
|
export DO_DEPTH="$DO_DEPTH "
|
|
. "$PWD/$DOFILE" >"$TARGET.tmp"
|
|
) &&
|
|
mv "$TARGET.tmp" "$TARGET"
|
|
else
|
|
echo "do $DO_DEPTH$TARGET exists." >&2
|
|
fi
|
|
}
|
|
|
|
|
|
redo()
|
|
{
|
|
for i in "$@"; do
|
|
if [ -e "$i/." ]; then
|
|
i="$i/all"
|
|
fi
|
|
D="$(dirname "$i")/"
|
|
[ "$D" = "./" ] && D=""
|
|
B="$(basename "$i")"
|
|
( cd "$D" && _do "$D" "$B" )
|
|
done
|
|
}
|
|
|
|
|
|
alias redo-ifchange="redo"
|
|
alias redo-ifcreate=":"
|
|
set -e
|
|
|
|
if [ -n "$*" ]; then
|
|
redo "$@"
|
|
else
|
|
redo all
|
|
fi
|