ipfire-2.x/tools/download-rust-crate

83 lines
1.8 KiB
Bash
Executable File

#!/bin/bash
set -o pipefail
RUST_TEMPLATE="lfs/rust-rand"
fetch_latest_version() {
local name="${1}"
if ! curl --silent "https://crates.io/api/v1/crates/${name}" | \
jq --raw-output .crate.max_stable_version; then
echo "${0}: Could not find the latest stable version of ${name}" >&2
return 1
fi
}
main() {
local name="${1}"
local version="${2}"
if [ -z "${name}" ]; then
echo "${0}: You need to pass a name of a crate" >&2
return 2
fi
if [ -z "${version}" ]; then
version="$(fetch_latest_version "${name}")"
if [ -z "${version}" ]; then
# error message has already been printed
return 1
fi
fi
# Compose download URL
local url="https://crates.io/api/v1/crates/${name}/${version}/download"
local download="$(mktemp)"
# Perform download
if ! curl -L "${url}" -o "${download}"; then
echo "${0}: Could not download ${name}-${version}" >&2
unlink "${download}"
return 1
fi
# Check if download is an orderly tar file
if ! tar tvf "${download}" &>/dev/null; then
echo "${0}: Download is not a tar file" >&2
unlink "${download}"
return 1
fi
# Hash the downloaded file
local b2sum="$(b2sum "${download}" | awk '{ print $1 }')"
if [ -z "${b2sum}" ]; then
echo "${0}: Could not hash download" >&2
unlink "${download}"
return 1
fi
local filename="cache/${name}-${version}.tar.gz"
# Move to final destination
if ! install -m 644 "${download}" "${filename}"; then
echo "${0}: Could not move downloaded file to ${filename}" >&2
unlink "${download}"
return 1
fi
# Remove download
unlink "${download}"
# Create a new LFS file
sed < "${RUST_TEMPLATE}" > "lfs/rust-${name}" \
-e "s/^VER.*/VER = ${version}/" \
-e "s/^THISAPP.*/THISAPP = ${name}-\$(VER)/" \
-e "s/^\$(DL_FILE)_BLAKE2.*/\$(DL_FILE)_BLAKE2 = ${b2sum}/"
echo "Done"
return 0
}
main "$@" || exit $?