--- a/bin/update Tue Mar 20 12:43:51 2012 +0200
+++ b/bin/update Tue Mar 20 12:55:31 2012 +0200
@@ -43,7 +43,9 @@
LOG_WARN=y
LOG=y
-LOG_INFO=y
+LOG_FORCE=y
+LOG_UPDATE=y
+LOG_NOOP=y
LOG_SKIP=
LOG_DEBUG=
LOG_CMD=
@@ -51,7 +53,10 @@
UPDATE_FORCE=
UPDATE_NOOP=
UPDATE_DIFF=
-SERIAL_NOUPDATE=
+
+SERIAL_NOOP=
+SERIAL_FORCE=
+
COMMIT_SKIP=
COMMIT_FORCE=
COMMIT_MSG=' '
@@ -78,6 +83,7 @@
-p show changes
-F force-updates without checking src mtime
-S do not update serial
+ -s update serials
-n no-op/mock-update; don't actually change anything; implies -SpC
Commit
@@ -90,7 +96,7 @@
function parse_args {
OPTIND=1
- while getopts 'hd:qvDVpFSnCcm:' opt "$@"; do
+ while getopts 'hd:qvDVpFSsnCcm:' opt "$@"; do
case $opt in
h)
help_args $0
@@ -102,6 +108,9 @@
q)
LOG=
LOG_WARN=
+ LOG_UPDATE=
+ LOG_FORCE=
+ LOG_NOOP=
;;
v) LOG_SKIP=y ;;
@@ -111,9 +120,10 @@
;;
V) LOG_CMD=y ;;
- p) UPDATE_DIFF=y ;;
- F) UPDATE_FORCE=y ;;
- S) SERIAL_NOUPDATE=y ;;
+ p) UPDATE_DIFF=y ;;
+ F) UPDATE_FORCE=y ;;
+ S) SERIAL_NOOP=y ;;
+ s) SERIAL_FORCE=y ;;
n)
UPDATE_NOOP=y
@@ -163,8 +173,16 @@
[ $LOG ] && log_msg "$*" || true
}
-function log_info {
- [ $LOG_INFO ] && log_color '36' " $*" || true
+function log_force {
+ [ $LOG_FORCE ] && log_color '2;33' " $*" || true
+}
+
+function log_update {
+ [ $LOG_UPDATE ] && log_color '36' " $*" || true
+}
+
+function log_noop {
+ [ $LOG_NOOP ] && log_color '2;34' " $*" || true
}
function log_skip {
@@ -219,14 +237,6 @@
"$@" || die "Failed"
}
-function run_cmd {
- local msg=$1; shift
-
- log_info "$msg... "
-
- cmd "$@"
-}
-
function indent () {
local indent=$1; shift
@@ -288,6 +298,11 @@
## functions
+
+## Dependency-based updates
+# Compare the given output file with all given source files.
+#
+# Returns true if the output file needs to be updated.
function check_update {
# target
local dst=$1; shift
@@ -361,38 +376,7 @@
fi
}
-function update {
- local dst=$1; shift;
- local msg=$1; shift
-
- local sep=
- local dep=()
- local cmd=()
-
- for arg in "$@"; do
- if [ $arg == '--' ]; then
- sep=y
- fi
-
- if [ $sep ]; then
- cmd=("${cmd[@]:-}" "$arg")
- else
- dep=("${dep[@]:-}" "$arg")
- fi
- done
-
- [ ! $sep ] && fail "Invalid args given: $@"
-
- if check_update $dst "${dep[@]}"; then
- log_info "$msg..."
-
- do_update $dst "${cmd[@]}"
- else
- log_skip "$msg: not changed"
-
- fi
-}
-
+# links
function check_link {
local lnk=$1
local tgt=$2
@@ -414,7 +398,7 @@
local base=$2
if check_update $zone $base; then
- log_info "Copying hosts $zone <- $base..."
+ log_update "Copying hosts $zone <- $base..."
do_update $zone \
cat $ROOT/$base
@@ -429,7 +413,7 @@
local base=$1; shift
if check_update $zone $base; then
- log_info "Generating hosts $zone <- $base..."
+ log_update "Generating hosts $zone <- $base..."
do_update $zone \
$BIN/process-zone $PROCESS_ARGS $ROOT/$base "$@"
@@ -461,14 +445,19 @@
local serial=$SERIALS/$zone.serial
# test
- if ! check_update $serial "$@"; then
+ if [ $SERIAL_FORCE ]; then
+ log_force "Updating $serial: forced"
+
+ do_update_serial $serial
+
+ elif ! check_update $serial "$@"; then
log_skip "Updating $serial: not changed"
- elif [ $SERIAL_NOUPDATE ]; then
- log_skip "Updating $serial: skipped"
+ elif [ $SERIAL_NOOP ]; then
+ log_noop "Updating $serial: skipped"
else
- log_info "Updating $serial..."
+ log_update "Updating $serial..."
do_update_serial $serial
fi
@@ -482,7 +471,7 @@
local tgt=$SERIALS/$base.serial
if check_link $lnk $tgt; then
- log_info "Linking $lnk -> $tgt..."
+ log_update "Linking $lnk -> $tgt..."
do_link $lnk $tgt
@@ -501,7 +490,7 @@
local src=$DATA/$base
if check_update $out $src; then
- log_info "Copying $out <- $src..."
+ log_update "Copying $out <- $src..."
do_update $out \
cat $ROOT/$src
@@ -522,7 +511,7 @@
local serial=$SERIALS/$base.serial
if check_update $out $src $serial; then
- log_info "Generating $out <- $src..."
+ log_update "Generating $out <- $src..."
do_update $out \
$BIN/expand-zone $ROOT/$src \
@@ -547,7 +536,7 @@
done
if check_link $out $tgt; then
- log_info "Linking $out -> $tgt..."
+ log_update "Linking $out -> $tgt..."
do_link $out $tgt
else
@@ -605,13 +594,13 @@
local repo=$REPO
if hg_modified; then
- log_info "Commit changes in $repo:"
+ log_update "Commit changes in $repo:"
indent " " hg_diff
hg_commit "$COMMIT_MSG"
else
- log_info "Commit changes in $repo: no changes"
+ log_skip "Commit changes in $repo: no changes"
fi
}