diff options
author | Egor Tensin <Egor.Tensin@gmail.com> | 2016-10-07 20:02:24 +0300 |
---|---|---|
committer | Egor Tensin <Egor.Tensin@gmail.com> | 2016-10-07 20:02:24 +0300 |
commit | 0c7657bf0bd41f741802ae8e8dedbaac867b671e (patch) | |
tree | 09042b99f8847fc724fe83592be3b24c1f32202c | |
parent | README update (diff) | |
download | linux-home-0c7657bf0bd41f741802ae8e8dedbaac867b671e.tar.gz linux-home-0c7657bf0bd41f741802ae8e8dedbaac867b671e.zip |
update_checksums: don't recalculate existing
-rw-r--r-- | %HOME%/.bash_utils/distr.sh | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/%HOME%/.bash_utils/distr.sh b/%HOME%/.bash_utils/distr.sh index 06d342a..58e088a 100644 --- a/%HOME%/.bash_utils/distr.sh +++ b/%HOME%/.bash_utils/distr.sh @@ -7,9 +7,36 @@ checksums_path='sha1sums.txt' -update_checksums() { - sha1sum -- "$@" > "$checksums_path" -} +list_checksums_paths() ( + set -o errexit -o nounset -o pipefail + + if [ -f "$checksums_path" ]; then + local path + while IFS= read -r path; do + printf "$path"'\0' + done < <( sed --binary 's/^\\\?[[:alnum:]]\+ [ *]//' "$checksums_path" ) + fi +) + +update_checksums() ( + set -o errexit -o nounset -o pipefail + + local path + + local -A existing + while IFS= read -d '' -r path; do + existing[$path]=1 + done < <( list_checksums_paths ) + + local -a missing + for path in "$@"; do + if [ -z "${existing[$path]+x}" ]; then + missing+=("$path") + fi + done + + sha1sum -- "${missing[@]+"${missing[@]}"}" >> "$checksums_path" +) update_checksums_distr() ( set -o errexit -o nounset -o pipefail @@ -19,7 +46,7 @@ update_checksums_distr() ( while IFS= read -d '' -r path; do paths+=("$path") - done < <( find . -type f -\( -iname '*.exe' -o -iname '*.iso' -\) -print0 ) + done < <( find . -type f -\( -iname '*.exe' -o -iname '*.iso' -\) -printf '%P\0' ) update_checksums "${paths[@]+"${paths[@]}"}" ) |