Skip to content

Commit 57e744d

Browse files
committed
./do: use the latest minimal/do from the redo project.
1 parent c13be0b commit 57e744d

File tree

1 file changed

+70
-45
lines changed

1 file changed

+70
-45
lines changed

do

Lines changed: 70 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88
#
99

1010
# By default, no output coloring.
11-
GREEN=""
12-
BOLD=""
13-
PLAIN=""
11+
green=""
12+
bold=""
13+
plain=""
1414

1515
if [ -n "$TERM" -a "$TERM" != "dumb" ] && tty <&2 >/dev/null 2>&1; then
16-
GREEN="$(printf '\033[32m')"
17-
BOLD="$(printf '\033[1m')"
18-
PLAIN="$(printf '\033[m')"
16+
green="$(printf '\033[32m')"
17+
bold="$(printf '\033[1m')"
18+
plain="$(printf '\033[m')"
1919
fi
2020

2121
_dirsplit()
@@ -24,6 +24,13 @@ _dirsplit()
2424
dir=${1%$base}
2525
}
2626

27+
dirname()
28+
(
29+
_dirsplit "$1"
30+
dir=${dir%/}
31+
echo "${dir:-.}"
32+
)
33+
2734
_dirsplit "$0"
2835
export REDO=$(cd "${dir:-.}" && echo "$PWD/$base")
2936

@@ -54,87 +61,105 @@ fi
5461

5562
_find_dofile_pwd()
5663
{
57-
DOFILE=default.$1.do
64+
dofile=default.$1.do
5865
while :; do
59-
DOFILE=default.${DOFILE#default.*.}
60-
[ -e "$DOFILE" -o "$DOFILE" = default.do ] && break
66+
dofile=default.${dofile#default.*.}
67+
[ -e "$dofile" -o "$dofile" = default.do ] && break
6168
done
62-
EXT=${DOFILE#default}
63-
EXT=${EXT%.do}
64-
BASE=${1%$EXT}
69+
ext=${dofile#default}
70+
ext=${ext%.do}
71+
base=${1%$ext}
6572
}
6673

6774

6875
_find_dofile()
6976
{
70-
PREFIX=
77+
local prefix=
7178
while :; do
7279
_find_dofile_pwd "$1"
73-
[ -e "$DOFILE" ] && break
80+
[ -e "$dofile" ] && break
7481
[ "$PWD" = "/" ] && break
75-
TARGET=${PWD##*/}/$TARGET
76-
PREFIX=${PWD##*/}/$PREFIX
82+
target=${PWD##*/}/$target
83+
tmp=${PWD##*/}/$tmp
84+
prefix=${PWD##*/}/$prefix
7785
cd ..
7886
done
79-
BASE=$PREFIX$BASE
87+
base=$prefix$base
8088
}
8189

8290

8391
_run_dofile()
8492
{
8593
export DO_DEPTH="$DO_DEPTH "
86-
export REDO_TARGET=$PWD/$TARGET
94+
export REDO_TARGET=$PWD/$target
95+
local line1
8796
set -e
88-
read line1 <"$PWD/$DOFILE"
97+
read line1 <"$PWD/$dofile"
8998
cmd=${line1#"#!/"}
9099
if [ "$cmd" != "$line1" ]; then
91-
/$cmd "$PWD/$DOFILE" "$@" >"$TARGET.tmp2"
100+
/$cmd "$PWD/$dofile" "$@" >"$tmp.tmp2"
92101
else
93-
. "$PWD/$DOFILE" >"$TARGET.tmp2"
102+
:; . "$PWD/$dofile" >"$tmp.tmp2"
94103
fi
95104
}
96105

97106

98107
_do()
99108
{
100-
DIR=$1
101-
TARGET=$2
102-
if [ ! -e "$TARGET" ] || [ -e "$TARGET/." -a ! -e "$TARGET.did" ]; then
109+
local dir=$1 target=$2 tmp=$3
110+
if [ ! -e "$target" ] || [ -d "$target" -a ! -e "$target.did" ]; then
103111
printf '%sdo %s%s%s%s\n' \
104-
"$GREEN" "$DO_DEPTH" "$BOLD" "$DIR$TARGET" "$PLAIN" >&2
105-
echo "$PWD/$TARGET" >>"$DO_BUILT"
106-
DOFILE=$TARGET.do
107-
BASE=$TARGET
108-
EXT=
109-
[ -e "$TARGET.do" ] || _find_dofile "$TARGET"
110-
if [ ! -e "$DOFILE" ]; then
111-
echo "do: $TARGET: no .do file" >&2
112+
"$green" "$DO_DEPTH" "$bold" "$dir$target" "$plain" >&2
113+
echo "$PWD/$target" >>"$DO_BUILT"
114+
dofile=$target.do
115+
base=$target
116+
ext=
117+
[ -e "$target.do" ] || _find_dofile "$target"
118+
if [ ! -e "$dofile" ]; then
119+
echo "do: $target: no .do file" >&2
112120
return 1
113121
fi
114-
[ ! -e "$DO_BUILD" ] || : >>"$TARGET.did"
115-
( _run_dofile "$BASE" "$EXT" "$TARGET.tmp" )
116-
RV=$?
117-
if [ $RV != 0 ]; then
122+
[ ! -e "$DO_BUILT" ] || [ ! -d "$(dirname "$target")" ] ||
123+
: >>"$target.did"
124+
( _run_dofile "$base" "$ext" "$tmp.tmp" )
125+
rv=$?
126+
if [ $rv != 0 ]; then
118127
printf "do: %s%s\n" "$DO_DEPTH" \
119-
"$DIR$TARGET: got exit code $RV" >&2
120-
rm -f "$TARGET.tmp" "$TARGET.tmp2"
121-
return $RV
128+
"$dir$target: got exit code $rv" >&2
129+
rm -f "$tmp.tmp" "$tmp.tmp2"
130+
return $rv
122131
fi
123-
mv "$TARGET.tmp" "$TARGET" 2>/dev/null ||
124-
! test -s "$TARGET.tmp2" ||
125-
mv "$TARGET.tmp2" "$TARGET" 2>/dev/null
126-
rm -f "$TARGET.tmp2"
132+
mv "$tmp.tmp" "$target" 2>/dev/null ||
133+
! test -s "$tmp.tmp2" ||
134+
mv "$tmp.tmp2" "$target" 2>/dev/null
135+
rm -f "$tmp.tmp2"
127136
else
128-
echo "do $DO_DEPTH$TARGET exists." >&2
137+
echo "do $DO_DEPTH$target exists." >&2
129138
fi
130139
}
131140

132141

142+
# Make corrections for directories that don't actually exist yet.
143+
_dir_shovel()
144+
{
145+
local dir base
146+
xdir=$1 xbase=$2 xbasetmp=$2
147+
while [ ! -d "$xdir" -a -n "$xdir" ]; do
148+
_dirsplit "${xdir%/}"
149+
xbasetmp=${base}__$xbase
150+
xdir=$dir xbase=$base/$xbase
151+
echo "xbasetmp='$xbasetmp'" >&2
152+
done
153+
}
154+
155+
133156
redo()
134157
{
135158
for i in "$@"; do
136159
_dirsplit "$i"
137-
( cd "$dir" && _do "$dir" "$base" ) || return 1
160+
_dir_shovel "$dir" "$base"
161+
dir=$xdir base=$xbase basetmp=$xbasetmp
162+
( cd "$dir" && _do "$dir" "$base" "$basetmp" ) || return 1
138163
done
139164
}
140165

0 commit comments

Comments
 (0)