gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1543Shell 203Rust 109Markdown 993728 Definiciones

⎇ 7a0c1b7eae74e07b0b701ca8f674fc75884c6c3c scripts/espejo-setup.sh Shell · 95 líneas · 4.5 KB Historia crudo

takana: espejo de GitHub renombrado, y las dos colas que quedaban f9ed89cd1 · Sergio ·

1#!/usr/bin/env bash
2# espejo-setup.sh — deja este clon con espejo doble y con git endurecido contra cortes sucios.
3#
4# POR QUÉ EXISTE: las dos cosas que configura viven en `.git/config`, que **no se versiona**. Es
5# decir: se pierden exactamente en el escenario para el que se pusieron (el laptop muere, clonás de
6# nuevo). Este script las vuelve a poner en un paso, y es idempotente, así que se puede correr sobre
7# un clon ya configurado sin duplicar nada.
8#
9# QUÉ CONFIGURA
10#
11# 1. PUSH A LOS DOS REMOTOS. `origin` fetchea de gitea (canónico) pero empuja a gitea Y a GitHub.
12#    Se hace con `--add --push` en vez de un remoto `github` aparte para que TODO `git push origin
13#    main` que ya existe en los scripts (p.ej. cosecha-cron.sh) espeje solo, sin tocar un script.
14#    Motivo del espejo (2026-07-22): git.tawasuyu.net resuelve a gioser, marcado como FIJO y SIN
15#    BACKUP. Sin GitHub, las dos únicas copias eran el laptop —que ya se corrompió una vez por un
16#    corte sucio— y esa. El espejo es PRIVADO.
17#
18#    OJO con la credencial: las claves SSH del laptop son todas DEPLOY KEYS de otros repos (dan
19#    "Repository not found" contra este). Por eso el remoto de GitHub va por HTTPS con el token de
20#    `gh` como credential helper. Si `gh auth status` no está logueado, esto no va a empujar.
21#
22#    Si GitHub está caído o el token venció, `git push origin main` devuelve != 0 aunque gitea haya
23#    aceptado. cosecha-cron.sh ya lo tolera (loguea "push falló, reintenta próximo ciclo"), así que
24#    el latido no se rompe por eso.
25#
26# 2. GIT CON fsync. git 2.55 NO fsyncea los loose objects por defecto. Con un kernel rc que corta
27#    sucio, ext4 deja el inode con su mtime y el contenido en cero: el 2026-07-22 eso dejó 6 objects
28#    vacíos + refs + reflog en NULs y el repo con "fatal: bad object HEAD". Se recuperó entero sólo
29#    porque el push a gitea había llegado. Con esto, no vuelve a pasar por esa vía.
30#
31# Uso:  scripts/espejo-setup.sh [--check]
32set -uo pipefail
33
34GITHUB="${GITHUB:-https://github.com/sergiovelasquezzeballos/takana.git}"
35ROOT="$(cd "$(dirname "$0")/.." && pwd)"
36cd "$ROOT"
37
38# El gitea canónico NO se hardcodea: se lee del origin de ESTE clon. Motivo (2026-08-10, gioser):
39# estaba fijo en `ssh://…git.tawasuyu.net:2345/…` y el clon de gioser fetchea de
40# `gitea@git.gioser.net:…` — misma máquina, pero otra forma de URL y otro puerto. Correrlo tal cual
41# hacía `--unset-all` y le cambiaba el destino canónico al clon sin decir nada, que es la clase de
42# cambio que no se nota hasta que un push va a donde no era. El fallback sólo aplica si no hay origin.
43GITEA="${GITEA:-$(git remote get-url origin 2>/dev/null)}"
44GITEA="${GITEA:-ssh://gitea@git.tawasuyu.net:2345/sergio/takana.git}"
45
46CHECK=0
47[ "${1:-}" = "--check" ] && CHECK=1
48
49ok()   { printf '  ✓ %s\n' "$1"; }
50warn() { printf '  ⚠ %s\n' "$1"; }
51
52echo "espejo-setup en $ROOT"
53
54# --- 1. push a los dos ---
55actuales="$(git remote get-url --push --all origin 2>/dev/null || true)"
56falta=0
57printf '%s\n' "$actuales" | grep -qF "$GITEA"  || falta=1
58printf '%s\n' "$actuales" | grep -qF "$GITHUB" || falta=1
59
60if [ "$falta" = "0" ]; then
61  ok "origin ya empuja a gitea y a GitHub"
62elif [ "$CHECK" = "1" ]; then
63  warn "origin NO empuja a los dos (corré sin --check para arreglarlo)"
64else
65  # Reconstruir de cero: los pushurl son acumulativos y re-correr sin limpiar duplicaría.
66  git config --unset-all remote.origin.pushurl 2>/dev/null || true
67  git remote set-url --add --push origin "$GITEA"
68  git remote set-url --add --push origin "$GITHUB"
69  ok "origin empuja ahora a gitea y a GitHub"
70fi
71
72# --- 2. fsync ---
73FSYNC="loose-object,pack,pack-metadata,commit-graph,index,reference"
74if [ "$(git config --get core.fsync 2>/dev/null)" = "$FSYNC" ]; then
75  ok "core.fsync ya endurecido"
76elif [ "$CHECK" = "1" ]; then
77  warn "core.fsync SIN endurecer (corré sin --check para arreglarlo)"
78else
79  git config core.fsync "$FSYNC"
80  git config core.fsyncMethod fsync
81  ok "core.fsync endurecido"
82fi
83
84# --- credencial de GitHub: avisar temprano, no fallar al primer push ---
85if command -v gh >/dev/null 2>&1; then
86  if gh auth status >/dev/null 2>&1; then
87    ok "gh autenticado (el push a GitHub va por HTTPS con su token)"
88  else
89    warn "gh NO autenticado ⇒ el push a GitHub va a fallar. Corré: gh auth login && gh auth setup-git"
90  fi
91else
92  warn "no hay gh instalado ⇒ el push a GitHub va a fallar. Instalalo y corré: gh auth login && gh auth setup-git"
93fi
94
95echo "listo. Verificar:  git push origin main   (debe reportar DOS veces, una por remoto)"