publish.sh
2.9 kB · shellscript · 125 lines
1#!/usr/bin/env bash23set -euo pipefail45HERE="$(cd "$(dirname "$0")" && pwd)"6[ -n "${CARGO_LOCK:-}" ] || exec "$HERE/cargo.sh" "$HERE/publish.sh" "$@"7cd "$HERE/.."89USAGE="usage: publish.sh <rs|py|js> [--dry]"10MANIFEST=pkgs/mrlypy/Cargo.toml11WHEELS=target/wheels1213target=""14dry=""15for word in "$@"; do16 case "$word" in17 rs|py|js) target="$word" ;;18 --dry) dry=1 ;;19 *) echo "$USAGE" >&2; exit 1 ;;20 esac21done22[ -n "$target" ] || { echo "$USAGE" >&2; exit 1; }2324# SHELL2526step() {27 local name="$1"; shift28 echo "== $name"29 "$@" || { echo "publish stopped at $name" >&2; exit 1; }30}3132need() {33 [ -n "${!1:-}" ] || { echo "publish needs $1 in the environment" >&2; exit 1; }34}3536tokens() {37 if [ "$target" = js ]; then need NPM_CONFIG_TOKEN; fi38 if [ -n "$dry" ]; then return 0; fi39 if [ "$target" = rs ]; then need CARGO_REGISTRY_TOKEN; fi40 if [ "$target" = py ]; then need UV_PUBLISH_USERNAME; need UV_PUBLISH_PASSWORD; fi41}4243# GATES4445clean() {46 local dirty47 dirty="$(git status --porcelain)"48 [ -n "$dirty" ] || return 049 echo "$dirty"50 echo "the tree is dirty; commit or rerun the generator" >&251 return 152}5354crate_version() { sed -n 's/^version = "\(.*\)"/\1/p' "$1" | head -1; }5556json_version() { sed -n 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$1" | head -1; }5758versions() {59 local rs py bridge js60 rs="$(crate_version pkgs/mrlyrs/Cargo.toml)"61 py="$(crate_version pkgs/mrlypy/pyproject.toml)"62 bridge="$(crate_version pkgs/mrlypy/Cargo.toml)"63 js="$(json_version pkgs/mrlyjs/package.json)"64 echo " mrlyrs $rs, mrlypy $py, mrlypy crate $bridge, mrlyjs $js"65 [ "$rs" = "$py" ] && [ "$rs" = "$bridge" ] && [ "$rs" = "$js" ] && return 066 echo "the versions differ; one number ships all three" >&267 return 168}6970tests() {71 cargo test -p mrlyrs -p bridge72 uv run --no-project --with pytest --with ./pkgs/mrlypy pytest pkgs/mrlypy73 bun --cwd pkgs/mrlyjs test74}7576# RS7778rs() {79 if [ -n "$dry" ]; then80 step "cargo publish --dry-run" cargo publish -p mrlyrs --dry-run81 return 082 fi83 step "cargo publish" cargo publish -p mrlyrs84}8586# PY8788wheel() { uvx maturin build --release -m "$MANIFEST" "$@"; }8990uv_publish() { uv publish "$WHEELS"/*; }9192py() {93 rm -rf "$WHEELS"94 step "wheel macos arm64" wheel95 step "wheel linux x86_64" wheel --zig --target x86_64-unknown-linux-gnu96 step "wheel linux aarch64" wheel --zig --target aarch64-unknown-linux-gnu97 step "sdist" uvx maturin sdist -m "$MANIFEST"98 if [ -n "$dry" ]; then99 step "uv publish skipped" ls -1 "$WHEELS"100 return 0101 fi102 step "uv publish" uv_publish103}104105# JS106107bun_publish() { (cd pkgs/mrlyjs && bun publish "$@"); }108109js() {110 step "wasm" scripts/wasm.sh111 if [ -n "$dry" ]; then112 step "bun publish --dry-run" bun_publish --dry-run113 return 0114 fi115 step "bun publish" bun_publish116}117118# MAIN119120step "tokens" tokens121step "bridge" scripts/bridge.sh122step "clean" clean123step "versions" versions124step "tests" tests125"$target"