mirror of
https://github.com/bybrooklyn/openbitdo.git
synced 2026-03-19 04:12:56 -04:00
release: prepare v0.0.1-rc.4
This commit is contained in:
@@ -1,17 +1,22 @@
|
||||
# AUR Packaging
|
||||
|
||||
This directory contains AUR package sources for:
|
||||
- `openbitdo-bin` (prebuilt release assets)
|
||||
This directory holds the tracked AUR source for `openbitdo-bin`.
|
||||
|
||||
Publishing is automated by `.github/workflows/aur-publish.yml` and remains gated:
|
||||
- requires repository variable `AUR_PUBLISH_ENABLED=1`
|
||||
- requires secrets `AUR_SSH_PRIVATE_KEY` and `AUR_USERNAME`
|
||||
## Source Of Truth
|
||||
|
||||
Publish flow:
|
||||
1. wait for release assets from a `v*` tag
|
||||
2. compute authoritative SHA256 values from released artifacts
|
||||
3. render `PKGBUILD`/`.SRCINFO` with pinned hashes
|
||||
4. push updates to AUR repo
|
||||
- tracked metadata: `packaging/aur/openbitdo-bin/PKGBUILD` and `.SRCINFO`
|
||||
- template: `packaging/aur/openbitdo-bin/PKGBUILD.tmpl`
|
||||
- renderer: `packaging/scripts/render_release_metadata.sh`
|
||||
|
||||
Template files used for release rendering:
|
||||
- `openbitdo-bin/PKGBUILD.tmpl`
|
||||
## Publish Flow
|
||||
|
||||
1. Publish GitHub release assets for a `v*` tag.
|
||||
2. Render `PKGBUILD` and `.SRCINFO` from those assets.
|
||||
3. Upload rendered metadata as a workflow artifact for audit.
|
||||
4. Push the updated metadata to the AUR repo for `openbitdo-bin`.
|
||||
|
||||
## Required Controls
|
||||
|
||||
- repo variable `AUR_PUBLISH_ENABLED=1`
|
||||
- secrets `AUR_USERNAME` and `AUR_SSH_PRIVATE_KEY`
|
||||
- no placeholder checksums in published metadata
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
pkgbase = openbitdo-bin
|
||||
pkgdesc = Prebuilt beginner-first clean-room 8BitDo utility
|
||||
pkgver = 0.0.1rc1
|
||||
pkgver = 0.0.1rc3
|
||||
pkgrel = 1
|
||||
url = https://github.com/bybrooklyn/openbitdo
|
||||
arch = x86_64
|
||||
arch = aarch64
|
||||
license = BSD-3-Clause
|
||||
depends = hidapi
|
||||
source_x86_64 = openbitdo-v0.0.1-rc.1-linux-x86_64.tar.gz::https://github.com/bybrooklyn/openbitdo/releases/download/v0.0.1-rc.1/openbitdo-v0.0.1-rc.1-linux-x86_64.tar.gz
|
||||
sha256sums_x86_64 = 0000000000000000000000000000000000000000000000000000000000000000
|
||||
source_aarch64 = openbitdo-v0.0.1-rc.1-linux-aarch64.tar.gz::https://github.com/bybrooklyn/openbitdo/releases/download/v0.0.1-rc.1/openbitdo-v0.0.1-rc.1-linux-aarch64.tar.gz
|
||||
sha256sums_aarch64 = 0000000000000000000000000000000000000000000000000000000000000000
|
||||
source_x86_64 = openbitdo-v0.0.1-rc.3-linux-x86_64.tar.gz::https://github.com/bybrooklyn/openbitdo/releases/download/v0.0.1-rc.3/openbitdo-v0.0.1-rc.3-linux-x86_64.tar.gz
|
||||
sha256sums_x86_64 = fa7ae583796dc979a64eaeb670a06fc7c10fd51bbb12fce5815d66629e18c9a0
|
||||
source_aarch64 = openbitdo-v0.0.1-rc.3-linux-aarch64.tar.gz::https://github.com/bybrooklyn/openbitdo/releases/download/v0.0.1-rc.3/openbitdo-v0.0.1-rc.3-linux-aarch64.tar.gz
|
||||
sha256sums_aarch64 = 992586ff89da6dfdb137fd424f651ccedb4a65de0f43d615cda682e31e222dd0
|
||||
|
||||
pkgname = openbitdo-bin
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
pkgname=openbitdo-bin
|
||||
pkgver=0.0.1rc1
|
||||
_upstream_tag=v0.0.1-rc.1
|
||||
pkgver=0.0.1rc3
|
||||
_upstream_tag=v0.0.1-rc.3
|
||||
pkgrel=1
|
||||
pkgdesc="Prebuilt beginner-first clean-room 8BitDo utility"
|
||||
pkgdesc="Open source 8BitDo utility"
|
||||
arch=('x86_64' 'aarch64')
|
||||
url="https://github.com/bybrooklyn/openbitdo"
|
||||
license=('BSD-3-Clause')
|
||||
depends=('hidapi')
|
||||
source_x86_64=("openbitdo-${_upstream_tag}-linux-x86_64.tar.gz::${url}/releases/download/${_upstream_tag}/openbitdo-${_upstream_tag}-linux-x86_64.tar.gz")
|
||||
source_aarch64=("openbitdo-${_upstream_tag}-linux-aarch64.tar.gz::${url}/releases/download/${_upstream_tag}/openbitdo-${_upstream_tag}-linux-aarch64.tar.gz")
|
||||
sha256sums_x86_64=('0000000000000000000000000000000000000000000000000000000000000000')
|
||||
sha256sums_aarch64=('0000000000000000000000000000000000000000000000000000000000000000')
|
||||
sha256sums_x86_64=('fa7ae583796dc979a64eaeb670a06fc7c10fd51bbb12fce5815d66629e18c9a0')
|
||||
sha256sums_aarch64=('992586ff89da6dfdb137fd424f651ccedb4a65de0f43d615cda682e31e222dd0')
|
||||
|
||||
package() {
|
||||
local extracted_dir
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
class Openbitdo < Formula
|
||||
desc "Beginner-first clean-room 8BitDo TUI utility"
|
||||
homepage "https://github.com/bybrooklyn/openbitdo"
|
||||
license "BSD-3-Clause"
|
||||
version "0.0.1-rc.1"
|
||||
|
||||
on_macos do
|
||||
if Hardware::CPU.arm?
|
||||
url "https://github.com/bybrooklyn/openbitdo/releases/download/v0.0.1-rc.1/openbitdo-v0.0.1-rc.1-macos-arm64.tar.gz"
|
||||
sha256 "0000000000000000000000000000000000000000000000000000000000000000"
|
||||
end
|
||||
end
|
||||
|
||||
on_linux do
|
||||
if Hardware::CPU.intel?
|
||||
url "https://github.com/bybrooklyn/openbitdo/releases/download/v0.0.1-rc.1/openbitdo-v0.0.1-rc.1-linux-x86_64.tar.gz"
|
||||
sha256 "0000000000000000000000000000000000000000000000000000000000000000"
|
||||
elsif Hardware::CPU.arm?
|
||||
url "https://github.com/bybrooklyn/openbitdo/releases/download/v0.0.1-rc.1/openbitdo-v0.0.1-rc.1-linux-aarch64.tar.gz"
|
||||
sha256 "0000000000000000000000000000000000000000000000000000000000000000"
|
||||
end
|
||||
end
|
||||
|
||||
# Release automation rewrites checksums in the tap with authoritative values
|
||||
# from published assets.
|
||||
def install
|
||||
bin.install "bin/openbitdo"
|
||||
end
|
||||
|
||||
test do
|
||||
assert_match "openbitdo", shell_output("#{bin}/openbitdo --help")
|
||||
end
|
||||
end
|
||||
@@ -1,14 +1,24 @@
|
||||
# Homebrew Packaging
|
||||
|
||||
Formula source lives in `Formula/openbitdo.rb`.
|
||||
Template source used for release rendering: `Formula/openbitdo.rb.tmpl`.
|
||||
Homebrew publishing uses the separate tap repo `bybrooklyn/homebrew-openbitdo`.
|
||||
|
||||
Planned tap:
|
||||
- `bybrooklyn/homebrew-openbitdo`
|
||||
## Source Of Truth
|
||||
|
||||
Current status:
|
||||
- release workflow computes checksum-pinned formula values from published assets
|
||||
- tap sync remains gated by `HOMEBREW_PUBLISH_ENABLED=1`
|
||||
- template: `packaging/homebrew/Formula/openbitdo.rb.tmpl`
|
||||
- renderer: `packaging/scripts/render_release_metadata.sh`
|
||||
- sync helper: `packaging/homebrew/sync_tap.sh`
|
||||
|
||||
Optional sync helper:
|
||||
- `sync_tap.sh` (disabled by default unless `HOMEBREW_PUBLISH_ENABLED=1`)
|
||||
The main repo does not keep a checked-in rendered formula. Release rendering produces the formula from published assets, and the tap repo is the canonical published destination.
|
||||
|
||||
## Publish Flow
|
||||
|
||||
1. Publish GitHub release assets for a `v*` tag.
|
||||
2. Render a checksum-pinned formula from those assets.
|
||||
3. Upload the rendered formula as a workflow artifact for audit.
|
||||
4. Sync the rendered formula to `bybrooklyn/homebrew-openbitdo`.
|
||||
|
||||
## Required Controls
|
||||
|
||||
- repo variable `HOMEBREW_PUBLISH_ENABLED=1`
|
||||
- repo variable `HOMEBREW_TAP_REPO=bybrooklyn/homebrew-openbitdo`
|
||||
- secret `HOMEBREW_TAP_TOKEN`
|
||||
|
||||
@@ -23,9 +23,22 @@ HOMEBREW_TAP_TOKEN="$(
|
||||
|
||||
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
TAP_REPO="${HOMEBREW_TAP_REPO:-bybrooklyn/homebrew-openbitdo}"
|
||||
FORMULA_SOURCE="${FORMULA_SOURCE:-$ROOT/packaging/homebrew/Formula/openbitdo.rb}"
|
||||
FORMULA_SOURCE="${FORMULA_SOURCE:-}"
|
||||
TMP="$(mktemp -d)"
|
||||
|
||||
decode_base64() {
|
||||
if base64 --help 2>/dev/null | grep -q -- "--decode"; then
|
||||
base64 --decode
|
||||
else
|
||||
base64 -D
|
||||
fi
|
||||
}
|
||||
|
||||
if [[ -z "$FORMULA_SOURCE" ]]; then
|
||||
echo "FORMULA_SOURCE must point to a rendered formula; run render_release_metadata.sh first" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -f "$FORMULA_SOURCE" ]]; then
|
||||
echo "formula source not found: $FORMULA_SOURCE" >&2
|
||||
exit 1
|
||||
@@ -69,7 +82,7 @@ remote_content_file="$TMP/remote_formula.rb"
|
||||
|
||||
if api_with_fallback "repos/${TAP_REPO}/contents/${formula_path}?ref=main" >"$TMP/remote.json" 2>/dev/null; then
|
||||
remote_sha="$(jq -r '.sha // ""' "$TMP/remote.json")"
|
||||
jq -r '.content // ""' "$TMP/remote.json" | tr -d '\n' | base64 --decode >"$remote_content_file"
|
||||
jq -r '.content // ""' "$TMP/remote.json" | tr -d '\n' | decode_base64 >"$remote_content_file"
|
||||
if cmp -s "$FORMULA_SOURCE" "$remote_content_file"; then
|
||||
echo "no formula changes to push"
|
||||
exit 0
|
||||
|
||||
98
packaging/homebrew/test_sync_tap.sh
Executable file
98
packaging/homebrew/test_sync_tap.sh
Executable file
@@ -0,0 +1,98 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
TMP="$(mktemp -d)"
|
||||
trap 'rm -rf "$TMP"' EXIT
|
||||
|
||||
MOCK_BIN="$TMP/bin"
|
||||
mkdir -p "$MOCK_BIN"
|
||||
|
||||
cat >"$MOCK_BIN/gh" <<'EOF'
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
STATE_DIR="${MOCK_GH_STATE_DIR:?}"
|
||||
|
||||
if [[ "${1:-}" != "api" ]]; then
|
||||
echo "mock gh only supports api" >&2
|
||||
exit 1
|
||||
fi
|
||||
shift
|
||||
|
||||
method="GET"
|
||||
if [[ "${1:-}" == "--method" ]]; then
|
||||
method="$2"
|
||||
shift 2
|
||||
fi
|
||||
|
||||
endpoint="$1"
|
||||
shift
|
||||
|
||||
case "${method}:${endpoint}" in
|
||||
GET:repos/*/contents/Formula/openbitdo.rb\?ref=main)
|
||||
if [[ -f "$STATE_DIR/remote_formula.rb" ]]; then
|
||||
content="$(base64 < "$STATE_DIR/remote_formula.rb" | tr -d '\n')"
|
||||
printf '{"sha":"remote-sha","content":"%s"}\n' "$content"
|
||||
exit 0
|
||||
fi
|
||||
exit 1
|
||||
;;
|
||||
PUT:repos/*/contents/Formula/openbitdo.rb)
|
||||
content=""
|
||||
while [[ $# -gt 0 ]]; do
|
||||
if [[ "$1" == "-f" ]]; then
|
||||
case "$2" in
|
||||
content=*)
|
||||
content="${2#content=}"
|
||||
;;
|
||||
esac
|
||||
shift 2
|
||||
else
|
||||
shift
|
||||
fi
|
||||
done
|
||||
printf '%s' "$content" | base64 --decode >"$STATE_DIR/updated_formula.rb"
|
||||
echo "put" >>"$STATE_DIR/requests.log"
|
||||
printf '{"content":{"sha":"new-sha"}}\n'
|
||||
;;
|
||||
*)
|
||||
echo "unexpected mock gh call: ${method} ${endpoint}" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
EOF
|
||||
chmod +x "$MOCK_BIN/gh"
|
||||
|
||||
FORMULA_SOURCE="$TMP/openbitdo.rb"
|
||||
cat >"$FORMULA_SOURCE" <<'EOF'
|
||||
class Openbitdo < Formula
|
||||
desc "OpenBitdo"
|
||||
end
|
||||
EOF
|
||||
|
||||
run_sync() {
|
||||
PATH="$MOCK_BIN:$PATH" \
|
||||
MOCK_GH_STATE_DIR="$TMP/mock-state" \
|
||||
GH_TOKEN="job-token" \
|
||||
HOMEBREW_TAP_TOKEN="tap-token" \
|
||||
HOMEBREW_TAP_REPO="bybrooklyn/homebrew-openbitdo" \
|
||||
HOMEBREW_PUBLISH_ENABLED="1" \
|
||||
FORMULA_SOURCE="$FORMULA_SOURCE" \
|
||||
bash "$ROOT/packaging/homebrew/sync_tap.sh"
|
||||
}
|
||||
|
||||
mkdir -p "$TMP/mock-state"
|
||||
cp "$FORMULA_SOURCE" "$TMP/mock-state/remote_formula.rb"
|
||||
run_sync >"$TMP/noop.out"
|
||||
grep -Fq "no formula changes to push" "$TMP/noop.out"
|
||||
test ! -f "$TMP/mock-state/updated_formula.rb"
|
||||
|
||||
cat >"$TMP/mock-state/remote_formula.rb" <<'EOF'
|
||||
class Openbitdo < Formula
|
||||
desc "Old formula"
|
||||
end
|
||||
EOF
|
||||
run_sync >"$TMP/update.out"
|
||||
grep -Fq "updated bybrooklyn/homebrew-openbitdo:Formula/openbitdo.rb" "$TMP/update.out"
|
||||
cmp -s "$FORMULA_SOURCE" "$TMP/mock-state/updated_formula.rb"
|
||||
63
packaging/scripts/test_render_release_metadata.sh
Executable file
63
packaging/scripts/test_render_release_metadata.sh
Executable file
@@ -0,0 +1,63 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
TMP="$(mktemp -d)"
|
||||
trap 'rm -rf "$TMP"' EXIT
|
||||
|
||||
sha256() {
|
||||
if command -v sha256sum >/dev/null 2>&1; then
|
||||
sha256sum "$1" | awk '{print $1}'
|
||||
else
|
||||
shasum -a 256 "$1" | awk '{print $1}'
|
||||
fi
|
||||
}
|
||||
|
||||
INPUT_DIR="$TMP/input"
|
||||
OUTPUT_DIR="$TMP/output"
|
||||
mkdir -p "$INPUT_DIR"
|
||||
|
||||
printf 'x86_64 archive payload\n' >"$INPUT_DIR/openbitdo-v0.0.1-rc.4-linux-x86_64.tar.gz"
|
||||
printf 'aarch64 archive payload\n' >"$INPUT_DIR/openbitdo-v0.0.1-rc.4-linux-aarch64.tar.gz"
|
||||
printf 'macos archive payload\n' >"$INPUT_DIR/openbitdo-v0.0.1-rc.4-macos-arm64.tar.gz"
|
||||
|
||||
bash "$ROOT/packaging/scripts/render_release_metadata.sh" \
|
||||
"v0.0.1-rc.4" \
|
||||
"bybrooklyn/openbitdo" \
|
||||
"$INPUT_DIR" \
|
||||
"$OUTPUT_DIR"
|
||||
|
||||
PKGBUILD="$OUTPUT_DIR/aur/openbitdo-bin/PKGBUILD"
|
||||
FORMULA="$OUTPUT_DIR/homebrew/Formula/openbitdo.rb"
|
||||
CHECKSUMS="$OUTPUT_DIR/checksums.env"
|
||||
|
||||
test -f "$PKGBUILD"
|
||||
test -f "$FORMULA"
|
||||
test -f "$CHECKSUMS"
|
||||
|
||||
expected_x86="$(sha256 "$INPUT_DIR/openbitdo-v0.0.1-rc.4-linux-x86_64.tar.gz")"
|
||||
expected_aarch64="$(sha256 "$INPUT_DIR/openbitdo-v0.0.1-rc.4-linux-aarch64.tar.gz")"
|
||||
expected_macos="$(sha256 "$INPUT_DIR/openbitdo-v0.0.1-rc.4-macos-arm64.tar.gz")"
|
||||
|
||||
grep -Fq "pkgver=0.0.1rc4" "$PKGBUILD"
|
||||
grep -Fq "_upstream_tag=v0.0.1-rc.4" "$PKGBUILD"
|
||||
grep -Fq "sha256sums_x86_64=('${expected_x86}')" "$PKGBUILD"
|
||||
grep -Fq "sha256sums_aarch64=('${expected_aarch64}')" "$PKGBUILD"
|
||||
|
||||
grep -Fq 'version "0.0.1-rc.4"' "$FORMULA"
|
||||
grep -Fq "sha256 \"${expected_x86}\"" "$FORMULA"
|
||||
grep -Fq "sha256 \"${expected_aarch64}\"" "$FORMULA"
|
||||
grep -Fq "sha256 \"${expected_macos}\"" "$FORMULA"
|
||||
grep -Fq 'https://github.com/bybrooklyn/openbitdo/releases/download/v0.0.1-rc.4/openbitdo-v0.0.1-rc.4-linux-x86_64.tar.gz' "$FORMULA"
|
||||
|
||||
if grep -nE '@[A-Z0-9_]+@' "$PKGBUILD" "$FORMULA"; then
|
||||
echo "rendered metadata still contains template placeholders" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
grep -Fq "TAG=v0.0.1-rc.4" "$CHECKSUMS"
|
||||
grep -Fq "VERSION=0.0.1-rc.4" "$CHECKSUMS"
|
||||
grep -Fq "AUR_PKGVER=0.0.1rc4" "$CHECKSUMS"
|
||||
grep -Fq "LINUX_X86_64_SHA256=${expected_x86}" "$CHECKSUMS"
|
||||
grep -Fq "LINUX_AARCH64_SHA256=${expected_aarch64}" "$CHECKSUMS"
|
||||
grep -Fq "MACOS_ARM64_SHA256=${expected_macos}" "$CHECKSUMS"
|
||||
Reference in New Issue
Block a user