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"