mirror of
https://github.com/ArchiveBox/ArchiveBox.git
synced 2026-04-06 07:47:53 +10:00
- Fix debian.yml: pin nfpm version, add permissions, improve test job with user creation, init test, and status check - Fix homebrew.yml: use PyPI JSON API (macOS-compatible, no grep -oP), wait for PyPI availability on release, use generated formula not template, add Linux (Linuxbrew) test job alongside macOS - Add release.yml orchestrator: pip → deb + brew + docker in order - Add workflow_call triggers to pip.yml and docker.yml - Fix build_brew.sh: replace grep -oP with Python-based PyPI API, add on_linux deps (pkg-config, openssl, libffi) - Fix setup.sh: use GitHub API to find correct .deb download URL (filename includes version number) - Fix postinstall.sh: create archivebox system user, pin version from package, check for systemd before daemon-reload - Fix preremove.sh: stop service before removal, check for systemd - Fix install.sh: fallback to latest if pinned version not on PyPI - Add on_linux deps to brew formula for Linuxbrew support - Tested: .deb builds, installs, creates user, runs archivebox init https://claude.ai/code/session_01Vx1EsNrNySgsc8Y67dGzCn
117 lines
3.7 KiB
Bash
Executable File
117 lines
3.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
### Bash Environment Setup
|
|
# http://redsymbol.net/articles/unofficial-bash-strict-mode/
|
|
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
|
# set -o xtrace
|
|
set -o errexit
|
|
set -o errtrace
|
|
set -o nounset
|
|
set -o pipefail
|
|
IFS=$'\n'
|
|
|
|
REPO_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && cd .. && pwd )"
|
|
cd "$REPO_DIR"
|
|
|
|
VERSION="$(grep '^version = ' "${REPO_DIR}/pyproject.toml" | awk -F'"' '{print $2}')"
|
|
FORMULA_FILE="$REPO_DIR/brew_dist/archivebox.rb"
|
|
|
|
echo "[+] Building Homebrew formula for archivebox==${VERSION}..."
|
|
|
|
# Create a temporary virtualenv for generating the formula
|
|
TMPDIR="$(mktemp -d)"
|
|
trap "rm -rf $TMPDIR" EXIT
|
|
|
|
python3 -m venv "$TMPDIR/venv"
|
|
source "$TMPDIR/venv/bin/activate"
|
|
|
|
pip install --quiet "archivebox==${VERSION}" homebrew-pypi-poet 2>/dev/null
|
|
|
|
echo "[+] Generating resource stanzas with homebrew-pypi-poet..."
|
|
RESOURCES="$(poet archivebox)"
|
|
|
|
# Get the sdist URL and SHA256 from PyPI JSON API (works on macOS and Linux)
|
|
PYPI_JSON="$(curl -fsSL "https://pypi.org/pypi/archivebox/${VERSION}/json" 2>/dev/null || echo '')"
|
|
if [ -n "$PYPI_JSON" ]; then
|
|
SDIST_URL="$(echo "$PYPI_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(next((u['url'] for u in d['urls'] if u['packagetype']=='sdist'), ''))" 2>/dev/null || echo '')"
|
|
SDIST_SHA256="$(echo "$PYPI_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(next((u['digests']['sha256'] for u in d['urls'] if u['packagetype']=='sdist'), ''))" 2>/dev/null || echo '')"
|
|
fi
|
|
if [ -z "$SDIST_URL" ]; then
|
|
SDIST_URL="https://files.pythonhosted.org/packages/source/a/archivebox/archivebox-${VERSION}.tar.gz"
|
|
fi
|
|
if [ -z "$SDIST_SHA256" ]; then
|
|
# Fallback: download and compute locally
|
|
mkdir -p "$TMPDIR/sdist"
|
|
pip download --no-binary :all: --no-deps -d "$TMPDIR/sdist" "archivebox==${VERSION}" 2>/dev/null || true
|
|
SDIST_SHA256="$(shasum -a 256 "$TMPDIR/sdist/"*.tar.gz 2>/dev/null | awk '{print $1}' || echo '')"
|
|
fi
|
|
|
|
deactivate
|
|
|
|
echo "[+] Updating formula file: $FORMULA_FILE"
|
|
|
|
# Build the formula from the template
|
|
cat > "$FORMULA_FILE" << RUBY
|
|
# This formula is auto-generated by bin/build_brew.sh using homebrew-pypi-poet.
|
|
# To update: run bin/build_brew.sh, or trigger the GitHub Actions homebrew workflow.
|
|
#
|
|
# Users install with:
|
|
# brew tap archivebox/archivebox
|
|
# brew install archivebox
|
|
|
|
class Archivebox < Formula
|
|
include Language::Python::Virtualenv
|
|
|
|
desc "Self-hosted internet archiving solution"
|
|
homepage "https://github.com/ArchiveBox/ArchiveBox"
|
|
url "${SDIST_URL}"
|
|
sha256 "${SDIST_SHA256}"
|
|
license "MIT"
|
|
head "https://github.com/ArchiveBox/ArchiveBox.git", branch: "dev"
|
|
|
|
depends_on "python@3.13"
|
|
depends_on "node"
|
|
depends_on "git"
|
|
depends_on "wget"
|
|
depends_on "curl"
|
|
depends_on "ripgrep"
|
|
depends_on "yt-dlp"
|
|
|
|
on_linux do
|
|
depends_on "pkg-config" => :build
|
|
depends_on "openssl@3"
|
|
depends_on "libffi"
|
|
end
|
|
|
|
# Python dependency resource blocks auto-generated by homebrew-pypi-poet
|
|
# AUTOGENERATED_RESOURCES_START
|
|
${RESOURCES}
|
|
# AUTOGENERATED_RESOURCES_END
|
|
|
|
def install
|
|
virtualenv_install_with_resources
|
|
end
|
|
|
|
def post_install
|
|
# Install runtime dependencies (plugins, JS extractors, etc.)
|
|
system bin/"archivebox", "install", "--binproviders", "pip,npm"
|
|
end
|
|
|
|
service do
|
|
run [opt_bin/"archivebox", "server", "--quick-init", "0.0.0.0:8000"]
|
|
keep_alive crashed: true
|
|
working_dir var/"archivebox"
|
|
log_path var/"log/archivebox.log"
|
|
error_log_path var/"log/archivebox.log"
|
|
end
|
|
|
|
test do
|
|
assert_match version.to_s, shell_output("#{bin}/archivebox version")
|
|
end
|
|
end
|
|
RUBY
|
|
|
|
echo "[√] Formula updated: $FORMULA_FILE"
|
|
echo " Version: ${VERSION}"
|
|
echo " URL: ${SDIST_URL}"
|