1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/tool/ifchange
2021-01-04 15:54:09 +09:00

119 lines
2.5 KiB
Bash
Executable file
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/sh
# usage: ifchange target temporary
# Used in generating revision.h via Makefiles.
help() {
cat <<HELP
usage: $0 [options] target new-file
options:
--timestamp[=file] touch timestamp file. (default: prefixed with ".time".
under the directory of the target)
--keep[=suffix] keep old file with suffix. (default: '.old')
--empty assume unchanged if the new file is empty.
--color[=always|auto|never] colorize output.
HELP
}
set -e
timestamp=
keepsuffix=
empty=
color=auto
until [ $# -eq 0 ]; do
case "$1" in
--)
shift
break;
;;
--timestamp)
timestamp=.
;;
--timestamp=*)
timestamp=`expr \( "$1" : '[^=]*=\(.*\)' \)`
;;
--keep)
keepsuffix=.old
;;
--keep=*)
keepsuffix=`expr \( "$1" : '[^=]*=\(.*\)' \)`
;;
--empty)
empty=yes
;;
--color)
color=always
;;
--color=*)
color=`expr \( "$1" : '[^=]*=\(.*\)' \)`
;;
--debug)
set -x
;;
--help)
help
exit
;;
--*)
echo "$0: unknown option: $1" 1>&2
exit 1
;;
*)
break
;;
esac
shift
done
if [ "$#" != 2 ]; then
help
exit 1
fi
target="$1"
temp="$2"
if [ "$temp" = - ]; then
temp="tmpdata$$.tmp~"
cat > "$temp"
trap 'rm -f "$temp"' 0
fi
msg_begin= msg_unchanged= msg_updated= msg_reset=
if [ "$color" = always -o \( "$color" = auto -a -t 1 \) ]; then
msg_begin="["
case "`tput smso 2>/dev/null`" in
"$msg_begin"*m)
if [ ${TEST_COLORS:+set} ]; then
msg_unchanged=`expr ":$TEST_COLORS:" : ".*:pass=\([^:]*\):"` || :
msg_updated=`expr ":$TEST_COLORS:" : ".*:fail=\([^:]*\):"` || :
fi
msg_unchanged="${msg_begin}${msg_unchanged:-32}m"
msg_updated="${msg_begin}${msg_updated:-31;1}m"
msg_reset="${msg_begin}m"
;;
esac
unset msg_begin
fi
targetdir=
case "$target" in */*) targetdir=`dirname "$target"`;; esac
if [ -f "$target" -a ! -${empty:+f}${empty:-s} "$temp" ] || cmp "$target" "$temp" >/dev/null 2>&1; then
echo "$target ${msg_unchanged}unchanged${msg_reset}"
rm -f "$temp"
else
echo "$target ${msg_updated}updated${msg_reset}"
[ x"${targetdir}" = x -o -d "${targetdir}" ] || mkdir -p "${targetdir}"
[ x"${keepsuffix}" != x -a -f "$target" ] && mv -f "$target" "${target}${keepsuffix}"
mv -f "$temp" "$target"
fi
if [ -n "${timestamp}" ]; then
if [ x"${timestamp}" = x. ]; then
if [ x"$targetdir" = x ]; then
timestamp=.time."$target"
else
timestamp="$targetdir"/.time.`basename "$target"`
fi
fi
: > "$timestamp"
fi