RIOT/dist/tools/dlcache/dlcache.sh
Koen Zandberg 96cad82910
dist/tools: Use bash instead of sh where needed
A number of scripts use features from bash such as `local` which are not
in the POSIX spec. This breaks on systems where sh is not symlinked to
bash.

This patch changes the interpreter indicated by the hashbang to bash for
those scripts
2020-10-30 12:12:10 +01:00

109 lines
2.2 KiB
Bash
Executable File

#!/bin/bash
DLCACHE_DIR=${DLCACHE_DIR:-~/.dlcache}
mkdir -p "$DLCACHE_DIR"
_echo() {
echo "$@" 1>&2
}
if [ "$(uname)" = Darwin ]; then
_locked() {
local lockfile="$1"
shift
while ! shlock -p $$ -f $lockfile; do
sleep 0.2
done
$*
rm $lockfile
}
else
_locked() {
local lockfile="$1"
shift
(
flock -w 600 9 || exit 1
$*
) 9>"$lockfile"
}
fi
if [ "$(uname)" = Darwin ]; then
MD5="md5 -r"
else
MD5=md5sum
fi
calcmd5() {
local file="$1"
local md5="$2"
local file_md5=$(${MD5} "$file" | cut -d\ -f1)
test "$md5" = "$file_md5"
}
downloader() {
if [ -n "$(command -v wget)" ]; then
wget -nv "$1" -O $2
elif [ -n "$(command -v curl)" ]; then
curl -L $1 -o $2
else
_echo "$0: neither wget nor curl available!"
return 1
fi
}
download() {
local url="$1"
local _md5="$2"
local basename_url=$(basename ${url})
local target="${3:-${basename_url}}"
[ -f "$target" ] && {
# if our target file exists, check it's md5.
calcmd5 "$target" "$_md5" && {
_echo "$0: target exists, md5 matches."
exit 0
}
}
local filename="$(basename $url)"
[ -f "$DLCACHE_DIR/$filename" ] && {
# if the file exists in cache, check it's md5 and possibly remove it.
if calcmd5 "$DLCACHE_DIR/$filename" "$_md5"; then
_echo "$0: getting \"$url\" from cache"
else
_echo "$0: \"$DLCACHE_DIR/$filename\" has wrong checksum, re-downloading"
rm "$DLCACHE_DIR/$filename"
fi
}
[ ! -f "$DLCACHE_DIR/$filename" ] && {
_echo "$0: downloading \"$url\"..."
downloader "$url" "$DLCACHE_DIR/$filename" || {
_echo "$0: error downloading $url to $DLCACHE_DIR/$filename!"
exit 1
}
_echo "$0: done downloading \"$url\""
}
calcmd5 "$DLCACHE_DIR/$filename" "$_md5" || {
_echo "$0: checksum mismatch!"
exit 1
}
if [ "$target" = "-" ]; then
cat "$DLCACHE_DIR/$filename"
else
cp "$DLCACHE_DIR/$filename" "$target"
fi
}
_locked "$DLCACHE_DIR/$(basename $1).locked" download "$@"