Buckets:

huggingface/funes / install.sh
dacorvo's picture
download
raw
5.14 kB
#!/bin/sh
# Install the funes binary from the Hugging Face bucket (huggingface/funes).
#
# curl -fsSL https://huggingface.co/buckets/huggingface/funes/resolve/install.sh | sh
#
# Detects the platform, downloads the matching prebuilt binary, and installs it
# onto your PATH. Flags (pass after `sh -s --` when piping):
# -b <dir> install dir (default: $HOME/.local/bin; env: FUNES_INSTALL_DIR)
# -v <tag> release tag to fetch (default: latest; env: FUNES_VERSION)
set -eu
REPO="huggingface/funes"
BUCKET="huggingface/funes"
BINDIR="${FUNES_INSTALL_DIR:-$HOME/.local/bin}"
REQUESTED_VERSION="${FUNES_VERSION:-latest}"
usage() {
echo "usage: install.sh [-b install-dir] [-v release-tag]" >&2
exit "${1:-2}"
}
while getopts "b:v:h" opt; do
case "$opt" in
b) BINDIR="$OPTARG" ;;
v) REQUESTED_VERSION="$OPTARG" ;;
h) usage 0 ;;
*) usage 2 ;;
esac
done
# (OS, arch) -> the asset name the release workflow publishes. Only these two
# targets are built; everything else falls through to build-from-source.
case "$(uname -s)-$(uname -m)" in
Linux-x86_64) asset="funes-x86_64-linux" ;;
Linux-aarch64 | Linux-arm64) asset="funes-aarch64-linux" ;;
Darwin-arm64 | Darwin-aarch64) asset="funes-arm64-apple-darwin" ;;
*)
echo "funes: no prebuilt binary for $(uname -s)/$(uname -m)." >&2
echo "Build from source: https://github.com/$REPO#building-from-source" >&2
exit 1
;;
esac
if command -v curl >/dev/null 2>&1; then
fetch() { curl -fsSL "$1" -o "$2"; }
elif command -v wget >/dev/null 2>&1; then
fetch() { wget -qO "$2" "$1"; }
else
echo "funes: need curl or wget on PATH to download." >&2
exit 1
fi
valid_version() {
case "$1" in
'' | *[!0-9.]* | .* | *. | *..*) return 1 ;;
esac
old_ifs=$IFS
IFS=.
set -- $1
IFS=$old_ifs
[ "$#" -eq 3 ] || return 1
for part in "$@"; do
case "$part" in
'' | *[!0-9]*) return 1 ;;
esac
done
}
read_version() {
awk '
NF == 0 { next }
NF != 1 || seen { bad = 1; next }
{ value = $1; seen = 1 }
END {
if (bad || !seen) exit 1
print value
}
' "$1"
}
manifest_digest() {
awk -v wanted="$2" '
NF != 2 || length($1) != 64 || $1 ~ /[^0-9a-f]/ || $2 ~ /\// || seen[$2]++ {
bad = 1
next
}
$2 == wanted { digest = $1; found++ }
END {
if (bad || found != 1) exit 1
print digest
}
' "$1"
}
sha256_file() {
if command -v sha256sum >/dev/null 2>&1; then
sha256sum "$1" | awk '{ print $1 }'
elif command -v shasum >/dev/null 2>&1; then
shasum -a 256 "$1" | awk '{ print $1 }'
else
echo "funes: need sha256sum or shasum on PATH to verify the download." >&2
return 1
fi
}
mkdir -p "$BINDIR"
tmpdir=$(mktemp -d "$BINDIR/.funes-install.XXXXXX") || {
echo "funes: could not create a staging directory in $BINDIR." >&2
exit 1
}
trap 'rm -rf "$tmpdir"' EXIT HUP INT TERM
root="https://huggingface.co/buckets/$BUCKET/resolve"
if [ "$REQUESTED_VERSION" = latest ]; then
if ! fetch "$root/VERSION" "$tmpdir/latest-version"; then
echo "funes: could not resolve the latest release." >&2
exit 1
fi
if ! version=$(read_version "$tmpdir/latest-version"); then
echo "funes: the latest release has an invalid VERSION marker." >&2
exit 1
fi
else
version=${REQUESTED_VERSION#v}
fi
if ! valid_version "$version"; then
echo "funes: invalid release version: $version" >&2
exit 1
fi
tag="v$version"
release="$root/$tag"
if ! fetch "$release/VERSION" "$tmpdir/release-version" ||
! fetch "$release/SHA256SUMS" "$tmpdir/SHA256SUMS"; then
echo "funes: release metadata is incomplete for $tag." >&2
exit 1
fi
if ! tagged_version=$(read_version "$tmpdir/release-version") || [ "$tagged_version" != "$version" ]; then
echo "funes: release metadata does not match $tag." >&2
exit 1
fi
if ! expected=$(manifest_digest "$tmpdir/SHA256SUMS" "$asset"); then
echo "funes: SHA256SUMS is malformed or does not contain $asset." >&2
exit 1
fi
binary="$tmpdir/$asset"
echo "Downloading $asset ($tag)…"
if ! fetch "$release/$asset" "$binary"; then
echo "funes: download failed: $release/$asset" >&2
exit 1
fi
if ! actual=$(sha256_file "$binary") || [ "$actual" != "$expected" ]; then
echo "funes: checksum verification failed for $asset; nothing was installed." >&2
exit 1
fi
chmod +x "$binary"
if ! reported=$("$binary" --version 2>/dev/null) || [ "$reported" != "funes $version" ]; then
echo "funes: $asset does not report the expected version $version; nothing was installed." >&2
exit 1
fi
mv -f "$binary" "$BINDIR/funes"
echo "Installed funes -> $BINDIR/funes"
"$BINDIR/funes" --version 2>/dev/null || true
case ":$PATH:" in
*":$BINDIR:"*) ;;
*)
echo
echo "$BINDIR is not on your PATH. Add it:"
echo " export PATH=\"$BINDIR:\$PATH\""
;;
esac

Xet Storage Details

Size:
5.14 kB
·
Xet hash:
987b8ff1d84605f1cfe92ca608feb6b2d8b582da50c34dfebf0d92af50e367da

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.