Introducción a sistemas de control de versión distribuidos

Hugo O. Barrera <hugo@whynothugo.nl>

UNPSJB, Oct. 2024

Contenidos

Parte 1:

  • Sistemas de control de versión distribuidos.
  • Git: conceptos y uso básico.

Parte 2:

  • Compartir cambios con git.
  • Forjas y platforms de colaboración.
  • Code Review.

Mensajes de commits

Escribir buenos mensajes de commit es clave para que se entienda que hace el
código que estamos compartiendo.

  • Primera línea: resumen corto.
  • Una línea en blanco.
  • Descripción en prosa.

Mensajes de commits

Ejemplo (en el contexto de un sistema de check-ins de una aerolínea):

Evitar error interno en check-ins temprano

Si un pasajero intenta hacer check-in por un vuelo demasiado temprano, el
sistema falla, devolviendo un error interno. Como resultado, el cliente ve un
mensaje que dice "hubo un error interno al procesar la operación", y no tiene
el claro que está pasando ni que debe hacer.

Validar adecuadamente si es demasiado temprano para el check-in, y mostrar un
error claro al usuario, indicándole a partir de que hora debe hacer el
check-in.

Fixes: https://example.com/issues/456

Mensajes de commits

Ejemplo (arreglando un simple error de tipeo en un mensaje al usuario):

Typo

Patches

patch es un formato para representar cambios:

diff --git a/demo.md b/demo.md
index e440d87..ebc8717 100644
--- a/demo.md
+++ b/demo.md
@@ -1,6 +1,6 @@
 # git

-**git** es un sistema de control de versión distirbuido.
+**git** es un sistema de control de versión distribuido.

 - Creado para desarrollar Linux.
 - Enfocado en rapidez e integridad de datos.

¿Cómo compartir cambios?

¡Mandando un commit/parche!

¿Cómo compartir cambios?

  • Trabajando todos en el mismo remote
  • git send-email
  • git format-patch
  • git request-pull
  • Pull Request / Merge Request

Trabajando todos en el mismo remote

  • Fácil y sencillo.
  • Todos tienen todos los permisos.
  • No sirve para proyectos públicos.

Upstream

"Río arriba"

Es el remoto original de donde colaboradores descargan "la versión de arriba"
del un proyecto.

git send-email

"enviar email"

  • Manda un mail por commit
    • Opcionalmente una carta de presentación
  • No requiere ninguna infraestructura.
  • Pensado para listas de correo
  • sendmail / SMTP(S)

git send-email

  • Requiere más preparación / configuración.
  • Curva de aprendizaje más pronunciada.
  • Más ágil para procesar parches.

git send-email

Sinopsis:

git send-email DESDE
git send-email DESDE..HASTA

Ejemplos:

git send-email --to list-dev@example.com origin/main
git send-email --to list-dev@example.com 22bc48..48c0b5

git send-email

From: Hugo Osvaldo Barrera <hugo@whynothugo.nl>
To: ~sircmpwn/himitsu-devel@lists.sr.ht
Subject: [PATCH himitsu-ssh] agent: allow specifying a custom path

Allow specifying a custom address for the socket. I chose the `-a` flag
because it matches the equivalent flag in ssh-agent.

The default path remains the same.

---
 cmd/hissh-agent/main.ha | 31 ++++++++++++++++++++++++++-----
 1 file changed, 26 insertions(+), 5 deletions(-)

diff --git a/cmd/hissh-agent/main.ha b/cmd/hissh-agent/main.ha
index f38d499..6f61c04 100644
--- a/cmd/hissh-agent/main.ha
+++ b/cmd/hissh-agent/main.ha
@@ -8,6 +8,7 @@ use errors;
 use fmt;
 use format::ssh;
 use fs;
+use getopt;

git send-email

Las respuestas son simples emails:

On Tue May 14, 2024 at 12:46 PM CEST, Hugo Osvaldo Barrera wrote:
> --- a/docs/himitsud.1.scd
> +++ b/docs/himitsud.1.scd
> @@ -26,6 +26,8 @@ The following options are recognized by *himitsud*:
>
>  *-D*
>  	Daemonize (fork) the himitsud process after startup.
> +*-R fd*
> +	Notify readiness by writing *\n* into *fd* and closing.

This doesn't match what's actually written.

git send-email

Configuración por repositorio:

git config sendemail.to list-dev@example.com
git config format.subjectPrefix "PATCH himitsu"

Más ejemplos:

