Introducción

Los equipos que usan jj como alternativa a Git o en entornos híbridos pueden encontrar problemas al sincronizar tags con remotos, manejar salidas de comandos en scripts o enfrentarse a fallas inesperadas por race conditions. La release v0.44.0 aborda estos puntos con cambios en el comportamiento por defecto de jj git fetch, mejoras en jj run y fixes para bugs que podían corromper el repositorio o provocar panics.

Qué ocurrió

El 24 de mayo de 2024, el proyecto jj lanzó la versión v0.44.0, con modificaciones significativas en la interoperabilidad con Git, la gestión de tags y la ejecución de comandos. Los cambios más relevantes para equipos de infraestructura incluyen:

  • Sincronización de tags: jj git fetch ahora recupera tags de forma similar a los bookmarks (branches), trackeando automáticamente las tags locales con sus homónimas en el remote.
  • Comportamiento de jj run: Ahora procesa revisiones de oldest a newest por defecto, garantizando el orden de ejecución incluso con --jobs > 1.
  • Nuevos flags: jj run suma --passthrough, --ignore-changes y --ignore-errors para mayor control sobre la ejecución de comandos.
  • Fixes críticos: Se corrigieron panics en jj run con commits con conflicts, fallas al leer configuración en repositorios copiados y un race condition en jj git import/export en workspaces colocados.

Impacto para DevOps / Infraestructura / Cloud / Seguridad

Para equipos de DevOps, el cambio más disruptivo es la nueva semántica de tags en jj git fetch. En versiones anteriores, los tags no se sincronizaban automáticamente, lo que podía generar discrepancias entre el repositorio local y el remote. Ahora, las tags se recuperan por defecto y se trackean localmente (ej: v1.0@origin), lo que simplifica la gestión de releases pero puede aumentar el tráfico de red en repositorios con muchos tags. En entornos con CI/CD, esto podría impactar el tiempo de los pipelines que ejecutan jj git fetch.

En infraestructura, las mejoras en jj run son clave para scripts de deployment o maintenance. El orden garantizado de ejecución (oldest a newest) evita problemas de dependencias entre revisiones, y los nuevos flags (--ignore-errors, --passthrough) permiten diseñar workflows más robustos. Por ejemplo, un script que aplique migraciones de base de datos puede usar --ignore-errors para continuar ante fallos no críticos.

En seguridad, el fix del race condition en jj git import/export (issue #9833) elimina un vector potencial de corrupción de datos en workspaces compartidos. Aunque jj no es tan widely deployed como Git, su uso en entornos con repositorios críticos justifica atención a este tipo de bugs.

Detalles técnicos

Cambios en sincronización con Git

  • jj git fetch: Ahora recupera tags y las trackea automáticamente. Las tags remotas se representan como <name>@<remote> (ej: v1.0@origin). Para deshabilitar esto, configurar en ~/.jjconfig:
  [remotes."origin"]
  fetch-tags = "~*"
  
  • jj git clone: El flag --fetch-tags fue removido. En su lugar, usar --tag=PATTERN (ej: --tag="v*").
  • jj git push --all: Ahora pushia tags además de bookmarks.

Mejoras en templates y revsets

  • WorkspaceRef.root() y RepoPath.absolute(): Ahora retornan Option<FsPath> y FsPath (no String). Los templates deben adaptarse:
  # Antes (v0.43.0)
  {{ workspace.root() }}
  # Ahora (v0.44.0)
  {{ workspace.root().to_str() }}
  
  • Nuevo revset: merge_point(revs...) encuentra el punto donde múltiples branches se mergean (similar a fork_point).
  • builtin_log(): Nuevo alias para el revset por defecto de jj log. Permite personalizar revsets.log sin duplicar la expresión:
  [revsets]
  log = "builtin_log() + authors(@user)"
  

Comandos y flags nuevos

  • jj tag track/untrack: Asocia tags locales con remotes. Ejemplo:
  jj tag track v1.0 origin
  jj tag untrack v1.0
  
  • jj run:
--passthrough: Conecta stdout/stderr del subproceso directamente al terminal.

--ignore-changes: Evita modificar revisiones aunque el comando modifique el working copy.

--ignore-errors: Continúa con las revisiones restantes si el comando falla.

  • jj file search:
– Ahora imprime cada línea coincidente con su path. Para obtener solo los paths, usar --name-only.

– Soporte para -n/--line-number para mostrar el número de línea.

Fixes críticos

IssueDescripciónImpacto
#9827Creación tardía de working-copy revision al volverse immutablePodía dejar el working copy en estado inconsistente
#9752BLOCK55 paniceaba con commits con conflictsCorrupción de revisiones
#9774Fallo al leer config en repositorios copiados con dir de config vacíoImposibilidad de operar el repo
#9833Race condition en BLOCK56 en workspaces colocadosCorrupción de datos
#7530Git HEAD mismatch tras working copy immutableDesincronización con Git
## Qué deberían hacer los administradores y equipos técnicos
  1. Actualizar jj:
   cargo install [email protected]  # Si usás cargo
   

o descargar el binario desde GitHub releases.

  1. Revisar la sincronización de tags:
– Ejecutar jj git fetch en todos los repositorios para sincronizar tags con el nuevo comportamiento.

– Si tenés muchos tags y querés reducir el tráfico, configurar fetch-tags por remote:

     [remotes."upstream"]
     fetch-tags = "v*"
     
  1. Actualizar templates:
– Verificar templates que usen workspace.root() o path en jj config list. Cambiar a .to_str() si se necesita string:
     [ui]
     diff.delta-stat.style = "{{ path.to_str() }}"
     

– Aprovechar el nuevo builtin_log() para simplificar configuraciones personalizadas.

  1. Ajustar scripts que usen jj run:
– Si el orden de ejecución importaba, verificar que el nuevo comportamiento (oldest a newest) sea compatible.

– Considerar usar --ignore-errors para scripts donde fallos en revisiones individuales no deben abortar todo el proceso.

  1. Mitigar el race condition en workspaces compartidos:
– En entornos con workspaces colocados (ej: monorepos), evitar ejecutar jj git import o export concurrentemente. Si es necesario, deshabilitar estos comandos por default:
     [git]
     import = false
     export = false
     
  1. Monitorear repositorios con paths no UTF-8:
jj snapshot ahora saltea paths no UTF-8 (emitiendo una advertencia). Revisar los logs para identificar estos casos y migrarlos si es necesario.

Conclusión

La v0.44.0 de jj es una release centrada en robustez y usabilidad, con cambios que afectan especialmente a equipos que integran jj con Git o usan la herramienta en scripts automatizados. Los fixes para panics y race conditions justifican una actualización prioritaria, mientras que las mejoras en tags y jj run ofrecen nuevas capacidades para flujos de trabajo complejos. La migración debería ser directa, pero requiere revisar configuraciones de templates y scripts.

Fuentes

  • https://github.com/jj-vcs/jj/releases/tag/v0.44.0

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *