8
8
#
9
9
10
10
# By default, no output coloring.
11
- GREEN =" "
12
- BOLD =" "
13
- PLAIN =" "
11
+ green =" "
12
+ bold =" "
13
+ plain =" "
14
14
15
15
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' ) "
19
19
fi
20
20
21
21
_dirsplit ()
@@ -24,6 +24,13 @@ _dirsplit()
24
24
dir=${1% $base }
25
25
}
26
26
27
+ dirname ()
28
+ (
29
+ _dirsplit " $1 "
30
+ dir=${dir%/ }
31
+ echo " ${dir:- .} "
32
+ )
33
+
27
34
_dirsplit " $0 "
28
35
export REDO=$( cd " ${dir:- .} " && echo " $PWD /$base " )
29
36
54
61
55
62
_find_dofile_pwd ()
56
63
{
57
- DOFILE =default.$1 .do
64
+ dofile =default.$1 .do
58
65
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
61
68
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 }
65
72
}
66
73
67
74
68
75
_find_dofile ()
69
76
{
70
- PREFIX =
77
+ local prefix =
71
78
while : ; do
72
79
_find_dofile_pwd " $1 "
73
- [ -e " $DOFILE " ] && break
80
+ [ -e " $dofile " ] && break
74
81
[ " $PWD " = " /" ] && break
75
- TARGET=${PWD##*/ } /$TARGET
76
- PREFIX=${PWD##*/ } /$PREFIX
82
+ target=${PWD##*/ } /$target
83
+ tmp=${PWD##*/ } /$tmp
84
+ prefix=${PWD##*/ } /$prefix
77
85
cd ..
78
86
done
79
- BASE= $PREFIX$BASE
87
+ base= $prefix$base
80
88
}
81
89
82
90
83
91
_run_dofile ()
84
92
{
85
93
export DO_DEPTH=" $DO_DEPTH "
86
- export REDO_TARGET=$PWD /$TARGET
94
+ export REDO_TARGET=$PWD /$target
95
+ local line1
87
96
set -e
88
- read line1 < " $PWD /$DOFILE "
97
+ read line1 < " $PWD /$dofile "
89
98
cmd=${line1# " #!/" }
90
99
if [ " $cmd " != " $line1 " ]; then
91
- /$cmd " $PWD /$DOFILE " " $@ " > " $TARGET .tmp2"
100
+ /$cmd " $PWD /$dofile " " $@ " > " $tmp .tmp2"
92
101
else
93
- . " $PWD /$DOFILE " > " $TARGET .tmp2"
102
+ : ; . " $PWD /$dofile " > " $tmp .tmp2"
94
103
fi
95
104
}
96
105
97
106
98
107
_do ()
99
108
{
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
103
111
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
112
120
return 1
113
121
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
118
127
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
122
131
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"
127
136
else
128
- echo " do $DO_DEPTH$TARGET exists." >&2
137
+ echo " do $DO_DEPTH$target exists." >&2
129
138
fi
130
139
}
131
140
132
141
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
+
133
156
redo ()
134
157
{
135
158
for i in " $@ " ; do
136
159
_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
138
163
done
139
164
}
140
165
0 commit comments