mirror of
https://github.com/xcat2/xcat-core.git
synced 2026-09-04 12:07:56 +00:00
114 lines
2.6 KiB
Bash
Executable File
114 lines
2.6 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
set -eu
|
|
|
|
usage()
|
|
{
|
|
printf 'Usage: %s --check|--write|--stage DIRECTORY\n' "${0##*/}" >&2
|
|
}
|
|
|
|
case ${1-}:$# in
|
|
--check:1|--write:1)
|
|
mode=$1
|
|
;;
|
|
--stage:2)
|
|
mode=$1
|
|
stage_directory=$2
|
|
;;
|
|
*)
|
|
usage
|
|
exit 2
|
|
;;
|
|
esac
|
|
|
|
script_dir=$(CDPATH='' cd "$(dirname "$0")" && pwd -P)
|
|
repo_root=$(CDPATH='' cd "$script_dir/.." && pwd -P)
|
|
status=0
|
|
temp_file=
|
|
|
|
trap 'if [ -n "$temp_file" ]; then rm -f "$temp_file"; fi' 0
|
|
trap 'exit 1' 1 2 3 15
|
|
|
|
has_expected_mode()
|
|
{
|
|
mode_path=$1
|
|
mode_match=$(find "$mode_path" -prune -type f -perm 0644 -print 2>/dev/null)
|
|
[ "$mode_match" = "$mode_path" ]
|
|
}
|
|
|
|
replace_target()
|
|
{
|
|
replace_source=$1
|
|
replace_target=$2
|
|
|
|
if [ -d "$replace_target" ]; then
|
|
printf '%s cannot replace a directory\n' "$replace_target" >&2
|
|
return 1
|
|
fi
|
|
temp_file=$(mktemp "$replace_target.tmp.XXXXXX")
|
|
cp "$replace_source" "$temp_file"
|
|
chmod 0644 "$temp_file"
|
|
mv -f "$temp_file" "$replace_target"
|
|
temp_file=
|
|
}
|
|
|
|
validate_source()
|
|
{
|
|
source_relative=$1
|
|
source_path=$repo_root/$source_relative
|
|
if [ ! -f "$source_path" ] || [ -L "$source_path" ]; then
|
|
printf '%s must be a regular file\n' "$source_relative" >&2
|
|
status=1
|
|
fi
|
|
}
|
|
|
|
sync_pair()
|
|
{
|
|
source_relative=$1
|
|
target_relative=$2
|
|
source_path=$repo_root/$source_relative
|
|
target_path=$repo_root/$target_relative
|
|
|
|
content_matches=0
|
|
if [ -f "$target_path" ] && [ ! -L "$target_path" ] && \
|
|
cmp "$source_path" "$target_path" >/dev/null 2>&1; then
|
|
content_matches=1
|
|
if has_expected_mode "$target_path"; then
|
|
return
|
|
fi
|
|
fi
|
|
|
|
if [ "$mode" = "--check" ]; then
|
|
printf '%s is out of date; run %s --write\n' \
|
|
"$target_relative" "${0##*/}" >&2
|
|
status=1
|
|
return
|
|
fi
|
|
|
|
replace_target "$source_path" "$target_path"
|
|
if [ "$content_matches" -eq 0 ]; then
|
|
printf 'updated %s\n' "$target_relative"
|
|
fi
|
|
}
|
|
|
|
validate_source xCAT/xcat.conf
|
|
validate_source xCAT/xcat.conf.apach24
|
|
if [ "$status" -ne 0 ]; then
|
|
exit "$status"
|
|
fi
|
|
|
|
if [ "$mode" = "--stage" ]; then
|
|
if [ ! -d "$stage_directory" ]; then
|
|
printf '%s is not a directory\n' "$stage_directory" >&2
|
|
exit 1
|
|
fi
|
|
replace_target "$repo_root/xCAT/xcat.conf" "$stage_directory/xcat.conf"
|
|
replace_target "$repo_root/xCAT/xcat.conf.apach24" \
|
|
"$stage_directory/xcat.conf.apach24"
|
|
else
|
|
sync_pair xCAT/xcat.conf xCATsn/xcat.conf
|
|
sync_pair xCAT/xcat.conf.apach24 xCATsn/xcat.conf.apach24
|
|
fi
|
|
|
|
exit "$status"
|