model-boss/scripts/dev-publish.sh
autocommit a347b86d8a chore(core-ts): 🔧 Update TypeScript version to 5.3 for core dependencies
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-10 14:45:51 -07:00

154 lines
4.7 KiB
Bash
Executable file

#!/usr/bin/env bash
# =============================================================================
# Dev Publish - Quick publish Python packages to Forgejo PyPI
# =============================================================================
# Usage:
# ./scripts/dev-publish.sh # Publish all Python packages
# ./scripts/dev-publish.sh core # Publish core only
# ./scripts/dev-publish.sh loaders # Publish loaders only
# ./scripts/dev-publish.sh --dev # Publish with dev version suffix
#
# The Forgejo PyPI registry at forge.black.lan serves as both the "production"
# and "dev" registry. Dev versions use timestamp suffixes (e.g., 3.0.2.dev1234567890)
# to avoid conflicting with release versions.
#
# Consumer install:
# pip install --trusted-host forge.black.lan \
# --extra-index-url http://forge.black.lan/api/packages/lilith/pypi/simple/ \
# lilith-model-boss>=3.0.0
# =============================================================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
REGISTRY_URL="http://forge.black.lan/api/packages/lilith/pypi/"
PACKAGES_DIR="$REPO_ROOT/packages"
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# Parse args
TARGET="${1:-all}"
DEV_MODE=false
for arg in "$@"; do
if [[ "$arg" == "--dev" ]]; then
DEV_MODE=true
fi
done
publish_package() {
local pkg_dir="$1"
local pkg_name
local pkg_version
if [[ ! -f "$pkg_dir/pyproject.toml" ]]; then
echo -e "${RED}No pyproject.toml in $pkg_dir${NC}"
return 1
fi
pkg_name=$(python3 -c "import tomllib; print(tomllib.load(open('$pkg_dir/pyproject.toml', 'rb'))['project']['name'])")
pkg_version=$(python3 -c "import tomllib; print(tomllib.load(open('$pkg_dir/pyproject.toml', 'rb'))['project']['version'])")
if [[ "$DEV_MODE" == "true" ]]; then
local dev_suffix
dev_suffix=$(date +%s)
pkg_version="${pkg_version}.dev${dev_suffix}"
echo -e "${YELLOW}Dev publish: $pkg_name@$pkg_version${NC}"
# Temporarily patch version in pyproject.toml
local original_version
original_version=$(python3 -c "import tomllib; print(tomllib.load(open('$pkg_dir/pyproject.toml', 'rb'))['project']['version'])")
python3 -c "
import re
with open('$pkg_dir/pyproject.toml', 'r') as f:
content = f.read()
content = re.sub(r'version = \"$original_version\"', 'version = \"$pkg_version\"', content, count=1)
with open('$pkg_dir/pyproject.toml', 'w') as f:
f.write(content)
"
trap "python3 -c \"
import re
with open('$pkg_dir/pyproject.toml', 'r') as f:
content = f.read()
content = re.sub(r'version = \\\"$pkg_version\\\"', 'version = \\\"$original_version\\\"', content, count=1)
with open('$pkg_dir/pyproject.toml', 'w') as f:
f.write(content)
\"" EXIT
else
echo -e "${GREEN}Publishing: $pkg_name@$pkg_version${NC}"
fi
# Clean previous builds
rm -rf "$pkg_dir/dist"
# Build
echo " Building..."
(cd "$pkg_dir" && python3 -m build --wheel --no-isolation 2>&1 | tail -2)
# Upload
echo " Uploading to Forgejo PyPI..."
if twine_output=$(twine upload \
--repository-url "$REGISTRY_URL" \
--username __token__ \
--password "$(grep 'password' ~/.pypirc | head -1 | awk '{print $3}')" \
"$pkg_dir/dist/"*.whl 2>&1); then
echo -e " ${GREEN}Published $pkg_name@$pkg_version${NC}"
else
if echo "$twine_output" | grep -qi "already exists\|conflict\|409"; then
echo -e " ${YELLOW}$pkg_version already exists (skipping)${NC}"
else
echo -e " ${RED}Upload failed:${NC}"
echo " $twine_output"
return 1
fi
fi
# Reset trap if dev mode (version already restored inline)
if [[ "$DEV_MODE" == "true" ]]; then
trap - EXIT
python3 -c "
import re
with open('$pkg_dir/pyproject.toml', 'r') as f:
content = f.read()
content = re.sub(r'version = \"$pkg_version\"', 'version = \"$original_version\"', content, count=1)
with open('$pkg_dir/pyproject.toml', 'w') as f:
f.write(content)
"
fi
echo ""
}
# Ensure build tools available
python3 -m pip install --quiet build twine 2>/dev/null
case "$TARGET" in
core)
publish_package "$PACKAGES_DIR/core-py"
;;
loaders)
publish_package "$PACKAGES_DIR/loaders-py"
;;
all)
echo "Publishing all Python packages..."
echo ""
publish_package "$PACKAGES_DIR/core-py"
publish_package "$PACKAGES_DIR/loaders-py"
;;
*)
echo "Usage: $0 [core|loaders|all] [--dev]"
exit 1
;;
esac
echo -e "${GREEN}Done.${NC}"
echo ""
echo "Consumer install:"
echo " pip install --trusted-host forge.black.lan \\"
echo " --extra-index-url http://forge.black.lan/api/packages/lilith/pypi/simple/ \\"
echo " lilith-model-boss>=3.0.0 lilith-model-boss-loaders>=1.0.0"