| .. include:: ../disclaimer-sp.rst |
| |
| :Original: Documentation/process/5.Posting.rst |
| :Translator: Carlos Bilbao <carlos.bilbao.osdev@gmail.com> and Avadhut Naik <avadhut.naik@amd.com> |
| |
| .. _sp_development_posting: |
| |
| Publicación de parches |
| ====================== |
| |
| Tarde o temprano, llega el momento en que su trabajo esté listo para ser |
| presentado a la comunidad para su revisión y, eventualmente, su inclusión |
| en el kernel mainline. Como era de esperar, la comunidad de desarrollo del |
| kernel ha desarrollado un conjunto de convenciones y procedimientos que se |
| utilizan en la publicación de parches; seguirlos hará la vida mucho más |
| fácil para todos los involucrados. Este documento intentará cubrir estas |
| expectativas con un detalle razonable; también se puede encontrar más |
| información en los archivos. |
| :ref:`Documentation/translations/sp_SP/process/submitting-patches.rst <sp_submittingpatches>` |
| and :ref:`Documentation/translations/sp_SP/process/submit-checklist.rst <sp_submitchecklist>` |
| |
| Cuando publicar |
| --------------- |
| |
| Hay una tentación constante de evitar publicar parches antes de que |
| estén completamente “listos”. Para parches simples, eso no es un |
| problema. Sin embargo, si el trabajo que se está realizando es complejo, |
| hay mucho que ganar al obtener comentarios de la comunidad antes de que |
| se complete el trabajo. Por lo tanto, se debería considerar publicar |
| trabajo en progreso, o incluso poner a disposición un árbol de git para |
| que los desarrolladores interesados puedan ponerse al día con su trabajo |
| en cualquier momento. |
| |
| Al publicar código que aún no se considera listo para su inclusión, es |
| una buena idea decirlo en la propia publicación. Además, mencione |
| cualquier trabajo importante que aún falte por hacer y cualquier problema |
| conocido. Menos personas mirarán los parches que se sabe que están a |
| medias, pero aquellos que lo hagan vendrán con la idea de que pueden |
| ayudarlo a llevar el trabajo en la dirección correcta. |
| |
| Antes de crear parches |
| ---------------------- |
| |
| Se deben hacer varias cosas antes de considerar enviar parches a la |
| comunidad de desarrollo. Estas incluyen: |
| |
| - Pruebe el código en la medida de lo posible. Utilice las herramientas |
| de depuración del kernel, asegúrese de que el kernel se compilará con |
| todas las combinaciones razonables de opciones de configuración, use |
| compiladores cruzados para compilar para diferentes arquitecturas, etc. |
| |
| - Asegúrese de que su código cumpla con las directrices de estilo de |
| codificación del kernel. |
| |
| - ¿Su cambio tiene implicaciones de rendimiento? Si es así, debe ejecutar |
| puntos de referencia que muestren cuál es el impacto (o beneficio) de |
| su cambio; se debe incluir un resumen de los resultados con el parche. |
| |
| - Asegúrese de que tiene derecho a publicar el código. Si este trabajo |
| se realizó para un empleador, es probable que el empleador tenga |
| derecho al trabajo y debe estar de acuerdo con su lanzamiento bajo la |
| GPL. |
| |
| Como regla general, pensar un poco más antes de publicar el código casi |
| siempre compensa el esfuerzo en poco tiempo. |
| |
| Preparación del parche |
| ---------------------- |
| |
| La preparación de parches para su publicación puede ser una cantidad |
| sorprendente de trabajo, pero, una vez más, intentar ahorrar tiempo aquí |
| generalmente no es recomendable, ni siquiera a corto plazo. |
| |
| Los parches deben prepararse contra una versión específica del kernel. |
| Como regla general, un parche debe basarse en el mainline actual que se |
| encuentra en el árbol git de Linus. Al basarse en el mainline, comience |
| con un punto de lanzamiento bien conocido, una versión estable o -rc, en |
| lugar de bifurcarse fuera del mainline en un punto arbitrario. |
| |
| Puede ser necesario hacer revisiones contra -mm, linux-next o un árbol de |
| subsistemas para facilitar pruebas y revisiones más amplias. Dependiendo |
| del área de su parche y de lo que esté sucediendo en otros lugares, basar |
| un parche en estos otros árboles puede requerir una cantidad significativa |
| de trabajo para resolver conflictos y lidiar con los cambios de API. |
| |
| Solo los cambios más simples deben formatearse como un solo parche; todo |
| lo demás debe hacerse como una serie lógica de cambios. Dividir parches |
| es un poco un arte; algunos desarrolladores pasan mucho tiempo averiguando |
| cómo hacerlo de la manera que la comunidad espera. Sin embargo, hay |
| algunas reglas generales que pueden ayudar considerablemente: |
| |
| - La serie de parches que publique casi seguramente no será la serie de |
| cambios que se encuentran en su sistema de control de revisiones. En su |
| lugar, los cambios que ha realizado deben considerarse en su forma |
| final y luego dividirse de manera que tengan sentido. A los |
| desarrolladores les interesan los cambios discretos y autónomos, no el |
| camino que tomó para llegar a esos cambios. |
| |
| - Cada cambio lógicamente independiente debe formatearse como un parche |
| separado. Estos cambios pueden ser pequeños (“agregar un campo a esta |
| estructura”) o grandes (agregar un nuevo controlador significativo, |
| por ejemplo), pero deben ser conceptualmente pequeños y susceptibles |
| de una descripción de una línea. Cada parche debe hacer un cambio |
| especifico que pueda ser revisado por sí mismo y verificado para hacer |
| lo que dice que hace. |
| |
| - Para reafirmar la pauta anterior: no mezcle diferentes tipos de cambios |
| en el mismo parche. Si un solo parche corrige un error de seguridad |
| crítico, reorganiza algunas estructuras y reformatea el código, es muy |
| probable que se pase por alto y se pierda la solución importante. |
| |
| - Cada parche debe producir un kernel que se compile y funcione |
| correctamente; si su serie de parches se interrumpe en el medio, el |
| resultado debería seguir siendo un kernel funcional. La aplicación |
| parcial de una serie de parches es un escenario común cuando se |
| utiliza la herramienta “git bisect” para encontrar regresiones; si |
| el resultado es un kernel roto, hará la vida más difícil para los |
| desarrolladores y usuarios que participan en el noble trabajo de |
| rastrear problemas. |
| |
| - Sin embargo, no lo exagere. Un desarrollador una vez publicó un conjunto |
| de ediciones en un solo archivo como 500 parches separados – un acto |
| que no lo convirtió en la persona más popular en la lista de correo del |
| kernel. Un solo parche puede ser razonablemente grande si todavía |
| contiene un solo cambio *lógico*. |
| |
| - Puede ser tentador agregar una infraestructura completamente nueva con |
| una serie de parches, pero dejar esa infraestructura sin usar hasta el |
| parche final de la serie lo habilite todo. Esta tentación debe evitarse |
| si es posible; si esa serie agrega regresiones, bisection señalará el |
| ultimo parche como el que causó el problema, aunque el error real esté |
| en otra parte. Siempre que sea posible, un parche que agregue código |
| nuevo debe hacer que ese código se active de inmediato. |
| |
| Trabajar para crear la serie de parches perfecta puede ser un proceso |
| frustrante que lleva mucho tiempo y reflexión después de que el “trabajo |
| real” se ha hecho. Sin embargo, cuando se hace correctamente, es un tiempo |
| bien empleado. |
| |
| Formato de parches y registros de cambios |
| ----------------------------------------- |
| |
| Así que ahora tiene una serie perfecta de parches para publicar, pero el |
| trabajo aún no se ha hecho. Cada parche necesita ser formateado en un |
| mensaje que comunique rápida y claramente su propósito al resto del |
| mundo. A tal fin, cada parche se compondrá de lo siguiente: |
| |
| - Una línea opcional “From” que nombra al autor del parche. Esta línea |
| solo es necesaria si pasa el parche de otra persona por correo |
| electrónico, pero nunca está de más agregarla en caso de duda. |
| |
| - Una descripción de una línea de lo que hace el parche. Este mensaje |
| debería ser suficiente para que un lector que lo vea sin otro contexto |
| pueda entender el alcance del parche; la línea aparecerá en los |
| registros de cambios de “forma corta”. Este mensaje generalmente se |
| formatea con el nombre del subsistema relevante primero, seguido del |
| propósito del parche. Por ejemplo: |
| |
| :: |
| |
| gpio: fix build on CONFIG_GPIO_SYSFS=n |
| |
| - Una línea en blanco seguida de una descripción detallada del contenido |
| del parche. Esta descripción puede ser tan larga como sea necesario; |
| debería decir qué hace el parche y por qué debe aplicarse al kernel. |
| |
| - Una o más líneas de etiquetas, con, como mínimo, una línea |
| Signed-off-by: del autor del parche. Las etiquetas se describirán con |
| más detalle a continuación. |
| |
| Los elementos de arriba, juntos, forman el registro de cambios para el |
| parche. Escribir buenos registros de cambios es un arte crucial, pero a |
| menudo descuidado; vale la pena pasar otro momento discutiendo este tema. |
| Al escribir un registro de cambios, debe recordar que muchas personas |
| diferentes leerán sus palabras. Estos incluyen a los maintainers y |
| revisores de subsistemas que necesitan decidir si el parche debe |
| incluirse, a los distribuidores y otros maintainers que intentan |
| determinar si un parche debe ser “backported” a otros kernels, a los |
| cazadores de errores que se preguntan si el parche es responsable de un |
| problema que están persiguiendo, a los usuarios que quieren saber cómo |
| ha cambiado el kernel, y más. Un buen registro de cambios transmite la |
| información necesaria a todas estas personas de la forma más directa y |
| concisa posible. |
| |
| Con ese fin, la línea de resumen debe describir los efectos y la |
| motivación del cambio, así como lo mejor posible dada la restricción de |
| una línea. La descripción detallada puede ampliar esos temas y |
| proporcionar cualquier información adicional necesaria. Si el parche |
| corrige un error, cita el commit que introdujo el error si es posible (y |
| por favor, proporcione tanto el ID del commit como el título al citar |
| commits). Si un problema está asociado con un registro específico o la |
| salida del compilador, incluya esa salida para ayudar a otros usuarios a |
| buscar una solución al mismo problema. Si el cambio está destinado a |
| apoyar otros cambios que llegarán en un parche posterior, dígalo. Si se |
| cambian las API internas, detalle esos cambios y cómo deben responder |
| otros desarrolladores. En general, cuanto más pueda ponerse en los zapatos |
| de todos los que leerán su registro de cambios, mejor será ese registro de |
| cambios (y el kernel en su conjunto). |
| |
| No hace falta decir que el registro de cambios debe ser el texto utilizado |
| al realizar el commit en un sistema de control de revisiones. Será seguido |
| por: |
| |
| - El parche, en el formato unificado de parche (“-u”). Usar la opción |
| “-p” en diff asociará los nombres de las funciones con los cambios, lo |
| que hará que el parche resultante sea más fácil de leer para otros. |
| |
| Debe evitar incluir cambios en archivos irrelevantes (los generados por |
| el proceso de compilación, por ejemplo, o los archivos de respaldo del |
| editor) en el parche. El archivo “dontdiff” en el directorio de |
| Documentation puede ayudar en este sentido; páselo a diff con la |
| opción “-X”. |
| |
| Las etiquetas ya mencionadas brevemente anteriormente proporcionan |
| información sobre cómo surgió el parche. Se describen en detalle en el |
| documento |
| :ref:`Documentation/translations/sp_SP/process/submitting-patches.rst <sp_submittingpatches>`; |
| lo que sigue aquí es un breve resumen. |
| |
| Una etiqueta se usa para referirse a commits anteriores que introdujeron |
| problemas corregidos por el parche:: |
| |
| Fixes: 1f2e3d4c5b6a ("La primera línea del commit especificada por los primeros 12 caracteres de su ID SHA-1.") |
| |
| Otra etiqueta se utiliza para vincular páginas web con información |
| adicional o detalles, por ejemplo, una discusión previa que condujo al |
| parche o un documento con una especificación implementada por el parche:: |
| |
| Link: https://example.com/somewhere.html otras cosas opcionales |
| |
| Muchos maintainers, al aplicar un parche, también agregan esta etiqueta |
| para vincular a la última publicación de revisión pública del parche; a |
| menudo, eso se hace automáticamente mediante herramientas como b4 o git |
| hook como el que se describe en |
| 'Documentation/maintainer/configure-git.rst'. |
| |
| Si la URL apunta a un informe de error público que está siendo corregido |
| por el parche, use la etiqueta “Closes:” (Cierra) en su lugar:: |
| |
| Closes: https://example.com/issues/1234 otras cosas opcionales |
| |
| Algunos rastreadores de errores tienen la capacidad de cerrar problemas |
| automáticamente cuando se aplica un commit con tal etiqueta. Algunos bots |
| que monitorean listas de correo también pueden rastrear dichas etiquetas |
| y realizar ciertas acciones. Los rastreadores de errores privados y las |
| URL no válidas están prohibidos. |
| |
| Otro tipo de etiqueta se utiliza para documentar quién estuvo involucrado |
| en el desarrollo del parche. Cada uno de estos utiliza este formato:: |
| |
| tag: Full Name <email address> otras cosas opcionales |
| |
| Las etiquetas de uso común son: |
| |
| - Signed-off-by: esta es una certificación del desarrollador de que él |
| o ella tiene el derecho de enviar el parche para su inclusión en el |
| kernel. Es un acuerdo con el Certificado de Origen del Desarrollador, |
| que se encuentra en |
| :ref:`Documentation/translations/sp_SP/process/submitting-patches.rst <sp_submittingpatches>`. |
| El código sin la firma adecuada no se puede fusionar en el mainline. |
| |
| - Co-developed-by: indica que el parche fue co-creado por varios |
| desarrolladores; se utiliza para atribuir a los coautores (además del |
| autor atribuido por la etiqueta From:) cuando varias personas trabajan |
| en un solo parche. Cada Co-developed-by: debe ir seguido inmediatamente |
| por un Signedoff-by: del coautor asociado. Los detalles y ejemplos se |
| pueden encontrar en |
| :ref:`Documentation/translations/sp_SP/process/submitting-patches.rst <sp_submittingpatches>`. |
| |
| - Acked-by: indica un acuerdo por parte de otro desarrollador (a menudo |
| un maintainer del código relevante) de que el parche es apropiado para |
| su inclusión en el kernel. |
| |
| - Tested-by: indica que la persona nombrada ha probado el parche y ha |
| encontrado que funciona. |
| |
| - Reviewed-by: el desarrollador nombrado ha revisado el parche para |
| verificar que sea correcto; consulte la declaración del revisor en |
| :ref:`Documentation/translations/sp_SP/process/submitting-patches.rst <sp_submittingpatches>` |
| para obtener más detalles. |
| |
| - Reported-by: nombra a un usuario que informó un problema que se |
| soluciona con este parche; esta etiqueta se utiliza para dar crédito |
| a las personas (a menudo infravalorada) que prueban nuestro código y |
| nos hacen saber cuándo las cosas no funcionan correctamente. Tenga en |
| cuenta que esta etiqueta debe ir seguida de una etiqueta Closes: que |
| apunte al informe, a menos que el informe no esté disponible en la |
| web. La etiqueta Link: se puede usar en lugar de Closes: si el parche |
| corrige una parte de los problemas reportados. |
| |
| - Cc: la persona nombrada recibió una copia del parche y tuvo la |
| oportunidad de comentar sobre él. |
| |
| Tenga cuidado al agregar etiquetas a sus parches, ya que solo Cc: es |
| apropiado para la adición sin el permiso explícito de la persona nombrada; |
| usar Reported-by: está casi bien en su mayoría, pero pida permiso si el |
| error fue reportado en privado. |
| |
| Envió del parche |
| ---------------- |
| |
| Antes de enviar sus parches por correo, hay un par de cosas más de las |
| que debe ocuparse: |
| |
| - ¿Está seguro de que su correo no corromperá los parches? Los parches |
| con cambios gratuitos de espacio en blanco o ajuste de línea |
| realizados por el cliente de correo no se aplicarán en el otro |
| extremo, y a menudo, no se examinarán en detalle. Si tiene alguna |
| duda, envíese el parche por correo y convénzase de que parece |
| intacto. |
| |
| :ref:`Documentation/translations/sp_SP/process/email-clients.rst <sp_email_clients>` |
| tiene algunos consejos útiles sobre cómo hacer que clientes de correo |
| específicos funcionen para enviar parches. |
| |
| - ¿Está seguro de que su parche está libre de errores tontos? Siempre |
| debe ejecutar parches a través de scripts/checkpatch.pl y abordar las |
| quejas que surjan. Por favor, tenga en cuenta que checkpatch.pl, aunque |
| es la encarnación de una buena cantidad de pensamiento sobre cómo |
| deberían ser los parches del kernel, no es más inteligente que usted. |
| Si corregir una queja de checkpatch.pl empeoraría el código, no lo |
| haga. |
| |
| Los parches siempre deben enviarse como texto sin formato. Por favor, no |
| los envíe como archivos adjuntos; eso hace que sea mucho más difícil para |
| los revisores citar secciones del parche en sus respuestas. En su lugar, |
| simplemente coloca el parche directamente en su mensaje. |
| |
| Al enviar parches por correo, es importante enviar copias a cualquier |
| persona que pueda estar interesada en ellos. A diferencia de otros |
| proyectos, el kernel anima a la gente a equivocarse por el lado de enviar |
| demasiadas copias; no asuma que las personas relevantes verán su |
| publicación en las listas de correo. En particular, las copias deben |
| ir a: |
| |
| - El (los) maintainer(s) del (de los) subsistema(s) afectado(s). Como se |
| describió anteriormente, el archivo MAINTAINERS es el primer lugar para |
| buscar a estas personas. |
| |
| - Otros desarrolladores que han estado trabajando en la misma |
| área – especialmente aquellos que podrían estar trabajando allí ahora. |
| Usar git para ver quién más ha modificado los archivos en los que está |
| trabajando puede ser útil. |
| |
| - Si está respondiendo a un informe de error o a una solicitud de |
| función, copie también al autor. |
| |
| - Envié una copia a la lista de correo relevante o, si no se aplica nada |
| más, a la lista de linux-kernel. |
| |
| - Si está corrigiendo un error, piense si la corrección debe incluirse en |
| la próxima actualización estable. Si es así, stable@vger.kernel.org |
| debería obtener una copia del parche. También agregue un |
| "Cc: stable@vger.kernel.org" a las etiquetas dentro del parche; eso |
| hará que el equipo estable reciba una notificación cuando su solución |
| incluya en el mainline. |
| |
| Al seleccionar destinatarios para un parche, es bueno saber quién cree que |
| eventualmente aceptará el parche y lo fusionará. Aunque es posible enviar |
| parches directamente a Linus Torvalds y hacer que los fusione, las cosas |
| normalmente no se hacen de esa manera. Linus está ocupado y hay |
| maintainers de subsistemas que vigilan partes específicas del kernel. |
| Generalmente, querrá que ese maintainer fusione sus parches. Andrew Morton |
| es a menudo el objetivo del parche de último recurso si no hay un |
| maintainer obvio. |
| |
| Los parches necesitan buenas líneas de asunto. El formato canónico de una |
| línea de parche es algo así como: |
| |
| :: |
| |
| [PATCH nn/mm] subsys: descripción en una línea del parche |
| |
| donde “nn” es el número ordinal del parche, “”mm” es el número total de |
| parches en la serie, y “subsys” es el nombre del subsistema afectado. |
| Claramente, nn/mm se puede omitir para un parche único e independiente. |
| |
| Si tiene una serie significativa de parches, es costumbre enviar una |
| descripción introductoria como parte cero. Sin embargo, esta convención no |
| se sigue universalmente; si la utiliza, recuerde que la información en la |
| introducción no se incluye en los registros de cambios del kernel. Por lo |
| tanto, asegúrese de que los parches, en sí mismos, tengan información |
| completa del registro de cambios. |
| |
| En general, la segunda y las siguientes partes de un parche de varias |
| partes deben enviarse como una respuesta a la primera parte para que todas |
| se hilen juntas en el extremo receptor. Herramientas como git y quilt |
| tienen comandos para enviar por correo un conjunto de parches con el |
| subproceso adecuado. Sin embargo, si tiene una serie larga y está usando |
| git, por favor evite la opción –chain-reply-to para evitar crear un |
| anidamiento excepcionalmente profundo. |