154 lines
4.7 KiB
Bash
Executable file
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"
|