archive-ccc8458/archive.sh 1.4 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
#!/usr/bin/env bash
#
# Usage:
#   ./archive.sh            # archive HEAD, version from `git describe`
#   ./archive.sh v1.2.0     # archive a specific tag/branch/commit
#
# Output: dist/archive-<version>.tar.gz, .zip, and a SHA256SUMS file.

set -euo pipefail

cd "$(dirname "$0")"

# Change to project name:
NAME="archive"
REF="${1:-HEAD}"
OUT_DIR="dist"

# Version label: the given ref if it's a tag/branch, else `git describe`
# default to the short commit hash when there are no tags
if [ "$REF" != "HEAD" ]; then
    VERSION="$REF"
else
    VERSION="$(git describe --tags --always --dirty 2>/dev/null || git rev-parse --short HEAD)"
fi

PREFIX="${NAME}-${VERSION}"
TARBALL="${OUT_DIR}/${PREFIX}.tar.gz"
ZIPFILE="${OUT_DIR}/${PREFIX}.zip"

if ! git diff-index --quiet HEAD -- 2>/dev/null; then
    echo "Warning: found uncommitted changes, will NOT be in the archive." >&2
fi

mkdir -p "$OUT_DIR"

git archive --format=tar.gz --prefix="${PREFIX}/" -o "$TARBALL" "$REF"
git archive --format=zip    --prefix="${PREFIX}/" -o "$ZIPFILE" "$REF"

# Checksums for integrity (Linux and MacOS should work).
if command -v sha256sum >/dev/null 2>&1; then
    SHA="sha256sum"
else
    SHA="shasum -a 256"
fi
( cd "$OUT_DIR" && $SHA "${PREFIX}.tar.gz" "${PREFIX}.zip" > "${PREFIX}.SHA256SUMS" )

echo "Ouput dir: ${OUT_DIR}/:"
ls -lh "$TARBALL" "$ZIPFILE" "${OUT_DIR}/${PREFIX}.SHA256SUMS" | awk '{printf "  %-40s %s\n", $9, $5}'