chore: 优化获得文件hash的处理方式
This commit is contained in:
@@ -12,5 +12,5 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- ./:/working_dir/scripts
|
- ./:/working_dir/scripts
|
||||||
- ../patch-dir:/working_dir/patchs
|
- ../patch-dir:/working_dir/patchs
|
||||||
- ../../ftp-src/app:/working_dir/old-shop-src
|
- ../../ftp-src/config:/working_dir/old-shop-src
|
||||||
- ../../src/app:/working_dir/new-shop-src
|
- ../../src/config:/working_dir/new-shop-src
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ HASH_ALGORITHM="sha256" # 哈希算法,用于文件内容比较
|
|||||||
TIME_PRECISION="second" # 时间精度,用于文件时间比较
|
TIME_PRECISION="second" # 时间精度,用于文件时间比较
|
||||||
COMPARE_PERMISSIONS=false # 是否比较文件权限
|
COMPARE_PERMISSIONS=false # 是否比较文件权限
|
||||||
COMPARE_OWNERSHIP=false # 是否比较文件所有者
|
COMPARE_OWNERSHIP=false # 是否比较文件所有者
|
||||||
|
IGNORE_LINE_ENDINGS=true # 是否忽略换行符格式不同时(比如Windows的 \r\n vs Linux的 \n)
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# 增量配置 - 定义是否启用增量补丁
|
# 增量配置 - 定义是否启用增量补丁
|
||||||
@@ -163,9 +164,9 @@ NAMING_PATTERN="patch-{name}-{version}-{timestamp}-{git_commit}.{format}" # 文
|
|||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
|
|
||||||
# 日志配置
|
# 日志配置
|
||||||
LOG_LEVEL="INFO" # 日志级别,DEBUG, INFO, WARN, ERROR
|
LOG_LEVEL="TRACE" # 日志级别,DEBUG, INFO, WARN, ERROR, TRACE; DEBUG 会开启终端调试输出,TRACE 只会开启详细日志输出
|
||||||
LOG_FILE="/var/log/patch_system/patch.log" # 日志文件路径
|
LOG_FILE="/var/log/patch_system/patch.log" # 日志文件路径
|
||||||
LOG_MAX_SIZE="100MB" # 日志文件最大大小
|
LOG_MAX_SIZE="10MB" # 日志文件最大大小
|
||||||
LOG_BACKUP_COUNT=10 # 日志文件备份数量
|
LOG_BACKUP_COUNT=10 # 日志文件备份数量
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ log() {
|
|||||||
"WARN") color="$YELLOW" ;;
|
"WARN") color="$YELLOW" ;;
|
||||||
"ERROR") color="$RED" ;;
|
"ERROR") color="$RED" ;;
|
||||||
"DEBUG") color="$BLUE" ;;
|
"DEBUG") color="$BLUE" ;;
|
||||||
|
"TRACE") color="$PURPLE" ;;
|
||||||
*) color="$NC" ;;
|
*) color="$NC" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
@@ -40,6 +41,9 @@ log() {
|
|||||||
"DEBUG")
|
"DEBUG")
|
||||||
# DEBUG级别:输出所有日志
|
# DEBUG级别:输出所有日志
|
||||||
;;
|
;;
|
||||||
|
"TRACE")
|
||||||
|
# TRACE级别:输出所有日志
|
||||||
|
;;
|
||||||
"INFO")
|
"INFO")
|
||||||
# INFO级别:只输出INFO、WARN和ERROR日志
|
# INFO级别:只输出INFO、WARN和ERROR日志
|
||||||
if [[ "$level" == "DEBUG" ]]; then
|
if [[ "$level" == "DEBUG" ]]; then
|
||||||
@@ -67,10 +71,12 @@ log() {
|
|||||||
echo -e "${color}[$timestamp] [$level]${NC} $message" | tee -a "$LOG_FILE"
|
echo -e "${color}[$timestamp] [$level]${NC} $message" | tee -a "$LOG_FILE"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
debug() { log "DEBUG" "$1"; }
|
||||||
|
trace() { log "TRACE" "$1"; }
|
||||||
info() { log "INFO" "$1"; }
|
info() { log "INFO" "$1"; }
|
||||||
warn() { log "WARN" "$1"; }
|
warn() { log "WARN" "$1"; }
|
||||||
error() { log "ERROR" "$1"; }
|
error() { log "ERROR" "$1"; }
|
||||||
debug() { log "DEBUG" "$1"; }
|
|
||||||
|
|
||||||
# 配置加载
|
# 配置加载
|
||||||
load_config() {
|
load_config() {
|
||||||
@@ -97,6 +103,7 @@ load_config() {
|
|||||||
: ${COMPARISON_METHOD:="both"}
|
: ${COMPARISON_METHOD:="both"}
|
||||||
: ${TIME_PRECISION:="second"}
|
: ${TIME_PRECISION:="second"}
|
||||||
: ${LONG_PATH_SUPPORT:="true"}
|
: ${LONG_PATH_SUPPORT:="true"}
|
||||||
|
: ${IGNORE_LINE_ENDINGS:="false"}
|
||||||
|
|
||||||
source "$CONFIG_FILE"
|
source "$CONFIG_FILE"
|
||||||
info "配置文件加载完成"
|
info "配置文件加载完成"
|
||||||
@@ -109,13 +116,8 @@ setup_environment() {
|
|||||||
mkdir -p "$OUTPUT_DIRECTORY"
|
mkdir -p "$OUTPUT_DIRECTORY"
|
||||||
mkdir -p "$TEMP_DIR"
|
mkdir -p "$TEMP_DIR"
|
||||||
|
|
||||||
# 设置日志级别
|
# 注意:不在环境设置中启用调试模式,以免影响日志输出
|
||||||
case "$LOG_LEVEL" in
|
# 如果需要详细调试,可以在脚本开头手动设置 set -x
|
||||||
"DEBUG") set -x ;;
|
|
||||||
"INFO") ;;
|
|
||||||
"WARN") ;;
|
|
||||||
"ERROR") ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
info "环境设置完成"
|
info "环境设置完成"
|
||||||
info "日志文件: $LOG_FILE"
|
info "日志文件: $LOG_FILE"
|
||||||
@@ -126,7 +128,7 @@ setup_environment() {
|
|||||||
# 清理函数
|
# 清理函数
|
||||||
cleanup() {
|
cleanup() {
|
||||||
if [[ -d "$TEMP_DIR" ]]; then
|
if [[ -d "$TEMP_DIR" ]]; then
|
||||||
# rm -rf "$TEMP_DIR"
|
rm -rf "$TEMP_DIR"
|
||||||
info "临时目录已清理: $TEMP_DIR"
|
info "临时目录已清理: $TEMP_DIR"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -173,16 +175,25 @@ parse_size() {
|
|||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
get_file_hash() {
|
get_file_hash() {
|
||||||
local file_path="$1"
|
local file_path="$1"
|
||||||
local algorithm="${2:-sha256}"
|
local algorithm="${2:-sha256}"
|
||||||
|
|
||||||
|
# 对复合形式的HASH要做处理,只比较内容,不比较时间戳,权限等
|
||||||
|
|
||||||
case "$algorithm" in
|
case "$algorithm" in
|
||||||
"md5") md5sum "$file_path" | cut -d' ' -f1 ;;
|
"md5")
|
||||||
"sha1") sha1sum "$file_path" | cut -d' ' -f1 ;;
|
cat "$file_path" | tr -d '\r\n' | md5sum | cut -d' ' -f1 | cut -d'|' -f6;;
|
||||||
"sha256") sha256sum "$file_path" | cut -d' ' -f1 ;;
|
"sha1")
|
||||||
*) sha256sum "$file_path" | cut -d' ' -f1 ;;
|
cat "$file_path" | tr -d '\r\n' | sha1sum | cut -d' ' -f1 | cut -d'|' -f6;;
|
||||||
esac
|
"sha256")
|
||||||
|
cat "$file_path" | tr -d '\r\n' | sha256sum | cut -d' ' -f1 | cut -d'|' -f6;;
|
||||||
|
"sha512")
|
||||||
|
cat "$file_path" | tr -d '\r\n' | sha512sum | cut -d' ' -f1 | cut -d'|' -f6;;
|
||||||
|
*)
|
||||||
|
cat "$file_path" | tr -d '\r\n' | sha256sum | cut -d' ' -f1 | cut -d'|' -f6;;
|
||||||
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
get_file_info() {
|
get_file_info() {
|
||||||
@@ -226,7 +237,7 @@ should_include_file() {
|
|||||||
for pattern in "${INCLUDE_PATTERNS[@]}"; do
|
for pattern in "${INCLUDE_PATTERNS[@]}"; do
|
||||||
if [[ "$file_path" == $pattern ]] || [[ "$file_path" =~ $pattern ]]; then
|
if [[ "$file_path" == $pattern ]] || [[ "$file_path" =~ $pattern ]]; then
|
||||||
include_match=true
|
include_match=true
|
||||||
debug "文件匹配包含模式<$pattern>: $file_path"
|
trace "文件匹配包含模式<$pattern>: $file_path"
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@@ -381,6 +392,15 @@ compare_files() {
|
|||||||
local output_file="$3"
|
local output_file="$3"
|
||||||
|
|
||||||
info "开始比较文件差异"
|
info "开始比较文件差异"
|
||||||
|
|
||||||
|
# 输出差异比较规则
|
||||||
|
info "比较规则: "
|
||||||
|
info "比较方法配置: $COMPARISON_METHOD"
|
||||||
|
info "哈希算法配置: $HASH_ALGORITHM"
|
||||||
|
info "时间精度:$TIME_PRECISION"
|
||||||
|
info "是否忽略换行符不同: $IGNORE_LINE_ENDINGS"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
declare -A old_files
|
declare -A old_files
|
||||||
declare -A new_files
|
declare -A new_files
|
||||||
@@ -427,7 +447,7 @@ compare_files() {
|
|||||||
case "$COMPARISON_METHOD" in
|
case "$COMPARISON_METHOD" in
|
||||||
"content")
|
"content")
|
||||||
[[ "$old_hash" != "$new_hash" ]] && is_modified=true
|
[[ "$old_hash" != "$new_hash" ]] && is_modified=true
|
||||||
debug "检测到修改文件: $path | 哈希值变化: <$old_hash> => <$new_hash>"
|
info "检测到修改文件: $path | 哈希值变化: <$old_hash> => <$new_hash>"
|
||||||
;;
|
;;
|
||||||
"time")
|
"time")
|
||||||
IFS='|' read -r old_size old_mtime old_ctime old_perm old_uid old_gid <<< "$old_info"
|
IFS='|' read -r old_size old_mtime old_ctime old_perm old_uid old_gid <<< "$old_info"
|
||||||
@@ -435,10 +455,10 @@ compare_files() {
|
|||||||
|
|
||||||
if [[ "$TIME_PRECISION" == "second" ]]; then
|
if [[ "$TIME_PRECISION" == "second" ]]; then
|
||||||
[[ $old_mtime -ne $new_mtime ]] && is_modified=true
|
[[ $old_mtime -ne $new_mtime ]] && is_modified=true
|
||||||
debug "检测到修改文件: $path | 时间变化: <$old_mtime> => <$new_mtime>"
|
trace "检测到修改文件: $path | 时间变化: <$old_mtime> => <$new_mtime>"
|
||||||
else
|
else
|
||||||
[[ $(echo "$old_mtime != $new_mtime" | bc) -eq 1 ]] && is_modified=true
|
[[ $(echo "$old_mtime != $new_mtime" | bc) -eq 1 ]] && is_modified=true
|
||||||
debug "检测到修改文件: $path | 时间变化: <$old_mtime> => <$new_mtime>"
|
trace "检测到修改文件: $path | 时间变化: <$old_mtime> => <$new_mtime>"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
"both")
|
"both")
|
||||||
@@ -447,13 +467,13 @@ compare_files() {
|
|||||||
|
|
||||||
if [[ "$old_hash" != "$new_hash" ]]; then
|
if [[ "$old_hash" != "$new_hash" ]]; then
|
||||||
is_modified=true
|
is_modified=true
|
||||||
debug "检测到修改文件: $path | 哈希值变化: <$old_hash> => <$new_hash>"
|
trace "检测到修改文件: $path | 哈希值变化: <$old_hash> => <$new_hash>"
|
||||||
elif [[ "$TIME_PRECISION" == "second" ]] && [[ $old_mtime -ne $new_mtime ]]; then
|
elif [[ "$TIME_PRECISION" == "second" ]] && [[ $old_mtime -ne $new_mtime ]]; then
|
||||||
is_modified=true
|
is_modified=true
|
||||||
debug "检测到修改文件: $path | 时间变化: <$old_mtime> => <$new_mtime>"
|
trace "检测到修改文件: $path | 时间变化: <$old_mtime> => <$new_mtime>"
|
||||||
elif [[ "$TIME_PRECISION" == "millisecond" ]] && [[ $(echo "$old_mtime != $new_mtime" | bc) -eq 1 ]]; then
|
elif [[ "$TIME_PRECISION" == "millisecond" ]] && [[ $(echo "$old_mtime != $new_mtime" | bc) -eq 1 ]]; then
|
||||||
is_modified=true
|
is_modified=true
|
||||||
debug "检测到修改文件: $path | 时间变化: <$old_mtime> => <$new_mtime>"
|
trace "检测到修改文件: $path | 时间变化: <$old_mtime> => <$new_mtime>"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -708,7 +728,7 @@ generate_rollback_package() {
|
|||||||
mkdir -p "$dest_dir"
|
mkdir -p "$dest_dir"
|
||||||
if handle_long_path_copy "$source_file" "$dest_file"; then
|
if handle_long_path_copy "$source_file" "$dest_file"; then
|
||||||
rollback_files+=("$path")
|
rollback_files+=("$path")
|
||||||
debug "回滚文件: $source_file"
|
trace "回滚文件: $source_file"
|
||||||
else
|
else
|
||||||
warn "无法复制回滚文件: $source_file"
|
warn "无法复制回滚文件: $source_file"
|
||||||
fi
|
fi
|
||||||
@@ -905,7 +925,7 @@ generate_patch() {
|
|||||||
mkdir -p "$dest_dir"
|
mkdir -p "$dest_dir"
|
||||||
if handle_long_path_copy "$source_file" "$dest_file"; then
|
if handle_long_path_copy "$source_file" "$dest_file"; then
|
||||||
((copied_count++))
|
((copied_count++))
|
||||||
debug "复制文件: $source_file -> $dest_file"
|
trace "复制文件: $source_file -> $dest_file"
|
||||||
else
|
else
|
||||||
warn "文件复制失败: $source_file"
|
warn "文件复制失败: $source_file"
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user