1.. include:: ../disclaimer-sp.rst
2
3:Original: :ref:`Documentation/process/submitting-patches.rst <submittingpatches>`
4:Translator: Carlos Bilbao <carlos.bilbao@amd.com>
5
6.. _sp_submittingpatches:
7
8Envío de parches: la guía esencial para incluir su código en el kernel
9=======================================================================
10
11Para una persona o empresa que desee enviar un cambio al kernel Linux,
12el proceso puede en ocasiones resultar desalentador si no se está
13familiarizado con "el sistema". Este texto es una colección de sugerencias
14que pueden aumentar considerablemente las posibilidades de que se acepte su
15cambio.
16
17Este documento contiene una gran cantidad de sugerencias en un formato
18relativamente conciso. Para obtener información detallada sobre cómo
19funciona el proceso de desarrollo del kernel, consulte
20Documentation/process/development-process.rst. Además, lea
21Documentation/process/submit-checklist.rst para obtener una lista de
22elementos a verificar antes de enviar código. Para los parches de
23"binding" del árbol de dispositivos, lea
24Documentation/devicetree/bindings/submitting-patches.rst.
25
26Esta documentación asume que está usando ``git`` para preparar sus parches.
27Si no está familiarizado con ``git``, le recomendamos que aprenda a
28usarlo, le hará la vida como desarrollador del kernel y en general mucho
29más sencilla.
30
31Algunos subsistemas y árboles de mantenimiento cuentan con información
32adicional sobre su flujo de trabajo y expectativas, consulte
33:ref:`Documentation/process/maintainer-handbooks.rst <maintainer_handbooks_main>`.
34
35Obtenga el código fuente actual
36--------------------------------
37
38Si no tiene a mano un repositorio con el código fuente actual del kernel,
39use ``git`` para obtener uno. Querrá comenzar con el repositorio principal,
40que se puede descargar con::
41
42  git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
43
44Tenga en cuenta, sin embargo, que es posible que no desee desarrollar con
45el árbol principal directamente. La mayoría de los maintainers de
46subsistemas usan sus propios árboles de código fuente y quieren ver parches
47preparados para esos árboles. Revise el campo **T:** para el subsistema
48en el archivo MAINTAINERS para encontrar dicho árbol, o simplemente
49pregunte al maintainer si el árbol no está listado allí.
50
51.. _sp_describe_changes:
52
53Describa sus cambios
54---------------------
55
56Describa su problema. Sea su parche una corrección de un error de una
57línea o 5000 líneas para una nuevo "feature", debe haber un problema
58subyacente que le motivó a hacer ese trabajo. Convenza al revisor de que
59hay un problema que merece la pena solucionar y de que tiene sentido que
60lea más allá del primer párrafo.
61
62Describa el impacto relativo al usuario. Cosas que estropeen el kernel y
63los bloqueos son bastante convincentes, pero no todos los errores son tan
64evidentes. Incluso si se detectó un problema durante la revisión del
65código, describa el impacto que cree pueda tener en los usuarios. Tenga en
66cuenta que la mayoría de instalaciones de Linux ejecutan kernels desde
67árboles estables secundarios o árboles específicos de proveedor/producto
68que seleccionan ("cherry-pick") solo parches específicos de upstream, así
69que incluya cualquier cosa que pueda ayudar a dirigir su cambio
70aguas abajo: circunstancias que producen cierta situación, extractos de
71dmesg, descripciones del error fatal, regresiones de rendimiento, picos de
72latencia, bloqueos, etc.
73
74Cuantifique optimizaciones y beneficios/perdidas. Si asegura mejoras en
75rendimiento, consumo de memoria, huella del stack o tamaño de binario,
76incluya números que lo respalden. Pero también describa costes no obvios.
77Las optimizaciones generalmente no son gratuitas, sino un equilibrio entre
78CPU, memoria y legibilidad; o, cuando se trata de heurísticas, entre
79diferentes cargas de trabajo. Describa las desventajas esperadas de su
80optimización para que el revisor pueda comparar las perdidas con los
81beneficios.
82
83Una vez establecido el problema, describa lo que realmente está haciendo
84al respecto en detalles técnicos. Es importante describir el cambio en
85lenguaje sencillo para que el revisor verifique que el código se está
86comportando como se pretende.
87
88El maintainer le agradecerá que escriba la descripción de su parche en un
89formato que se pueda incorporar fácilmente en la gestión del código fuente
90del sistema, ``git``, como un "commit log" (registros de los commits).
91Consulte :ref:`sp_the_canonical_patch_format`.
92
93Resuelva solo un problema por parche. Si su descripción comienza a ser muy
94larga, eso es una señal de que probablemente necesite dividir su parche.
95Lea :ref:`split_changes`.
96
97Cuando envíe o vuelva a enviar un parche o una serie de parches, incluya la
98descripción completa del parche y justificación del mismo. No se limite a
99decir que esa es la versión N del parche (serie). No espere que el
100maintainer del subsistema referencie versiones de parches anteriores o use
101referencias URL para encontrar la descripción del parche y colocarla en el
102parche. Es decir, el parche (serie) y su descripción deben ser
103independientes. Esto beneficia tanto a los maintainers como a los
104revisores. Algunos revisores probablemente ni siquiera recibieran versiones
105anteriores del parche.
106
107Describa sus cambios en la forma imperativa, por ejemplo, "hacer que xyzzy
108haga frotz" en lugar de "[Este parche] hace que xyzzy haga frotz" o "[Yo]
109Cambié xyzzy para que haga frotz", como si estuviera dando órdenes al
110código fuente para cambiar su comportamiento.
111
112Si desea hacer referencia a un commit específico, no se limite a hacer
113referencia al ID SHA-1 del commit. Incluya también el resumen de una línea
114del commit, para que sea más fácil para los revisores saber de qué se
115trata.
116Ejemplo::
117
118	Commit e21d2170f36602ae2708 ("video: quitar platform_set_drvdata()
119	innecesario") eliminó innecesario platform_set_drvdata(), pero dejó la
120	variable "dev" sin usar, bórrese.
121
122También debe asegurarse de utilizar al menos los primeros doce caracteres
123del identificador SHA-1. El repositorio del kernel contiene muchos *muchos*
124objetos, por lo que las colisiones con identificaciones más cortas son una
125posibilidad real. Tenga en cuenta que, aunque no hay colisión con su
126identificación de seis caracteres ahora, esa condición puede cambiar dentro
127de cinco años.
128
129Si las discusiones relacionadas o cualquier otra información relativa al
130cambio se pueden encontrar en la web, agregue las etiquetas 'Link:' que
131apunten a estos. En caso de que su parche corrija un error, por poner un
132ejemplo, agregue una etiqueta con una URL que haga referencia al informe en
133los archivos de las listas de correo o un rastreador de errores; si el
134parche es el resultado de alguna discusión anterior de la lista de correo o
135algo documentado en la web, referencie esto.
136
137Cuando se vincule a archivos de listas de correo, preferiblemente use el
138servicio de archivador de mensajes lore.kernel.org. Para crear la URL del
139enlace, utilice el contenido del encabezado ("header") ``Message-Id`` del
140mensaje sin los corchetes angulares que lo rodean.
141Por ejemplo::
142
143    Link: https://lore.kernel.org/r/30th.anniversary.repost@klaava.Helsinki.FI/
144
145Verifique el enlace para asegurarse de que realmente funciona y apunta al
146mensaje correspondiente.
147
148Sin embargo, intente que su explicación sea comprensible sin recursos
149externos. Además de dar una URL a un archivo o error de la lista de correo,
150resuma los puntos relevantes de la discusión que condujeron al parche tal y
151como se envió.
152
153Si su parche corrige un error en un commit específico, por ejemplo
154encontró un problema usando ``git bisect``, utilice la etiqueta 'Fixes:'
155con los primeros 12 caracteres del ID SHA-1 y el resumen de una línea. No
156divida la etiqueta en varias líneas, las etiquetas están exentas de la
157regla "ajustar a 75 columnas" para simplificar análisis de scripts. Por
158ejemplo::
159
160	Fixes: 54a4f0239f2e ("KVM: MMU: hacer que kvm_mmu_zap_page()
161	devuelva la cantidad de páginas que realmente liberó")
162
163Las siguientes configuraciones de ``git config`` se pueden usar para
164agregar un bonito formato y generar este estilo con los comandos
165``git log`` o ``git show``::
166
167	[core]
168		abbrev = 12
169	[pretty]
170		fixes = Fixes: %h (\"%s\")
171
172Un ejemplo de uso::
173
174	$ git log -1 --pretty=fixes 54a4f0239f2e
175	Fixes: 54a4f0239f2e ("KVM: MMU: hacer que kvm_mmu_zap_page() devuelva la cantidad de páginas que realmente liberó")
176
177.. _sp_split_changes:
178
179Separe sus cambios
180-------------------
181
182Separe cada **cambio lógico** en un parche separado.
183
184Por ejemplo, si sus cambios incluyen correcciones de errores y mejoras en
185el rendimiento de un controlador, separe esos cambios en dos o más parches.
186Si sus cambios incluyen una actualización de la API y una nueva controlador
187que usa esta nueva API, sepárelos en dos parches.
188
189Por otro lado, si realiza un solo cambio en numerosos archivos, agrupe esos
190cambios en un solo parche. Por lo tanto, un solo cambio lógico estará
191contenido en un solo parche.
192
193El punto a recordar es que cada parche debe realizar un cambio que puede
194ser verificado por los revisores fácilmente. Cada parche debe ser
195justificable por sus propios méritos.
196
197Si un parche depende de otro parche para que un cambio sea completo, eso
198está bien. Simplemente incluya que **"este parche depende del parche X"**
199en la descripción de su parche.
200
201Cuando divida su cambio en una serie de parches, tenga especial cuidado en
202asegurarse de que el kernel se compila y ejecuta correctamente después de
203cada parche en la serie. Los desarrolladores que usan ``git bisect``
204para rastrear un problema pueden terminar dividiendo su serie de parches en
205cualquier punto; no le agradecerán si introdujo errores a la mitad.
206
207Si no puede condensar su conjunto de parches en un conjunto más pequeño de
208parches, solo publique, más o menos 15 a la vez, y espere la revisión e
209integración.
210
211
212Revise el estilo en sus cambios
213--------------------------------
214
215Revise su parche para ver si hay violaciones de estilo básico, cuyos
216detalles pueden ser encontrados en Documentation/process/coding-style.rst.
217No hacerlo simplemente desperdicia el tiempo de los revisores y su parche
218será rechazado, probablemente sin siquiera ser leído.
219
220Una excepción importante es cuando se mueve código de un archivo a otro.
221En tal caso, en absoluto debe modificar el código movido en el mismo parche
222en que lo mueve. Esto divide claramente el acto de mover el código y sus
223cambios. Esto ayuda mucho a la revisión de la diferencias reales y permite
224que las herramientas rastreen mejor el historial del código en sí.
225
226Verifique sus parches con el verificador de estilo de parches antes de
227enviarlos (scripts/checkpatch.pl). Tenga en cuenta, sin embargo, que el
228verificador de estilo debe ser visto como una guía, no como un reemplazo
229del juicio humano. Si su código es mejor con una violación entonces
230probablemente sea mejor dejarlo estar.
231
232El verificador informa a tres niveles:
233 - ERROR: cosas que es muy probable que estén mal
234 - WARNING: Advertencia. Cosas que requieren una revisión cuidadosa
235 - CHECK: Revisar. Cosas que requieren pensarlo
236
237Debe poder justificar todas las violaciones que permanezcan en su parche.
238
239
240Seleccione los destinatarios de su parche
241------------------------------------------
242
243Siempre debe incluir en copia a los apropiados maintainers del subsistema
244en cualquier parche con código que mantengan; revise a través del archivo
245MAINTAINERS y el historial de revisión del código fuente para ver quiénes
246son esos maintainers. El script scripts/get_maintainer.pl puede ser muy
247útil en este paso (pase rutas a sus parches como argumentos para
248scripts/get_maintainer.pl). Si no puede encontrar un maintainer del
249subsistema en el que está trabajando, Andrew Morton
250(akpm@linux-foundation.org) sirve como maintainer de último recurso.
251
252Normalmente, también debe elegir al menos una lista de correo para recibir
253una copia de su conjunto de parches. linux-kernel@vger.kernel.org debe
254usarse de forma predeterminada para todos los parches, pero el volumen en
255esta lista ha hecho que muchos desarrolladores se desconecten. Busque en el
256archivo MAINTAINERS una lista específica de los subsistemas; su parche
257probablemente recibirá más atención allí. Sin embargo, no envíe spam a
258listas no relacionadas.
259
260Muchas listas relacionadas con el kernel están alojadas en vger.kernel.org;
261puedes encontrar un listado de estas en
262http://vger.kernel.org/vger-lists.html. Existen listas relacionadas con el
263kernel alojadas en otros lugares, no obstante.
264
265¡No envíe más de 15 parches a la vez a las listas de correo de vger!
266
267Linus Torvalds es el árbitro final de todos los cambios aceptados en el
268kernel de Linux. Su dirección de correo electrónico es
269<torvalds@linux-foundation.org>. Recibe muchos correos electrónicos y, en
270este momento, muy pocos parches pasan por Linus directamente, por lo que
271normalmente debe hacer todo lo posible para -evitar- enviarle un correo
272electrónico.
273
274Si tiene un parche que corrige un error de seguridad explotable, envíe ese
275parche a security@kernel.org. Para errores graves, se debe mantener un
276poco de discreción y permitir que los distribuidores entreguen el parche a
277los usuarios; en esos casos, obviamente, el parche no debe enviarse a
278ninguna lista pública. Revise también
279Documentation/process/security-bugs.rst.
280
281Los parches que corrigen un error grave en un kernel en uso deben dirigirse
282hacia los maintainers estables poniendo una línea como esta::
283
284  CC: stable@vger.kernel.org
285
286en el área de sign-off de su parche (es decir, NO un destinatario de correo
287electrónico). También debe leer
288Documentation/process/stable-kernel-rules.rst además de este documento.
289
290Si los cambios afectan las interfaces del kernel para el usuario, envíe al
291maintainer de las MAN-PAGES (como se indica en el archivo MAINTAINERS) un
292parche de páginas de manual, o al menos una notificación del cambio, para
293que alguna información se abra paso en las páginas del manual. Los cambios
294de la API del espacio de usuario también deben copiarse en
295linux-api@vger.kernel.org.
296
297
298Sin MIME, enlaces, compresión o archivos adjuntos. Solo texto plano
299--------------------------------------------------------------------
300
301Linus y otros desarrolladores del kernel deben poder leer y comentar sobre
302los cambios que está enviando. Es importante para un desarrollador kernel
303poder "citar" sus cambios, utilizando herramientas estándar de correo
304electrónico, de modo que puedan comentar sobre partes específicas de su
305código.
306
307Por este motivo, todos los parches deben enviarse por correo electrónico
308"inline". La forma más sencilla de hacerlo es con ``git send-email``, que
309es muy recomendable. Un tutorial interactivo para ``git send-email`` está
310disponible en https://git-send-email.io.
311
312Si elige no usar ``git send-email``:
313
314.. warning::
315
316  Tenga cuidado con el ajuste de palabras de su editor que corrompe su
317  parche, si elige cortar y pegar su parche.
318
319No adjunte el parche como un archivo adjunto MIME, comprimido o no. Muchas
320populares aplicaciones de correo electrónico no siempre transmiten un MIME
321archivo adjunto como texto sin formato, por lo que es imposible comentar
322en su código. Linus también necesita un poco más de tiempo para procesar un
323archivo adjunto MIME, disminuyendo la probabilidad de que se acepte su
324cambio adjunto en MIME.
325
326Excepción: si su proveedor de correo está destrozando parches, entonces
327alguien puede pedir que los vuelva a enviar usando MIME.
328
329Consulte Documentation/process/email-clients.rst para obtener sugerencias
330sobre cómo configurar su cliente de correo electrónico para que envíe sus
331parches intactos.
332
333Responda a los comentarios de revisión
334---------------------------------------
335
336Es casi seguro que su parche recibirá comentarios de los revisores sobre
337maneras en que se pueda mejorar el parche, en forma de respuesta a su
338correo electrónico. Debe responder a esos comentarios; ignorar a los
339revisores es una buena manera de ser ignorado de vuelta. Simplemente puede
340responder a sus correos electrónicos para contestar a sus comentarios.
341Revisiones a los comentarios o preguntas que no conduzcan a un cambio de
342código deben casi con certeza generar un comentario o una entrada en el
343"changelog" para que el próximo revisor entienda lo que está pasando.
344
345Asegúrese de decirles a los revisores qué cambios está haciendo y de
346agradecerles que dediquen su tiempo. La revisión del código es un proceso
347agotador y lento, y los revisores a veces se ponen de mal humor. Sin
348embargo, incluso en ese caso, responda cortésmente y aborde los problemas
349que hayan señalado. Al enviar un siguiente versión, agregue un
350``patch changelog`` (registro de cambios en los parches) a la carta de
351presentación ("cover letter") o a parches individuales explicando la
352diferencia con la presentación anterior (ver
353:ref:`sp_the_canonical_patch_format`).
354
355Consulte Documentation/process/email-clients.rst para obtener
356recomendaciones sobre clientes de correo electrónico y normas de etiqueta
357en la lista de correo.
358
359.. _sp_resend_reminders:
360
361No se desanime o impaciente
362---------------------------
363
364Después de haber entregado su cambio, sea paciente y espere. Los revisores
365son personas ocupadas y es posible que no lleguen a su parche de inmediato.
366
367Érase una vez, los parches solían desaparecer en el vacío sin comentarios,
368pero el proceso de desarrollo funciona mejor que eso ahora. Debería
369recibir comentarios dentro de una semana más o menos; si eso no sucede,
370asegúrese de que ha enviado sus parches al lugar correcto. Espere un mínimo
371de una semana antes de volver a enviar o hacer ping a los revisores,
372posiblemente más durante periodos de mucho trabajo ocupados como "merge
373windows".
374
375También está bien volver a enviar el parche o la serie de parches después
376de un par de semanas con la palabra "RESEND" (reenviar) añadida a la línea
377de asunto::
378
379   [PATCH Vx RESEND] sub/sys: Resumen condensado de parche
380
381No incluya "RESEND" cuando envíe una versión modificada de su parche o
382serie de parches: "RESEND" solo se aplica al reenvío de un parche o serie
383de parches que no hayan sido modificados de ninguna manera con respecto a
384la presentación anterior.
385
386
387Incluya PATCH en el asunto
388--------------------------
389
390Debido al alto tráfico de correo electrónico a Linus y al kernel de Linux,
391es común prefijar su línea de asunto con [PATCH]. Esto le permite a Linus
392y otros desarrolladores del kernel distinguir más fácilmente los parches de
393otras discusiones por correo electrónico.
394
395``git send-email`` lo hará automáticamente.
396
397
398Firme su trabajo: el Certificado de Origen del Desarrollador
399------------------------------------------------------------
400
401Para mejorar el seguimiento de quién hizo qué, especialmente con parches
402que pueden filtrarse hasta su destino final a través de varias capas de
403maintainers, hemos introducido un procedimiento de "sign-off" (aprobación)
404en parches que se envían por correo electrónico.
405
406La aprobación es una simple línea al final de la explicación del parche,
407que certifica que usted lo escribió o que tiene derecho a enviarlo como un
408parche de código abierto. Las reglas son bastante simples: si usted puede
409certificar lo siguiente:
410
411Certificado de Origen del Desarrollador 1.1
412^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
413
414Al hacer una contribución a este proyecto, certifico que:
415
416        (a) La contribución fue creada en su totalidad o en parte por mí y
417            tengo derecho a enviarlo bajo la licencia de código abierto
418            indicada en el documento; o
419
420        (b) La contribución se basa en trabajo previo que, hasta donde yo
421            soy consciente, está cubierto por una licencia de código
422            abierto apropiada y tengo el derecho bajo esa licencia de
423            presentar tal trabajo con modificaciones, ya sean creadas en su
424            totalidad o en parte por mí, bajo la misma licencia de código
425            (salvo que sea permitido presentar bajo una licencia diferente),
426            tal y como se indica en el documento; o
427
428        (c) La contribución me fue proporcionada directamente por alguna
429            otra persona que certificó (a), (b) o (c) y no he modificado
430            esto.
431
432        (d) Entiendo y acepto que este proyecto y la contribución
433            son públicos y que un registro de la contribución (incluyendo
434            toda la información personal que envío con él, incluida mi
435            firma) es mantenida indefinidamente y puede ser redistribuida
436            de manera consistente con este proyecto o la(s) licencia(s) de
437            código abierto involucradas.
438
439entonces simplemente incluya una línea que rece::
440
441	Signed-off-by: Random J Developer <random@developer.example.org>
442
443usando su nombre real (lamentablemente, no pseudónimos ni contribuciones
444anónimas). Esto se hará por usted automáticamente si usa ``git commit -s``.
445Las reversiones de código también deben incluir "Signed-off-by".
446``git revert -s`` hace eso por usted.
447
448Algunas personas también ponen etiquetas adicionales al final. Simplemente
449serán ignoradas por ahora, pero puede hacer esto para marcar procedimientos
450internos de su empresa o simplemente señalar algún detalle especial sobre
451la firma.
452
453Cualquier otro SoB (Signed-off-by:) después del SoB del autor es de
454personas que manipulen y transporten el parche, pero no participaron en su
455desarrollo. Las cadenas de SoB deben reflejar la ruta **real** del parche
456de cómo se propagó a los maintainers y, en última instancia, a Linus, con
457la primera entrada de SoB que señala la autoría principal de un solo autor.
458
459
460Cuándo usar Acked-by:, Cc: y Co-developed-by por:
461-------------------------------------------------
462
463La etiqueta Signed-off-by: indica que el firmante estuvo involucrado en el
464desarrollo del parche, o que él/ella se encontraba en el camino de entrega
465del parche.
466
467Si una persona no estuvo directamente involucrada en la preparación o
468administración de un parche pero desea expresar y registrar su aprobación,
469entonces puede pedir que se agregue una línea Acked-by: al registro de
470cambios del parche.
471
472Acked-by: a menudo lo usa el maintainer del código afectado cuando ese
473maintainer no contribuyó ni envió el parche.
474
475Acked-by: no es tan formal como Signed-off-by:. Es una manera de marcar que
476el "acker" ha revisado al menos ese parche y ha indicado su aceptación. Por
477los merge de parches a veces convertirán manualmente el "sí, me parece bien"
478de un acker en un Acked-by: (pero tenga en cuenta que por lo general es
479mejor pedir un acuse de recibo explícito).
480
481Acked-by: no necesariamente indica el reconocimiento de todo el parche.
482Por ejemplo, si un parche afecta a varios subsistemas y tiene un
483Acked-by: de un maintainer del subsistema, entonces esto generalmente
484indica el reconocimiento de solo la parte que afecta el código de ese
485maintainer. Buen juicio debe ejercitarse aquí. En caso de duda, la gente
486debe consultar la discusión original en los archivos de la lista de correo.
487
488Si una persona ha tenido la oportunidad de comentar un parche, pero no lo
489ha hecho, puede incluir opcionalmente una etiqueta ``Cc:`` al parche.
490Esta es la única etiqueta que se puede agregar sin una acción explícita por
491parte de la persona a la que se nombre - pero debe indicar que esta persona
492fue copiada en el parche. Esta etiqueta documenta que las partes
493potencialmente interesadas han sido incluidas en la discusión.
494
495Co-developed-by: establece que el parche fue co-creado por múltiples
496desarrolladores; se utiliza para dar atribución a los coautores (además del
497autor atribuido por la etiqueta From:) cuando varias personas trabajan en
498un solo parche. Ya que Co-developed-by: denota autoría, cada
499Co-developed-by: debe ser inmediatamente seguido de Signed-off-by: del
500coautor asociado. Se mantiene el procedimiento estándar, es decir, el orden
501de las etiquetas Signed-off-by: debe reflejar el historial cronológico del
502parche en la medida de lo posible, independientemente de si el autor se
503atribuye a través de From: o Co-developed-by:. Cabe destacar que el último
504Signed-off-by: siempre debe ser del desarrollador que envía el parche.
505
506Tenga en cuenta que la etiqueta From: es opcional cuando el autor From: es
507también la persona (y correo electrónico) enumerados en la línea From: del
508encabezado del correo electrónico.
509
510Ejemplo de un parche enviado por el From: autor::
511
512	<changelog>
513
514	Co-developed-by: Primer coautor <primer@coauthor.example.org>
515	Signed-off-by: Primer coautor <primer@coauthor.example.org>
516	Co-developed-by: Segundo coautor <segundo@coautor.ejemplo.org>
517	Signed-off-by: Segundo coautor <segundo@coautor.ejemplo.org>
518	Signed-off-by: Autor del From <from@author.example.org>
519
520Ejemplo de un parche enviado por un Co-developed-by: autor::
521
522	From: Autor del From <from@author.example.org>
523
524	<changelog>
525
526	Co-developed-by: Co-Autor aleatorio <aleatorio@coauthor.example.org>
527	Signed-off-by: Coautor aleatorio <aleatorio@coauthor.example.org>
528	Signed-off-by: Autor del From <from@author.example.org>
529	Co-developed-by: Coautor que envió <sub@coauthor.example.org>
530	Signed-off-by: Coautor que envía <sub@coauthor.example.org>
531
532Uso de Reported-by:, Tested-by:, Reviewed-by:, Suggested-by: y Fixes:
533----------------------------------------------------------------------
534
535La etiqueta Reported-by (Reportado-por) otorga crédito a las personas que
536encuentran errores y los reportan. Por favor, tenga en cuenta que si se
537informó de un error en privado, debe pedir primero permiso antes de usar la
538etiqueta Reported-by. La etiqueta está destinada a errores; por favor no la
539use para acreditar peticiones de características.
540
541Una etiqueta Tested-by: indica que el parche se probó con éxito (en algún
542entorno) por la persona nombrada. Esta etiqueta informa a los maintainers
543de que se han realizado algunas pruebas, proporciona un medio para ubicar
544"testers" (gente que pruebe) otros parches futuros y asegura el crédito
545para los testers.
546
547Reviewed-by: en cambio, indica que el parche ha sido revisado y encontrado
548aceptable de acuerdo con la Declaración del Revisor:
549
550Declaración de Supervisión del Revisor
551^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
552
553Al ofrecer mi etiqueta Reviewed-by:, afirmo que:
554
555(a) He llevado a cabo una revisión técnica de este parche para
556evaluar su idoneidad y preparación para su inclusión en
557el kernel principal.
558
559(b) Cualquier problema, inquietud o pregunta relacionada con el parche
560han sido comunicados al remitente. Estoy satisfecho
561con la respuesta del remitente a mis comentarios.
562
563(c) Si bien puede haber cosas que podrían mejorarse con esta
564entrega, creo que es, en este momento, (1) una
565modificación valiosa al kernel, y (2) libre de conocidas
566cuestiones que argumentarían en contra de su inclusión.
567
568(d) Si bien he revisado el parche y creo que es correcto,
569no hago (a menos que se indique explícitamente en otro lugar) ninguna
570garantía o avales de que logrará su definido
571propósito o función en cualquier situación dada.
572
573Una etiqueta Reviewed-by es una declaración de opinión de que el parche es
574una modificación apropiada al kernel sin que haya ningún problema grave
575a nivel técnico. Cualquier revisor interesado (que haya hecho el trabajo)
576puede ofrecer una etiqueta Reviewed-by para un parche. Esta etiqueta sirve
577para dar crédito a revisores e informar a los maintainers del grado de
578revisión que se ha hecho en el parche. Las etiquetas Reviewed-by, cuando
579las otorgan revisores conocidos por entender del tema y realizar
580revisiones exhaustivas, normalmente aumentan la probabilidad de que su
581parche entre en el kernel.
582
583Las etiquetas Tested-by y Reviewed-by, una vez recibidas en la lista de
584correo por el tester o revisor, deben ser incluidas por el autor de los
585parches pertinentes al enviar próximas versiones. Sin embargo, si el parche
586ha cambiado sustancialmente en la siguiente versión, es posible que estas
587etiquetas ya no sean aplicables y, por lo tanto, deben eliminarse. Por lo
588general, se debe mencionar la eliminación de las etiquetas Tested-by o
589Reviewed-by de alguien en el registro de cambios del parche (después del
590separador '---').
591
592Una etiqueta Suggested-by: indica que la idea del parche es sugerida por la
593persona nombrada y asegura el crédito a la persona por la idea. Tenga en
594cuenta que esto no debe agregarse sin el permiso del "reporter",
595especialmente si la idea no fue publicada en un foro público. Dicho esto,
596si diligentemente acreditamos a los reporters de ideas, con suerte, se
597sentirán inspirados para ayudarnos nuevamente en el futuro.
598
599Una etiqueta Fixes: indica que el parche corrige un problema en un commit
600anterior. Esto se utiliza para facilitar descubrir dónde se originó un
601error, lo que puede ayudar a revisar una corrección de errores. Esta
602etiqueta también ayuda al equipo del kernel estable a determinar qué
603versiones estables del kernel deberían recibir su corrección. Este es el
604método preferido para indicar un error corregido por el parche. Revise
605:ref:`describe_changes` para más detalles.
606
607Nota: Adjuntar una etiqueta Fixes: no subvierte las reglas estables del
608proceso del kernel ni el requisito de CC: stable@vger.kernel.org en todos
609los parches candidatos de ramas estables. Para obtener más información, lea
610Documentation/process/stable-kernel-rules.rst.
611
612.. _sp_the_canonical_patch_format:
613
614Formato de parche canónico
615---------------------------
616
617Esta sección describe cómo debe darse formato al propio parche. Tenga en
618cuenta que, si tiene sus parches almacenados en un repositorio ``git``, el
619parche con formato adecuado se puede obtener con ``git format-patch``. Las
620herramientas no pueden crear el texto necesario, sin embargo, así que lea
621las instrucciones a continuación de todos modos.
622
623La línea de asunto del parche canónico es::
624
625    Asunto: [PATCH 001/123] subsistema: frase de resumen
626
627El cuerpo del mensaje del parche canónico contiene lo siguiente:
628
629  - Una línea ``from`` que especifica el autor del parche, seguida de una
630    línea vacía (solo es necesario si la persona que envía el parche no es
631    el autor).
632
633  - El cuerpo de la explicación, línea envuelta en 75 columnas, que se
634    copiara en el registro de cambios permanente para describir este parche.
635
636  - Una línea vacía.
637
638  - Las líneas ``Signed-off-by:``, descritas anteriormente, que
639    también vaya en el registro de cambios.
640
641  - Una línea de marcador que contiene simplemente ``---``.
642
643  - Cualquier comentario adicional que no sea adecuado para el registro de
644    cambios.
645
646  - El parche real (output de ``diff``).
647
648El formato de la línea de asunto hace que sea muy fácil ordenar los correos
649electrónicos alfabéticamente por línea de asunto - prácticamente cualquier
650lector de correo electrónico permite esto, ya que debido a que el número de
651secuencia se rellena con ceros, el orden numérico y alfabético es el mismo.
652
653El ``subsistema`` en el asunto del correo electrónico debe identificar qué
654área o subsistema del kernel está siendo parcheado.
655
656La ``frase de resumen`` en el Asunto del correo electrónico debe describir
657de forma concisa el parche que contiene ese correo electrónico. La
658``frase resumen`` no debe ser un nombre de archivo. No use la mismo ``frase
659resumen`` para cada parche en una serie completa de parches (donde una
660`` serie de parches`` (patch series) es una secuencia ordenada de múltiples
661parches relacionados).
662
663Tenga en cuenta que la ``frase de resumen`` de su correo electrónico se
664convierte en un identificador global único para ese parche. Se propaga por
665hasta el registro de cambios de ``git``. La ``frase resumida`` se puede
666usar más adelante en discusiones de desarrolladores que se refieran al
667parche. La gente querrá buscar en Google la ``frase de resumen`` para leer
668la discusión al respecto del parche. También será lo único que la gente
669podrá ver rápidamente cuando, dos o tres meses después, estén pasando por
670quizás miles de parches usando herramientas como ``gitk`` o ``git log
671--oneline``.
672
673Por estas razones, el ``resumen`` no debe tener más de 70-75 caracteres, y
674debe describir tanto lo que cambia el parche como por qué el parche podría
675ser necesario. Es un reto ser tanto sucinto como descriptivo, pero eso es
676lo que un resumen bien escrito debería hacer.
677
678La ``frase de resumen`` puede estar precedida por etiquetas encerradas en
679corchetes: "Asunto: [PATCH <etiqueta>...] <frase de resumen>". Las
680etiquetas no se consideran parte de la frase de resumen, pero describen
681cómo debería ser tratado el parche. Las etiquetas comunes pueden incluir un
682descriptor de versión si las múltiples versiones del parche se han enviado
683en respuesta a comentarios (es decir, "v1, v2, v3") o "RFC" para indicar
684una solicitud de comentarios.
685
686Si hay cuatro parches en una serie de parches, los parches individuales
687pueden enumerarse así: 1/4, 2/4, 3/4, 4/4. Esto asegura que los
688desarrolladores entiendan el orden en que se deben aplicar los parches y
689que han revisado o aplicado todos los parches de la serie de parches.
690
691Aquí hay algunos buenos ejemplos de Asuntos::
692
693    Asunto: [PATCH 2/5] ext2: mejorar la escalabilidad de la búsqueda de mapas de bits
694    Asunto: [PATCH v2 27/01] x86: corregir el seguimiento de eflags
695    Asunto: [PATCH v2] sub/sys: resumen conciso del parche
696    Asunto: [PATCH v2 M/N] sub/sys: resumen conciso del parche
697
698La línea ``from`` debe ser la primera línea en el cuerpo del mensaje,
699y tiene la forma::
700
701        From: Autor del parche <autor@ejemplo.com>
702
703La línea ``From`` especifica quién será acreditado como el autor del parche
704en el registro de cambios permanente. Si falta la línea ``from``, entonces
705la línea ``From:`` del encabezado del correo electrónico se usará para
706determinar el autor del parche en el registro de cambios.
707
708La explicación estará incluida en el commit del changelog permanente, por
709lo que debería tener sentido para un lector competente que hace mucho tiempo
710ha olvidado los detalles de la discusión que podrían haber llevado a
711este parche. Incluidos los síntomas del fallo que el parche trate
712(mensajes de registro del kernel, mensajes de oops, etc.) son especialmente
713útiles para personas que podrían estar buscando en los registros de
714commits en busca de la aplicación del parche. El texto debe estar escrito
715con tal detalle que cuando se lea semanas, meses o incluso años después,
716pueda dar al lector la información necesaria y detalles para comprender el
717razonamiento de **por qué** se creó el parche.
718
719Si un parche corrige una falla de compilación, puede que no sea necesario
720incluir _todos_ los errores de compilación; pero lo suficiente como para
721que sea probable que alguien que busque el parche puede encontrarlo. Como
722en la ``frase de resumen``, es importante ser tanto sucinto como
723descriptivo.
724
725La línea marcadora ``---`` cumple el propósito esencial de marcar para
726herramientas de manejo de parches donde termina el mensaje de registro de
727cambios.
728
729Un buen uso de los comentarios adicionales después del marcador ``---`` es
730para ``diffstat``, para mostrar qué archivos han cambiado, y el número de
731líneas insertadas y eliminadas por archivo. Un ``diffstat`` es
732especialmente útil en parches más grandes. Si va a incluir un ``diffstat``
733después del marcador ``---``, utilice las opciones ``diffstat``
734``-p 1 -w 70`` para que los nombres de archivo se enumeran desde la parte
735superior del árbol de fuentes del kernel y no use demasiado espacio
736horizontal (que encaje fácilmente en 80 columnas, tal vez con alguna
737indentación). (``git`` genera diffstats apropiados por defecto).
738
739Otros comentarios relevantes solo en el momento o para el maintainer, pero
740no adecuados para el registro de cambios permanente, también debe ir aquí.
741Un buen ejemplo de tales comentarios podría ser ``registros de cambios de
742parches`` que describen qué ha cambiado entre la versión v1 y v2 del
743parche.
744
745Por favor, ponga esta información **después** de la línea ``---`` que
746separa el registro de cambios del resto del parche. La información de la
747versión no forma parte del registro de cambios que se incluye con el árbol
748git. Es información adicional para los revisores. Si se coloca encima de la
749etiquetas de commit, necesita interacción manual para eliminarlo. Si esta
750debajo de la línea de separación, se quita automáticamente al aplicar el
751parche::
752
753  <mensaje de commit>
754  ...
755  Signed-off-by: Autor <autor@correo>
756  ---
757  V2 -> V3: función auxiliar redundante eliminada
758  V1 -> V2: estilo de código limpio y comentarios de revisión abordados
759
760  ruta/al/archivo | 5+++--
761  ...
762
763Revise más detalles sobre el formato de parche adecuado en las siguientes
764referencias
765
766.. _sp_backtraces:
767
768Retrocesos en mensajes de confirmación
769^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
770
771Los "backtraces" (deshacer el camino) ayuda a documentar la cadena de
772llamadas que conducen a un problema. Sin embargo, no todos los rastreos son
773útiles. Por ejemplo, las tempranas cadenas de llamadas de inicio son únicas
774y obvias. Sin embargo, al copiar la salida completa de dmesg textualmente,
775incluye información que distrae, como marcas de tiempo, listas de módulos,
776registro y volcados de pila.
777
778Por lo tanto, los backtraces más útiles deben contener los datos
779relevantes de la información vertida, lo que hace que sea más fácil
780centrarse en el verdadero tema. Este es un ejemplo de un backtrace bien
781recortado::
782
783  error de acceso de MSR no verificado: WRMSR a 0xd51 (intentó escribir 0x0000000000000064)
784  en rIP: 0xffffffffae059994 (native_write_msr+0x4/0x20)
785  Rastreo de llamadas:
786  mba_wrmsr
787  update_domains
788  rdtgroup_mkdir
789
790.. _sp_explicit_in_reply_to:
791
792In-Reply-To explicitos en las cabeceras
793---------------------------------------
794
795Puede ser útil agregar manualmente encabezados In-Reply-To: a un parche
796(por ejemplo, al usar ``git send-email``) para asociar el parche con una
797discusión anterior relevante, por ejemplo para vincular una corrección de
798errores al correo electrónico con el informe de errores. Sin embargo, para
799una serie de parches múltiples, generalmente es mejor evitar usar
800In-Reply-To: para vincular a versiones anteriores de la serie. De esta
801forma, varias versiones del parche no se convierten en un inmanejable
802bosque de referencias en clientes de correo electrónico. Si un enlace es
803útil, puede usar el redirector https://lore.kernel.org/ (por ejemplo, en
804el texto de la carta de introducción del correo electrónico) para vincular
805a una versión anterior de la serie de parches.
806
807
808Proporcionar información de árbol base
809--------------------------------------
810
811Cuando otros desarrolladores reciben sus parches y comienzan el proceso de
812revisión, a menudo es útil para ellos saber en qué parte del historial del
813árbol deben colocar su trabajo. Esto es particularmente útil para CI
814automatizado de procesos que intentan ejecutar una serie de pruebas para
815establecer la calidad de su envío antes de que el maintainer comience la
816revisión.
817
818Si está utilizando ``git format-patch`` para generar sus parches, puede
819incluir automáticamente la información del árbol base en su envío usando el
820parámetro ``--base``. La forma más fácil y conveniente de usar esta opción
821es con "topical branches" (ramas de temas)::
822
823    $ git checkout -t -b my-topical-branch master
824    Branch 'my-topical-branch' set up to track local branch 'master'.
825    Switched to a new branch 'my-topical-branch'
826
827    [realice sus cambios y ediciones]
828
829    $ git format-patch --base=auto --cover-letter -o outgoing/ master
830    outgoing/0000-cover-letter.patch
831    outgoing/0001-First-Commit.patch
832    outgoing/...
833
834Cuando abra ``outgoing/0000-cover-letter.patch`` para editar, tenga en
835cuenta que tendrá el tráiler ``base-commit:`` al final, que proporciona al
836revisor y a las herramientas de CI suficiente información para realizar
837correctamente ``git am`` sin preocuparse por los conflictos::
838
839    $ git checkout -b patch-review [base-commit-id]
840    Switched to a new branch 'patch-review'
841    $ git am patches.mbox
842    Applying: First Commit
843    Applying: ...
844
845Consulte ``man git-format-patch`` para obtener más información al respecto
846de esta opción.
847
848.. Note::
849
850    La función ``--base`` se introdujo en la versión 2.9.0 de git.
851
852Si no está utilizando git para dar forma a sus parches, aún puede incluir
853el mismo tráiler ``base-commit`` para indicar el hash de confirmación del
854árbol en que se basa su trabajo. Debe agregarlo en la carta de presentación
855o en el primer parche de la serie y debe colocarse ya sea bajo la línea
856``---`` o en la parte inferior de todos los demás contenido, justo antes de
857su firma del correo electrónico.
858
859
860Referencias
861-----------
862
863"The perfect patch" (tpp) por Andrew Morton.
864  <https://www.ozlabs.org/~akpm/stuff/tpp.txt>
865
866"Linux kernel patch submission format" por Jeff Garzik.
867  <https://web.archive.org/web/20180829112450/http://linux.yyz.us/patch-format.html>
868
869"How to piss off a kernel subsystem maintainer" por Greg Kroah-Hartman.
870  <http://www.kroah.com/log/linux/maintainer.html>
871
872  <http://www.kroah.com/log/linux/maintainer-02.html>
873
874  <http://www.kroah.com/log/linux/maintainer-03.html>
875
876  <http://www.kroah.com/log/linux/maintainer-04.html>
877
878  <http://www.kroah.com/log/linux/maintainer-05.html>
879
880  <http://www.kroah.com/log/linux/maintainer-06.html>
881
882NO!!!! Gente, no mas bombas enormes de parches a linux-kernel@vger.kernel.org!
883  <https://lore.kernel.org/r/20050711.125305.08322243.davem@davemloft.net>
884
885Kernel Documentation/process/coding-style.rst
886
887Email de Linus Torvalds sobre la forma canónica de los parches:
888  <https://lore.kernel.org/r/Pine.LNX.4.58.0504071023190.28951@ppc970.osdl.org>
889
890"On submitting kernel patches" por Andi Kleen
891  Algunas estrategias para conseguir incluir cambios complicados o
892  controvertidos.
893
894  http://halobates.de/on-submitting-patches.pdf
895