#!/usr/bin/env bash # Escritor único de versión + tag de un paquete del toolbox. # Uso: scripts/release set -euo pipefail if [ "$#" -lt 2 ]; then echo "Uso: scripts/release " >&2 exit 1 fi PACKAGE="$1" TYPE="$2" ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" MANIFEST="$ROOT/packages/$PACKAGE/duckbrain.json" if [ ! -f "$MANIFEST" ]; then echo "No existe el paquete '$PACKAGE' ($MANIFEST)" >&2 exit 1 fi case "$TYPE" in patch|minor|major) ;; *) echo "Incremento inválido: '$TYPE' (usa patch|minor|major)" >&2; exit 1 ;; esac VERSION="$(php -r '$d=json_decode(file_get_contents($argv[1]),true); echo $d["version"] ?? "";' "$MANIFEST")" if [ -z "$VERSION" ]; then echo "El manifiesto no declara 'version': $MANIFEST" >&2 exit 1 fi NEW_VERSION="$(php -r ' $v = ltrim($argv[1], "vV"); $type = $argv[2]; $p = explode(".", preg_replace("/[-+].*/", "", $v)); $p = array_pad($p, 3, 0); $p = array_map("intval", $p); if ($type === "major") { $p[0]++; $p[1] = 0; $p[2] = 0; } elseif ($type === "minor") { $p[1]++; $p[2] = 0; } else { $p[2]++; } echo implode(".", $p); ' "$VERSION" "$TYPE")" php -r ' $file = $argv[1]; $data = json_decode(file_get_contents($file), true); $data["version"] = $argv[2]; file_put_contents($file, json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\n"); ' "$MANIFEST" "$NEW_VERSION" TAG="$PACKAGE-v$NEW_VERSION" git -C "$ROOT" add -- "$MANIFEST" git -C "$ROOT" commit -q -m "release($PACKAGE): v$NEW_VERSION" git -C "$ROOT" tag -a "$TAG" -m "release($PACKAGE): v$NEW_VERSION" if git -C "$ROOT" remote get-url origin >/dev/null 2>&1; then git -C "$ROOT" push -q origin HEAD --follow-tags fi echo "release $PACKAGE v$NEW_VERSION ($TAG)"