Checksum : Use _iterate_targets.

This commit is contained in:
Dmitry Voronin 2023-12-17 20:12:33 +03:00
parent 0be0396232
commit 47a30351d1
4 changed files with 35 additions and 72 deletions

View file

@ -208,7 +208,7 @@ function unarchive() {
;; ;;
esac esac
else else
_error "Validation failed!" _error "Failed."
return 1 return 1
fi fi
} }

View file

@ -4,45 +4,20 @@
# Usage: checksum_create [FILES] # Usage: checksum_create [FILES]
function checksum_create() { function checksum_create() {
local IFS=$'\n' local IFS=$'\n'
local targets=("${@}") local targets=(${@})
local count=0 [[ "${targets}" = "" ]] && targets=($(_ls_file))
local total=${#}
local failed=0
# All files by default. process() {
if [[ "${targets}" = "" ]]; then
targets=($(ls --classify | grep -v /\$))
total=${#targets[@]}
fi
# Iterate each file.
for target in "${targets[@]}"; do
local hashfile=".${target#./}.sha1" local hashfile=".${target#./}.sha1"
# Increment count.
((count++))
# Status info.
local status="[${count}/${total}] ${target}"
echo -e "${color_bwhite}${status}${color_default}"
# Skip if hash exists. # Skip if hash exists.
[[ -f "${hashfile}" ]] && continue [[ -f "${hashfile}" ]] && return 0
# Calculate hash. # Calculate hash.
pv "${target}" | sha1sum > ${hashfile} pv ${target} | sha1sum > ${hashfile}
}
# Report success. _iterate_targets process ${targets[@]}
if [[ ${?} != 0 ]]; then
echo -e "${color_bred}${status}: Failed.${color_default}"
((failed++))
fi
done
if [[ ${failed} != 0 ]]; then
echo -e "${color_bred}Failed: ${failed}.${color_default}"
return 1
fi
} }
# Check stored values against actual files. # Check stored values against actual files.
@ -50,51 +25,26 @@ function checksum_create() {
# Usage: checksum_check [FILES] # Usage: checksum_check [FILES]
function checksum_check() { function checksum_check() {
local IFS=$'\n' local IFS=$'\n'
local targets=("${@}") local targets=(${@})
local count=0 [[ "${targets}" = "" ]] && targets=($(_ls_file))
local total=${#}
local failed=0
local skipped=0
# All files by default. process() {
if [[ "${targets}" = "" ]]; then
targets=($(ls --classify | grep -v /\$))
total=${#targets[@]}
fi
# Iterate each file.
for target in "${targets[@]}"; do
local hashfile=".${target#./}.sha1" local hashfile=".${target#./}.sha1"
# Increment count.
((count++))
# Status info.
local status="[${count}/${total}] ${target}"
echo -e "${color_bwhite}${status}${color_default}"
# Skip if hash doesn't exist. # Skip if hash doesn't exist.
[[ -f "${hashfile}" ]] || { ((skipped++)); continue; } [[ -f "${hashfile}" ]] || { ((skipped++)); _warn "No hash found."; return 0; }
# Calculate hash. # Calculate hash.
local stored=$(cat "${hashfile}" | cut -d\ -f1) local stored=$(cat "${hashfile}" | cut -d\ -f1)
local actual=$(pv "${target}" | sha1sum | cut -d\ -f1) local actual=$(pv "${target}" | sha1sum | cut -d\ -f1)
if [[ "${stored}" != "${actual}" ]]; then if [[ "${stored}" != "${actual}" ]]; then
echo -e "${color_bred}${status}: Failed.${color_default}" _error "Failed."
((failed++)) return 1
fi fi
done }
if [[ ${skipped} != 0 ]]; then _iterate_targets process ${targets[@]}
echo -e "${color_byellow}Skipped: ${skipped}.${color_default}"
return 1
fi
if [[ ${failed} != 0 ]]; then
echo -e "${color_bred}Failed: ${failed}.${color_default}"
return 1
fi
} }
# Calculate hashes for all files recursively and store in a file called `checksum.sha1`. # Calculate hashes for all files recursively and store in a file called `checksum.sha1`.

View file

@ -85,7 +85,7 @@ function name_hash_check() {
# compare hashes. # compare hashes.
if [[ "${stored}" != "${actual}" ]]; then if [[ "${stored}" != "${actual}" ]]; then
_error "Validation failed!" _error "Failed."
return 1 return 1
fi fi
} }

View file

@ -10,7 +10,7 @@ function _parse_ints() {
# Function-wrapper to iterate with specified function with provided files. # Function-wrapper to iterate with specified function with provided files.
# By default Iterates on all non-hidden files and directories. # By default Iterates on all non-hidden files and directories.
# List of variables available to FUNCTION: target - current file, count - current item index, total - sum of targets, failed - count of previously failed items, status - status line (not recommended to use). # List of variables available to FUNCTION: target - current file, count - current item index, total - sum of targets, failed - count of previously failed items, skipped - count of skipped files, status - status line (not recommended to use).
# Usage: _iterate_targets <FUNCTION> [FILES] # Usage: _iterate_targets <FUNCTION> [FILES]
function _iterate_targets() { function _iterate_targets() {
local IFS=$'\n' local IFS=$'\n'
@ -19,6 +19,7 @@ function _iterate_targets() {
local total=${#targets[@]} local total=${#targets[@]}
local count=0 local count=0
local failed=0 local failed=0
local skipped=0
local code=0 local code=0
# set dafult value to target all supported archives. # set dafult value to target all supported archives.
@ -49,18 +50,30 @@ function _iterate_targets() {
[[ "${count}" = "${total}" ]] || echo [[ "${count}" = "${total}" ]] || echo
done done
# Show skipped.
if [[ ${skipped} != 0 ]]; then
echo
echo -e "${color_byellow}Skipped: ${skipped}.${color_default}"
fi
# Show error. # Show error.
if [[ ${failed} != 0 ]]; then if [[ ${failed} != 0 ]]; then
echo [[ "${skipped}" = 0 ]] && echo
echo -e "${color_bred}Failed: ${failed}.${color_default}" echo -e "${color_bred}Failed: ${failed}.${color_default}"
false false
fi fi
} }
# Report error to stdout. # Report an error to stdout.
# Always returns code 1. # Always returns code 1.
# If no message specified, prints "An error has occured". # Usage: _error <MESSAGE>
# Usage: _error [MESSAGE]
function _error() { function _error() {
echo -e "${color_bred}${*}${color_default}" echo -e "${color_bred}${*}${color_default}"
return 1
}
# Report a warning to stdout.
# Usage: _warn <MESSAGE>
function _warn() {
echo -e "${color_byellow}${*}${color_default}"
} }