##
## 0 -- original stdin (never touched)
## 1, 2 -- stdout, stderr, redirected to 3 while running comamnds
-## 3 -- original stderr (verbose), or logfile (quiet); captures command
-## output
-## 4 -- null (verbose), or logfile (quiet); primary diagnostic output
-## 5 -- orginal stderr; secondary diagnostic output (with colours)
-
-exec 3>&2 4>/dev/null 5>&2
+## log -- logfile and original stderr (verbose), or logfile only (quiet);
+## captures command output
+## diag -- logfile; primary diagnostic output
+## term -- orginal stderr; secondary diagnostic output (with colours)
notify () {
colour=$1 message=$2
- echo $message >&4
- echo "$(tput bold; tput setaf $colour)$message$(tput sgr0; tput op)" >&5
+ echo $message >&$diag
+ echo "$(tput bold; tput setaf $colour)$message$(tput sgr0; tput op)" >&$term
}
fail () {
runx () {
notify 2 "+++ $*"
- "$@" 2>&3 3>&- 4>&- 5>&- || fail "$1: exit $?"
+ nice "$@" 2>&$log {log}>&- {diag}>&- {term}>&- || fail "$1: exit $?"
}
-run () { runx "$@" >&3; }
+run () { runx "$@" >&$log; }
yesno () {
- echo -n "(test $*)" >&4
- if "$@" >&4 2>&4 3>&- 4>&- 5>&-; then
- echo "(yes)" >&4
+ echo -n "(test $*)" >&$diag
+ if "$@" >&$diag 2>&$diag {log}>&- {diag}>&- {term}>&-; then
+ echo "(yes)" >&$diag
echo yes
else
- echo "(no)" >&4
+ echo "(no)" >&$diag
echo no
fi
}
esac
cd ..
done
-assign toppath $(pwd)
-assign srcpath $toppath
+toppath=$(pwd)
## Build any necessary qualifiers.
qual= sep=.
esac
## Construct the output directory.
-assign releasepath $srcpath/dist-$build$qual
+releasepath=$toppath/dist-$build$qual
chmod -R +w $releasepath 2>/dev/null || :
rm -rf $releasepath 2>/dev/null || :
mkdir $releasepath
+logfile=$releasepath/mdw-build.log
+exec {term}>&2
+exec {diag}>>$logfile || fail "Failed to create log."
case $verbose in
- no)
- exec 4>$releasepath/mdw-build.log 3>&4 ||
- fail "Failed to create log."
- ;;
+ no) exec {log}>&$diag ;;
+ yes) exec {log}> >(tee -a $logfile >&$term {term}>&- {diag}>&-) ;;
esac
+## Repeat the earlier assignments for tbe benefit of the logfile.
+assign toppath $toppath
+assign releasepath $releasepath
+assign logfile $logfile
+
## Do we have a Git repository?
-case "$checkout,$setup,$(yesno [ -d $srcpath/.git ])" in
+case "$checkout,$setup,$(yesno [ -d $toppath/.git ])" in
yes,no,*)
fail "Inconsistent options: can't check out without setup."
;;
checkout=no gitver=none
;;
yes,yes,yes)
- cd $srcpath
+ cd $toppath
[ "$(git ls-files -m)" = "" ] ||
warn "working tree has uncommitted changes"
;;
esac
## Is there Debian build equipment?
-case "$debian,$(yesno [ -d $srcpath/debian ])" in
+case "$debian,$(yesno [ -d $toppath/debian ])" in
yes,no)
info "No debian directory found."
debian=no debver=none
case "$checkout" in
yes)
cd $releasepath
- run git clone -sn $srcpath/.git _source
+ run git clone -sn $toppath/.git _source
assign srcpath $releasepath/_source
cd $srcpath
run git update-ref refs/heads/mdw-build $checkoutrev ""
run git checkout-index -afu
assign gitversion "$(git describe --abbrev=4)"
;;
+ no)
+ assign srcpath $toppath
+ ;;
esac
## Check the version number.
cat >find-distdir.mk <<'EOF'
include Makefile
print-distdir:
- @echo >&3 $(distdir)
+ @echo >&$(fd) $(distdir)
EOF
assign distdir \
- $({ $make -f find-distdir.mk print-distdir >/dev/null 2>&1; } 3>&1)
+ $({ $make -f find-distdir.mk print-distdir fd=$t >/dev/null 2>&1; } {t}>&1)
## Get a tarball distribution.
case "$distcheck" in