git send-email origin/main..
git send-email 22bc48..48c0b5
git send-email --cover-letter 48c0b5~..48c0b5

git am

Quien recibe el parche lo aplica con:

git am -3 < validar-emails.patch

También se pueden aplicar parches de la web:

curl https://example.com/patches/validar-emails.patch | git am -3

git format-patch

"formatear parche"

  • Usado internamente por git send-email.
  • Genera el mismo contenido a un archivo de texto.

git request-pull

"solicitar pull"

  • Publicamos cambios en un repositorio público.
  • request-pull genera un resumen de cambios.
  • Le pedimos al upstream que incluya nuestros cambios.

Pull Request / Merge Request

"solicitud de pull"

  • Usados en plataformas de colaboración web:
    • GitHub (Pull Request)
    • GitLab (Merge Request)
    • Forejo (Pull Request)
    • BitBucket (Pull Request)
    • ...

Pull Request / Merge Request

Colaborar requiere una cuenta en la plataforma donde está el proyecto original.

  • Clono un repositorio localmente.
  • Hago mis cambios.
  • Creo un "fork" en la plataforma.
  • Subo mis cambio a mi "fork".
  • Creo un Pull Request en la plataforma.

Pull Request / Merge Request

El responsable del repositorio upstream:

  • Recibe un email de notificación.
  • Deja comentarios / feedback.
  • Eventualmente aprieta el botón "Merge"

Actividad 1

Commandos útiles:

git clone https://...
git add -p
git commit
git remote add mi-fork ...
git remote --help
git push mi-fork main

Un branch por PR

Si necesitan crear dos PRs en un mismo repositorio, tienen que subir a branches
distintos.

Code reviews ("revisión de código")

Una persona sube código, otra persona lo revisa.

Code reviews ("revisión de código")

  • Detecta errores temprano.
  • Comparte conocimiento en el equipo.
  • Refuerza estándares de codificación.
  • Fomenta la colaboración en equipo.
  • Ayuda en mentoría y aprendizaje.

Actividad 2

Hagan un review de los cambios anteriores:

  • Si está todo okay, indican esto claramente.
  • Si tienen dudas, dejan una pregunta.
  • Si hay problems, los indican.

Trailers

Metadatos estructurados en un mensaje de un commit.

Trailers

  • Fixes:
  • Co-authored-by:
  • Signed-off-by:
  • Reported-by:
  • Reviewed-by:
  • Tested-by:

Trailers

commit e90cd83993e2973db19abd56e0f529aeb6ec9e2a
Author: Hugo Osvaldo Barrera <hugo@whynothugo.nl>
Date:   Sat Aug 10 12:53:29 2024 +0200

    Remove deprecated pytest-runner

    We don't seem to actually be relying on this anyway.

    Fixes: https://github.com/pimutils/todoman/issues/559

diff --git a/pyproject.toml b/pyproject.toml
index 27d4c1a..2ffb582 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -49,7 +49,6 @@ test = [
     "hypothesis",
     "pytest",
     "pytest-cov",
-    "pytest-runner",
 ]
 docs = [
     "sphinx-click",

Actividad 3

Re-escribir el último commit y agregar Fixes: ...:

git commit --amend

Subir y pisando cambios al branch del PR:

git push --force-with-lease

Actividad 4

Code review de PRs actualizadas.

Integración continua (CI)

Automatiza revisar el código cuando se suben cambios nuevos.

Integración continua

  • Automatiza pruebas y compilación.
  • Proporciona feedback rápido.
  • Requiere configuración initial y infraestructura adicional.
  • Facilita deploys frecuentes.

Despliegue continuo (CD)

Automatiza publicar cambios a producción después de pasar todos los controles.

Despliegue continuo

  • Automatiza el proceso de desplegado.
  • Facilita la feedback rápido del usuario.
  • Minimiza el riesgo de errores manuales.
  • Acelera el desplegado de nueva funcionalidades.
  • Permite actualizaciones frecuentes y pequeñas.

GitOps

Es una práctica que:

  • Define infraestructura con código en un repositorio.
  • Automatiza infraestructura usando un repositorio como única fuente de la
    verdad.

Preguntas

Presentación

git por ssh

Objective is to familiarise with this. Reduce fear to it. Not necessarily practice it right now.

A single hosted platform isn't great. But having multiple ones is better, especially having self-hosted ones.

Like reviewing academic papers. Not intended to _evaluate_ contributors.

Only if there's enough time left