# /full-git-pull — Pull automático de fn_registry + sub-repos + submodules + fn sync Trae los últimos cambios del remote para el repo principal `fn_registry`, todos los sub-repos git anidados que **ya existan localmente**, y los submodules de `cpp/vendor/`. Después regenera `registry.db` y corre `fn sync` para tirar de la metadata del `registry_api`. **Modo automático (preferencia del usuario):** este comando NO pregunta. Auto-stashea dirty trees antes de pullear y hace `pop` después. Sigue con el resto de repos aunque uno falle. Solo se detiene si detecta riesgo serio (conflicto en stash pop que requiere intervención humana). **No clona repos que falten.** Cada PC tiene solo el subset de apps/analyses que le interesa. Si en este PC necesitas un sub-repo que aún no tienes, clónalo a mano: ```bash git clone https://:@/dataforge/.git ``` Consulta `pc_locations` para ver dónde lo tiene otro PC y reproduce el path. ## Argumento `$ARGUMENTS` — sin uso, ignorar. ## Pasos ### 1. Descubrir repos locales ```bash cd /home/lucas/fn_registry REPOS=$(find . -name ".git" -type d \ -not -path "./.git" -not -path "./.git/*" \ -not -path "*/node_modules/*" -not -path "*/.venv/*" \ -not -path "*/cpp/vendor/*" -not -path "*/cpp/build/*" \ -not -path "*/sources/*" -not -path "*/temp/*" -not -path "*/subrepos/*" 2>/dev/null \ | sed 's|/.git$||') REPOS=". $REPOS" ``` Solo se actualizan los sub-repos que ya tengan `.git/` localmente. ### 2. Para cada repo: stash si dirty, pull --ff-only, pop ```bash for r in $REPOS; do ( cd "$r" \ && DIRTY=$(git status --porcelain | wc -l) \ && if [ "$DIRTY" -gt 0 ]; then git stash push -m "auto-stash before /full-git-pull" --include-untracked >/dev/null STASHED=1 else STASHED=0 fi \ && git fetch origin 2>&1 | tail -1 \ && git pull --ff-only 2>&1 | tail -3 \ && if [ "$STASHED" = "1" ]; then git stash pop 2>&1 | tail -3 fi ) done ``` - Si `--ff-only` falla por divergencia → reportar ese repo, seguir con el resto. **No** rebasear ni mergear. - Si `stash pop` produce conflictos → **avisar al usuario al final** y dejar el conflicto sin tocar; seguir con los demás repos. ### 3. Submodules del repo principal ```bash git submodule update --init --recursive 2>&1 | tail -10 ``` ### 4. Regenerar registry.db local ```bash CGO_ENABLED=1 ./fn index 2>&1 | tail -3 ``` ### 5. fn sync ```bash USER=$(pass registry/basicauth-user | head -1) PASSWD=$(pass registry/basicauth-pass | head -1) TOKEN=$(pass registry/api-token | head -1) export FN_REGISTRY_API="https://${USER}:${PASSWD}@registry.organic-machine.com" export REGISTRY_API_TOKEN="$TOKEN" ./fn sync ``` Si `pass` falla → gpg-agent bloqueado, pedir al usuario `pass show registry/api-token` en su terminal real. ### 6. Resumen Tabla concisa: por repo, commits pulleados o "ya estaba al día"; submodules actualizados; resultado de `fn index`; resultado de `fn sync`. Si algún repo quedó con conflicto de stash o divergencia, listarlos al final con la acción sugerida. ## Notas - **Modo no-interactivo por diseño.** El usuario prefiere flujos rápidos sin confirmaciones. - Pull solo es fast-forward — nunca rebase ni merge automático. - Auto-stash incluye untracked (`--include-untracked`) para no perder archivos nuevos. - `fn index` se corre **antes** de `fn sync` para que las locations locales reflejen el estado actual.