1. Introducción

Este documento contiene información para desarrolladores sobre la infraestructura de LinuxCNC, y describe las mejores prácticas para contribuir con código y actualizaciones de documentación para el proyecto LinuxCNC.

En este documento, "fuente" significa tanto el código fuente de programas y bibliotecas, como el texto fuente para la documentación.

2. Comunicación entre desarrolladores de LinuxCNC

Las dos formas principales en que los desarrolladores de proyectos se comunican entre sí son:

3. El proyecto LinuxCNC en Source Forge

Utilizamos Source Forge para las listas de correo.

4. El sistema de control de revisiones Git

Toda la fuente de LinuxCNC se mantiene en el sistema de control de revisiones Git.

4.1. Repositorio Git oficial de LinuxCNC

El repositorio oficial git de LinuxCNC está en https://github.com/linuxcnc/linuxcnc/

Cualquiera puede obtener una copia de solo lectura del árbol fuente de LinuxCNC a través de git:

git clone https://github.com/linuxcnc/linuxcnc linuxcnc-dev

Si eres un desarrollador con acceso push, entonces sigue las instrucciones de github para configurar un repositorio donde puedas hacer push.

Ten en cuenta que el comando clone coloca el repositorio local de LinuxCNC en un directorio llamado linuxcnc-dev, en lugar del predeterminado linuxcnc. Esto se debe a que el software LinuxCNC por defecto espera configuraciones y programas en código G en un directorio llamado $HOME/linuxcnc`, y tener el repositorio git ahí mismo causa confusiones.

Issues y pull requests (abreviado PRs) son bienvenidos en GitHub: . https:///github.com/LinuxCNC/linuxcnc/issues . https://github.com/LinuxCNC/linuxcnc/pulls

4.2. Uso de Git en el proyecto LinuxCNC

Utilizamos los flujos de trabajo git "merging upwards" y "topic branches" descritos aquí:

Tenemos una rama de desarrollo llamada master, y una o más ramas estables con nombres como 2.6 o 2.7 que indican el número de versión de los lanzamientos que hacemos.

Las correcciones de errores van en la rama estable aplicable más antigua, y esa rama se fusiona con la siguiente rama estable más nueva, y así sucesivamente hasta master. El committer o confirmador de la corrección de error, puede hacer las fusiones por sí mismo, o dejarlas a otra persona.

Las nuevas características generalmente van en la rama master, pero algunos tipos de características (específicamente controladores de dispositivo y documentación bien aislados) pueden (a discreción de los gerentes de la rama estable) entrar en una rama estable y fusionarse como lo hacen las correcciones de errores.

4.3. Tutoriales de git

Hay muchos excelentes tutoriales gratuitos de git en Internet.

El primer lugar para buscar es probablemente la página de manual "gittutorial". Se puede acceder a esta página de manual ejecutando "man gittutorial" en una terminal (si tiene instaladas las páginas de manual de git). El gittutorial y su consiguiente documentación también están disponibles en línea aquí:

Para una documentación más completa de git, ver el libro "Pro Git": https://git-scm.com/book

Otro tutorial en línea que se ha recomendado es "Git for the Lazy": http://wiki.spheredev.org/Git_for_the_lazy

5. Descripción general del proceso

La descripción general de alto nivel de cómo contribuir cambios a la fuente va así:

  • Comunícate con los desarrolladores del proyecto y dinos qué andas hackeando. Explica lo que estas haciendo y por qué.

  • Clona el repositorio git.

  • Haz tus cambios en una rama local.

  • Agregar documentación y escribir pruebas es una parte importante de agregar una nueva característica. De lo contrario, otros no sabrán cómo usar tu característica, y si otros cambios corrompen tu característica, pueden pasar desapercibidos sin una prueba.

  • Comparte tus cambios con los otros desarrolladores del proyecto de una de estas maneras:

    • Haz push de tu rama a github y crea una pull request de github hacia https://github.com/linuxcnc/linuxcnc (esto requiere una cuenta github), o

    • Haz push de tu rama a un repositorio git visible públicamente (como github, o tu propio servidor de acceso público, etc.) y comparte esa ubicación en la lista de correo de emc-developers, o

    • Envía tus confirmaciones (commits) por correo electrónico a la lista de correo de LinuxCNC-developers (<emc-developers@lists.sourceforge.net>) (usa git format-patch para crear parches).

  • Defiende tu parche:

    • Explica qué problema aborda y por qué debería incluirse en LinuxCNC.

    • Sé receptivo a las preguntas y comentarios de la comunidad de desarrolladores.

    • No es raro que un parche pase por varias revisiones antes de ser aceptado.

6. Configuración de git

Para ser considerada la inclusión en las fuentes de LinuxCNC, los commits deben tener campos de autor correctos que identifiquen al autor de la confirmación. Una buena manera de garantizar esto es estableciendo tu configuración global de git:

git config --global user.name "Tu nombre completo"
git config --global user.email "tucorreo@example.com"

Usa tu nombre real (no un identificador) y una dirección de correo electrónico clara (no ofuscada).

7. Uso efectivo de git

7.1. Contenido de confirmaciones

Mantén tus confirmaciones pequeñas y concretas. Cada commit debe aportar un cambio lógico al repositorio.

7.2. Escribir buenos mensajes de confirmación

Mantén los mensajes de confirmación alrededor de 72 columnas de ancho (de modo que en un tamaño predeterminado de ventana de terminal, no se partan cuando se muestren con git log).

Usa la primera línea como un resumen de la intención del cambio (casi como la línea de asunto de un correo electrónico). Seguida por una línea en blanco, y luego un mensaje más largo explicando el cambio. Ejemplo:

7.3. Confirmar a la rama adecuada

Las correcciones de errores deben ir en la rama aplicable más antigua. Las nuevas funciones deberían ir a la rama master. Si no estás seguro a dónde pertenece un cambio, pregunta en el irc o en la lista de correo.

7.4. Usar confirmaciones múltiples para organizar cambios

Cuando sea apropiado, organiza tus cambios en una rama (una serie de confirmaciones) donde cada commit es un paso lógico hacia su objetivo máximo. Por ejemplo, primero factoriza un código complejo en una nueva función. Luego, en una segunda confirmación, corrige algún error subyacente. Después, en un tercer commit agrega una nueva característica que se hizo más fácil por la refactorización y que no hubiera funcionado sin arreglar aquel error.

Esto es útil para los revisores, porque es más fácil ver que el paso "factorizar el código en una nueva función" era correcto, sin otras ediciones mezcladas; es más fácil ver que el error se corrige cuando el cambio que lo arregla es independiente de la nueva característica; y así sucesivamente.

7.5. Seguir el estilo del código circundante

Haz un esfuerzo por seguir el estilo de sangría predominante en el código circundante. En particular, los cambios en los espacios en blanco hacen que sea más difícil para otros desarrolladores rastrear cambios a lo largo del tiempo. Cuando se debe reformatear código, hazlo en una confirmación separada de cualquier cambio semántico.

7.6. Deshacerse de RTAPI_SUCCESS, usar 0 en su lugar

La prueba "retval < 0" debería ser familiar; es el mismo tipo de prueba que se utiliza en el espacio de usuario (devuelve -1 para error) y en el espacio de kernel (devuelve -ERRNO para error).

7.7. Simplificar historial complicado antes de compartir con otros desarrolladores

Con git, es posible grabar cada edición y comienzo en falso en una confirmación separada. Esta es una forma muy conveniente de crear puntos de control durante el desarrollo, pero a menudo no querrás compartir estos comienzos en falso con otros.

Git proporciona dos formas principales de limpiar el historial, las cuales se pueden hacer libremente antes de compartir el cambio:

git commit --amend te permite hacer cambios adicionales a tu última confirmación, modificando opcionalmente también el mensaje de confirmación. Utiliza esto si te das cuenta de inmediato que dejaste algo fuera de la confirmación, o si cometiste un error tipográfico en el mensaje.

git rebase --interactive upstream-branch te permite volver a través de cada confirmación realizada desde que bifurcaste tu rama de características desde la rama superior, posiblemente editando, descartando o comprimiendo (combinando) commits con otros. Rebase también se puede usar para dividir confirmaciones individuales en múltiples confirmaciones nuevas.

7.8. Asegurarse que cada confirmación compile

Si tu cambio consta de varios parches, git rebase -i puede usarse para reordenarlos en una secuencia de confirmaciones que exponga más claramente los pasos de tu trabajo. Una consecuencia potencial de reordenar parches es que podrían aparecer dependencias incorrectas, por ejemplo, introducir el uso de una variable y, en un parche posterior, la declaración de esa variable.

Aunque la rama HEAD compile, no todas las confirmaciones podrían compilar en tal caso. Eso rompe git bisect, algo que alguien podría usar más tarde para encontrar la confirmación que introdujo un error. Así que más allá de asegurarte que tu rama compile, es importante asegurar que cada confirmación individual también compile.

Hay una forma automática de verificar que cada confirmación en una rama sea compilable - ver https://dustin.sallings.org/2010/03/28/git-test-sequence.html y el código en https://github.com/dustin/bindir/blob/master/git-test-sequence. Usarlo de la siguiente manera (en este caso probando cada confirmación desde origin/master a HEAD, incluida la ejecución de pruebas de regresión):

cd linuxcnc-dev
git-test-sequence origin/master..  '(cd src && make && ../scripts/runtests)'

Esto informará que todo está bien (All is well) o que tronó (Broke on <confirmación>)

7.9. Renombrar archivos

Utiliza la capacidad de cambiar el nombre de los archivos con mucho cuidado. Así como el indentar archivos individuales, los cambios de nombre hacen más difícil dar seguimiento a cambios en el tiempo. Como mínimo deberías buscar consenso, en IRC o en la lista de correo, de que el cambio de nombre es una mejora.

7.10. Preferir "rebase"

Utiliza git pull --rebase en lugar de un puro git pull para mantener un buen historial lineal. Cuando rebasas, siempre retienes tu trabajo como revisiones por delante de origin/master, por lo que puedes hacer cosas como git format-patch para compartirlo con otros sin hacer push al repositorio central.

8. Traducciones

El proyecto LinuxCNC usa gettext para traducir el software a varios idiomas. ¡Damos la bienvenida a contribuciones y ayuda en esta área!. Mejorar y extender las traducciones es fácil: no necesitas saber de programación ni necesitas instalar algún programa especial de traducción u otro software.

La forma más fácil de ayudar con traducciones es usando Weblate, un servicio web de código abierto. Nuestro proyecto de traducción esta aquí:

La documentación sobre cómo usar Weblate está aquí: https://docs.weblate.org/en/latest/user/basic.html

9. Otras formas de contribuir

Hay muchas formas de contribuir a LinuxCNC que no se abordan en este documento. Estas formas incluyen:

  • Responder preguntas en el foro, listas de correo y en IRC

  • Informar errores en el seguidor de errores, foro, listas de correo o en IRC

  • Ayudando a probar características experimentales