#!/bin/zsh # ============================================================ # OpenCut Ronald - admin/update.command # # ATUALIZACOES: deixa a arvore pronta para rodar/commitar. # 1. Sincroniza as dependencias Python do venv de producao # 2. Rebuild dos paineis CEP/UXP (so se a fonte mudou) # 3. Testes (painel + backend) # # Nao commita, nao faz push e nao sobe servidor - isso e trabalho do # commit.command e do deploy.command. Rode-o sozinho quando quiser so # revalidar a arvore, ou deixe o OpenCut.command chamar tudo em ordem. # # Uso: # admin/update.command ciclo completo # SKIP_TESTS=1 admin/update.command pula os testes # SKIP_DEPS=1 admin/update.command pula a sincronia de dependencias # ============================================================ set -u ROOT="$(cd "$(dirname "$0")/.." && pwd -P)" CODE="$ROOT/code" PANEL="$CODE/extension/com.opencut.panel" UXP="$CODE/extension/com.opencut.uxp" # venv de producao (o mesmo que start-opencut.sh usa). Um segundo venv em # code/.venv ja existiu e divergiu deste - foi assim que o painel passou a # mostrar "Bridge stopped": o servidor subiu num ambiente sem websockets. VENV="/Volumes/Merongo/Library/Application Support/OpenCut/venv" VENV_PY="$VENV/bin/python" # Python 3.14 currently crashes in native test dependencies on macOS. Use the # repository's Python 3.13 test environment when available; production keeps # using the dedicated venv above. TEST_VENV_PY="$CODE/.venv/bin/python" GRN="$(tput setaf 2 2>/dev/null)"; YLW="$(tput setaf 3 2>/dev/null)" RD="$(tput setaf 1 2>/dev/null)"; BLU="$(tput setaf 4 2>/dev/null)" NC="$(tput sgr0 2>/dev/null)" say() { echo "${BLU}== ${NC}$*"; } ok() { echo "${GRN}-> OK ${NC}$*"; } warn() { echo "${YLW}-> Aviso: ${NC}$*"; } die() { echo "${RD}-> Erro: ${NC}$*" >&2; exit 1; } FAILED=0 cd "$ROOT" || die "nao consegui entrar em $ROOT" # Match start-opencut.sh so tests write logs/caches to the Merongo runtime and # resolve the security-approved media binaries. export HOME="$CODE/.opencut-runtime/home" export OPENCUT_HOME="$HOME/.opencut" export XDG_CACHE_HOME="$CODE/.opencut-runtime/cache" export XDG_CONFIG_HOME="$CODE/.opencut-runtime/config" export HF_HOME="/Volumes/Merongo/SISTEMAS/MODELOSIA/hf-cache" export WHISPER_MODELS_DIR="/Volumes/Merongo/SISTEMAS/MODELOSIA" export TORCH_HOME="/Volumes/Merongo/SISTEMAS/MODELOSIA/torch-cache" mkdir -p "$HOME" "$OPENCUT_HOME" "$XDG_CACHE_HOME" "$XDG_CONFIG_HOME" echo "${BLU}============================================================${NC}" say "update.command - dependencias + build + testes" echo "${BLU}============================================================${NC}" echo # ------------------------------------------------------------ # 1) Dependencias Python # ------------------------------------------------------------ if [ "${SKIP_DEPS:-0}" = "1" ]; then ok "SKIP_DEPS=1 - pulando dependencias" elif [ ! -x "$VENV_PY" ]; then warn "venv de producao nao encontrado em $VENV (o disco Merongo esta montado?)" else say "Sincronizando dependencias com code/requirements.txt" if "$VENV_PY" -m pip install -q -r "$CODE/requirements.txt"; then ok "dependencias em dia" else warn "pip install falhou" FAILED=1 fi # Guarda-costas do bug do "Bridge stopped": a ponte importa websockets # direto, e sem ele o /ws/start responde 400 e o painel fica parado. if "$VENV_PY" -c "import websockets" >/dev/null 2>&1; then ok "websockets presente (ponte de live-updates pode subir)" else warn "websockets AUSENTE - a ponte de live-updates vai falhar" FAILED=1 fi fi echo # ------------------------------------------------------------ # 2) Build dos paineis (so se a fonte mudou) # ------------------------------------------------------------ CHANGES="$(git status --porcelain 2>/dev/null || true)" if echo "$CHANGES" | grep -qE 'code/extension/(com\.opencut\.panel|com\.opencut\.uxp)/'; then say "Fonte dos paineis alterada - regenerando build" if ( cd "$PANEL" && npm run build >/dev/null 2>&1 ); then ok "build com.opencut.panel" else warn "build do painel falhou" FAILED=1 fi if [ -f "$UXP/package.json" ]; then if ( cd "$UXP" && npm run build >/dev/null 2>&1 ); then ok "build com.opencut.uxp" else warn "build do uxp falhou" FAILED=1 fi fi else ok "Fonte dos paineis inalterada - sem rebuild" fi echo # ------------------------------------------------------------ # 3) Testes # ------------------------------------------------------------ if [ "${SKIP_TESTS:-0}" = "1" ]; then ok "SKIP_TESTS=1 - pulando testes" else say "Testes do painel (vitest)" if ( cd "$PANEL" && npm test >/dev/null 2>&1 ); then ok "testes do painel passaram" else warn "testes do painel FALHARAM - rode: (cd \"$PANEL\" && npm test)" FAILED=1 fi if [ -x "$TEST_VENV_PY" ] || [ -x "$VENV_PY" ]; then say "Testes do backend (pytest)" TEST_PY="$TEST_VENV_PY" [ -x "$TEST_PY" ] || TEST_PY="$VENV_PY" if ! "$TEST_PY" -c "import pytest" >/dev/null 2>&1; then "$TEST_PY" -m pip install -q pytest >/dev/null 2>&1 || true fi if "$TEST_PY" -c "import pytest" >/dev/null 2>&1; then # O backend usa o FFmpeg do projeto (governado pelo gate de CVEs em # start-opencut.sh). Os testes precisam do MESMO PATH, senĂ£o pegam o # ffmpeg do sistema (ex: Homebrew 8.1) e caem no FfmpegSecurityError. if [ -x "/Volumes/Merongo/SISTEMAS/OPENCUT-MEDIA/ffmpeg/bin/ffmpeg" ]; then export PATH="/Volumes/Merongo/SISTEMAS/OPENCUT-MEDIA/ffmpeg/bin:$PATH" fi if ( cd "$CODE" && "$TEST_PY" -m pytest -q --tb=short ); then ok "testes do backend passaram" else warn "testes do backend FALHARAM" FAILED=1 fi else warn "pytest indisponivel - testes do backend pulados" fi fi fi echo if [ "$FAILED" = "0" ]; then ok "Atualizacao concluida sem pendencias." exit 0 fi warn "Atualizacao concluida COM avisos - reveja os itens acima antes de commitar." exit 1