Los 606 repos por commit son el 52% de las fuentes y el mirror de tarballs no los cubría. Se espejan
como `hammer/fuentes-git/{commit}.bundle` — 571 commits distintos, porque hay commits compartidos
entre colas y se espeja uno solo.
La identidad es el commit y la verificación la hace git: al desempaquetar comprueba cada objeto
contra su SHA, así que un bundle alterado no pasa. No hace falta índice ni sha256 aparte.
SHALLOW, NO CLONES COMPLETOS. El bundle sale de un `fetch --depth 1` del commit exacto: para `act`
son 9,3 MB en vez del repo entero, y con 571 fuentes eso decide si el mirror cabe. Es legítimo
porque hammer NUNCA usa la historia — lo único que hace con un repo es `git archive <commit> |
tar -x`, materializar un árbol.
EL DETALLE QUE COSTÓ ENCONTRAR. Un bundle hecho desde un repo shallow no lleva la frontera de
historia, y al desempaquetarlo git aborta con «Failed to traverse parents … did not send all
necessary objects». El mensaje dice que faltan objetos y es ENGAÑOSO: llegan enteros —`git archive`
ya funciona pese al error—; lo que falta es decirle a git dónde termina la historia. Se escribe el
propio commit en `<destino>/shallow` antes del fetch. No hay nada que transportar: la frontera de un
`--depth 1` es exactamente ese commit.
Y UN BUG PROPIO QUE VALE DOCUMENTAR: se pasaba al `git fetch` la ruta RELATIVA del bundle, y como
`run_git` invoca `git -C <destino>`, git la resolvía dentro de `<destino>`. Como el fallo del mirror
se traga a propósito para caer a upstream, el síntoma salía lejísimos: el build moría con «commit …
no existe en <repo> tras fetch», culpando a upstream de un error de ruta local. Ése es el precio de
que el mirror falle en silencio, y por eso el silencio se paga con comentarios explícitos.
Verificado igual que el de tarballs, con receta EFÍMERA para que no haya cache-hit: commit de `act`
ya espejado + un repo cuyo host no resuelve por DNS. Sin HAMMER_MIRROR_GIT falla en el clone; con
él, sella — y el artefacto trae el README.md real de act.
`cargo test -p hammer-build`: 5/5. Población de los 571 bundles corriendo aparte.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016v9ozVm44p6DB7EMXeZK4o
25 lines
1.8 KiB
Bash
Executable File
25 lines
1.8 KiB
Bash
Executable File
#!/bin/sh
|
|
# mirror-git-poblar.sh — espeja las fuentes GIT del corpus como bundles (ADR 0013).
|
|
#
|
|
# ── POR QUÉ BUNDLES SHALLOW Y NO CLONES COMPLETOS ──────────────────────────────────────────────
|
|
# Hammer no usa la historia: lo único que hace con un repo es `git archive <commit> | tar -x`, o sea
|
|
# materializar UN árbol. Un clon `--depth 1` del commit exacto basta, y para `act` son 8,9 MB en
|
|
# lugar del repositorio entero. Con 606 fuentes git, la diferencia decide si el mirror cabe.
|
|
#
|
|
# El objeto se nombra por CONTENIDO igual que los tarballs: `hammer/fuentes-git/{commit}.bundle`.
|
|
# El commit ES su verificación — git comprueba cada objeto contra su SHA al desempaquetar, así que
|
|
# un bundle alterado no pasa. No hace falta índice ni sha256 aparte.
|
|
#
|
|
# ── EL FICHERO `shallow` NO SE SUBE ────────────────────────────────────────────────────────────
|
|
# Un bundle hecho desde un repo shallow no lleva la frontera de historia, y al desempaquetarlo git
|
|
# aborta con «Failed to traverse parents». Suena a bundle incompleto y NO lo es: los objetos llegan
|
|
# enteros. La frontera de un clon `--depth 1` es exactamente el commit pedido, así que el lado que
|
|
# consume la reconstruye sola (lo hace `hidratar_desde_bundle` en fetch.rs). Nada que transportar.
|
|
#
|
|
# Uso: scripts/fuentes/mirror-git-poblar.sh # todas las que falten
|
|
# LIMITE=20 scripts/fuentes/mirror-git-poblar.sh # sólo las 20 primeras
|
|
# SOLO=mesa scripts/fuentes/mirror-git-poblar.sh # una receta concreta
|
|
set -eu
|
|
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"; cd "$ROOT"
|
|
exec python3 scripts/fuentes/mirror-git-poblar.py "$@"
|