mirror of
https://oauth2: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@github.com/m1ngsama/TNT.git
synced 2026-06-26 05:34:39 +08:00
89 lines
2.3 KiB
Bash
Executable file
89 lines
2.3 KiB
Bash
Executable file
#!/bin/sh
|
|
# Build and validate the explicit release source archive.
|
|
|
|
set -eu
|
|
|
|
usage() {
|
|
cat <<'USAGE'
|
|
Usage: scripts/package_source_archive.sh REF [OUT_DIR]
|
|
|
|
REF is a git ref, commit, or release tag to archive. OUT_DIR defaults to dist.
|
|
The archive name is tnt-chat-v$TNT_VERSION-source.tar.gz, and its top-level
|
|
directory is TNT-$TNT_VERSION/.
|
|
|
|
When REF is a SemVer tag such as v1.2.3 or refs/tags/v1.2.3, the tag must match
|
|
TNT_VERSION from that ref. This script only builds and validates the archive; it
|
|
does not tag, publish, upload, or deploy.
|
|
USAGE
|
|
}
|
|
|
|
fail() {
|
|
echo "source-archive: $*" >&2
|
|
exit 1
|
|
}
|
|
|
|
require_archive_entry() {
|
|
entry=$1
|
|
label=$2
|
|
|
|
printf '%s\n' "$archive_listing" |
|
|
awk -v target="$entry" '$0 == target { found = 1 } END { exit found ? 0 : 1 }' ||
|
|
fail "source archive is missing $label"
|
|
}
|
|
|
|
[ "${1:-}" != "-h" ] && [ "${1:-}" != "--help" ] || {
|
|
usage
|
|
exit 0
|
|
}
|
|
|
|
REF=${1:-}
|
|
OUT_DIR=${2:-dist}
|
|
|
|
[ -n "$REF" ] || {
|
|
usage >&2
|
|
exit 2
|
|
}
|
|
|
|
ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
|
|
cd "$ROOT"
|
|
|
|
commit=$(git rev-parse --verify "$REF^{commit}") ||
|
|
fail "could not resolve git ref: $REF"
|
|
|
|
case "$OUT_DIR" in
|
|
/*) ;;
|
|
*) OUT_DIR="$ROOT/$OUT_DIR" ;;
|
|
esac
|
|
|
|
version=$(git show "$commit:include/common.h" |
|
|
sed -n 's/^#define TNT_VERSION "\([^"]*\)".*/\1/p')
|
|
[ -n "$version" ] || fail "could not read TNT_VERSION from $REF"
|
|
|
|
case "$REF" in
|
|
refs/tags/v[0-9]*.[0-9]*.[0-9]*)
|
|
tag=${REF#refs/tags/}
|
|
[ "$tag" = "v$version" ] ||
|
|
fail "release tag $tag does not match TNT_VERSION $version"
|
|
;;
|
|
v[0-9]*.[0-9]*.[0-9]*)
|
|
[ "$REF" = "v$version" ] ||
|
|
fail "release tag $REF does not match TNT_VERSION $version"
|
|
;;
|
|
esac
|
|
|
|
archive="$OUT_DIR/tnt-chat-v$version-source.tar.gz"
|
|
|
|
mkdir -p "$OUT_DIR"
|
|
[ ! -e "$archive" ] || fail "output already exists: $archive"
|
|
|
|
git archive --format=tar.gz --prefix="TNT-$version/" -o "$archive" "$commit"
|
|
|
|
archive_listing=$(tar -tzf "$archive") ||
|
|
fail "archive is not a readable tar.gz: $archive"
|
|
require_archive_entry "TNT-$version/LICENSE" "LICENSE"
|
|
require_archive_entry "TNT-$version/src/tntctl.c" "src/tntctl.c"
|
|
require_archive_entry "TNT-$version/packaging/README.md" "packaging/README.md"
|
|
require_archive_entry "TNT-$version/tnt.1" "tnt.1"
|
|
require_archive_entry "TNT-$version/tntctl.1" "tntctl.1"
|
|
|
|
echo "$archive"
|