1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
|
.. 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.
|