xref: /linux/Documentation/translations/pt_BR/process/5.Posting.rst (revision 72fdff1416e280e2baaa3cca69574defb998437e)
1.. SPDX-License-Identifier: GPL-2.0
2
3Enviando patches
4================
5
6Cedo ou tarde, chega o momento em que seu trabalho está pronto para ser
7apresentado à comunidade para revisão e, eventualmente, inclusão no kernel
8mainline. Sem surpresa, a comunidade de desenvolvimento do kernel evoluiu um
9conjunto de convenções e procedimentos que são usados no envio de patches;
10segui-los tornará a vida muito mais fácil para todos os envolvidos. Este
11documento tentará cobrir essas expectativas em detalhes razoáveis; mais
12informações também podem ser encontradas nos arquivos
13:ref:`Documentation/process/submitting-patches.rst <submittingpatches>`
14e :ref:`Documentation/process/submit-checklist.rst <submitchecklist>`.
15
16
17Quando enviar
18-------------
19
20Existe uma tentação constante de evitar o envio de patches antes que eles
21estejam completamente "prontos". Para patches simples, isso não é um problema.
22No entanto, se o trabalho que está sendo feito for complexo, há muito a se
23ganhar obtendo feedback da comunidade antes que o trabalho esteja concluído.
24Portanto, você deve considerar o envio de trabalhos em andamento, ou até mesmo
25disponibilizar uma árvore git para que os desenvolvedores interessados possam
26acompanhar o seu trabalho a qualquer momento.
27
28Ao enviar um código que ainda não é considerado pronto para inclusão, é uma boa
29ideia dizer isso no próprio envio. Mencione também qualquer trabalho importante
30que ainda precise ser feito e quaisquer problemas conhecidos. Menos pessoas vão
31olhar para patches que sabidamente estão "meio cozidos" (half-baked), mas aqueles
32que o fizerem virão com a ideia de que podem ajudá-lo a conduzir o trabalho na
33direção certa.
34
35
36Antes de criar patches
37----------------------
38
39Há uma série de coisas que devem ser feitas antes de você considerar o envio
40de patches para la comunidade de desenvolvimento. Elas incluem:
41
42 - Teste o código tanto quanto puder. Faça uso das ferramentas de depuração
43   do kernel, garanta que o kernel seja compilado com todas as combinações
44   razoáveis de opções de configuração, use compiladores cruzados (cross-
45   compilers) para compilar para diferentes arquiteturas, etc. Adicione testes,
46   provavelmente usando um framework de testes existente como o KUnit, e
47   inclua-os como um membro separado da sua série (veja a próxima seção para
48   mais informações sobre séries de patches). Note que isso pode ser
49   obrigatório ao afetar alguns subsistemas. Por exemplo, funções de biblioteca
50   (localizadas sob lib/) são amplamente utilizadas em quase todos os lugares e
51   espera-se que sejam testadas adequadamente.
52
53 - Certifique-se de que seu código esteja em conformidade com as diretrizes de
54   estilo de codificação do kernel.
55
56 - Sua alteração tem implicações no desempenho? Se sim, você deve executar
57   benchmarks mostrando qual é o impacto (ou benefício) da sua mudança; um
58   resumo dos resultados deve ser incluído junto ao patch.
59
60 - Tenha certeza de que você tem o direito de enviar o código. Se este
61   trabalho foi feito para um empregador, o empregador provavelmente tem direito
62   sobre o trabalho e deve estar de acordo com a sua liberação sob a GPL.
63
64Como regra geral, dedicar um pouco de reflexão extra antes de enviar o código
65quase sempre compensa o esforço em pouco tempo.
66
67
68Preparação de patches
69---------------------
70
71A preparação de patches para envio pode dar uma quantidade surpreendente de
72trabalho, mas, mais uma vez, tentar economizar tempo aqui geralmente não é
73aconselhável, mesmo a curto prazo.
74
75Os patches devem ser preparados contra uma versão específica do kernel. Como
76regra geral, um patch deve ser baseado no mainline atual encontrado na árvore
77git do Linus. Ao basear-se no mainline, comece a partir de um ponto de
78lançamento bem conhecido — um release estável ou -rc —, em vez de criar uma
79bifurcação (branch) a partir do mainline em um ponto arbitrário.
80
81No entanto, pode tornar-se necessário criar versões contra a árvore -mm,
82linux-next ou a árvore de um subsistema, para facilitar testes e revisões mais
83amplos. Dependendo da área do seu patch e do que está acontecendo em outros
84lugares, basear um patch contra essas outras árvores pode exigir uma quantidade
85significativa de trabalho para resolver conflitos e lidar com mudanças de API.
86
87Apenas as alterações mais simples devem ser formatadas como um único patch; tudo
88o mais deve ser feito como uma série lógica de mudanças. Dividir patches é uma
89arte; alguns desenvolvedores passam muito tempo descobrindo como fazer isso da
90maneira que a comunidade espera. Existem algumas regras práticas, no entanto,
91que podem ajudar consideravelmente:
92
93 - A série de patches que você envia quase certamente não será a série de
94   alterações encontrada no seu sistema de controle de versão de trabalho. Em
95   vez disso, as mudanças que você fez precisam ser consideradas em sua forma
96   final e, então, divididas de maneiras que façam sentido. Os desenvolvedores
97   estão interessados em alterações discretas e autocontidas, não no caminho
98   que você percorreu para chegar a essas alterações.
99
100 - Cada alteração logicamente independente deve ser formatada como um patch separado.
101   Essas alterações podem ser pequenas ("adicionar um campo a esta estrutura") ou
102   grandes (adicionar um driver totalmente novo, por exemplo), mas devem ser
103   conceitualmente pequenas e passíveis de uma descrição de uma única linha. Cada
104   patch deve fazer uma alteração específica que possa ser revisada por si só e
105   verificada para garantir que faz o que diz fazer.
106
107 - Como uma forma de reafirmar a diretriz acima: não misture diferentes tipos de
108   alterações no mesmo patch. Se um único patch corrige uma falha crítica de
109   segurança, reorganiza algumas estruturas e reformatará o código, há uma grande
110   chance de que ele seja ignorado e a correção importante seja perdida.
111
112 - Cada patch deve resultar em um kernel que compile e funcione corretamente; se
113   sua série de patches for interrompida no meio, o resultado ainda deve ser um
114   kernel funcional. A aplicação parcial de uma série de patches é um cenário
115   comum quando a ferramenta "git bisect" é usada para encontrar regressões; se o
116   resultado for um kernel quebrado, você tornará a vida mais difícil para os
117   desenvolvedores e usuários que estão engajados no nobre trabalho de rastrear
118   problemas.
119
120 - No entanto, não exagere. Certa vez, um desenvolvedor enviou um conjunto de
121   edições em um único arquivo como 500 patches separados — um ato que não o
122   tornou a pessoa mais popular na lista de discussão do kernel. Um único patch
123   pode ser razoavelmente grande, desde que ainda contenha uma única alteração
124   *lógica*.
125
126 - Pode ser tentador adicionar toda uma nova infraestrutura com uma série de
127   patches, mas deixar essa infraestrutura sem uso até que o patch final da série
128   ative tudo. Essa tentação deve ser evitada, se possível; se essa série
129   adicionar regressões, a bisseção (bisection) apontará o último patch como aquele
130   que causou o problema, mesmo que o bug real esteja em outro lugar. Sempre que
131   possível, um patch que adiciona código novo deve tornar esse código ativo
132   imediatamente.
133
134Trabalhar para criar a série de patches perfeita pode ser um processo
135frustrante, que exige bastante tempo e reflexão após o "trabalho real" ter sido
136concluído. Quando feito corretamente, no entanto, é um tempo bem gasto.
137
138
139Formatação de patches e logs de alterações
140------------------------------------------
141
142Então agora você tem uma série perfeita de patches para enviar, mas o trabalho
143ainda não terminou. Cada patch precisa ser formatado em uma mensagem que comunique
144de forma rápida e clara o seu propósito para o resto do mundo. Para esse fim,
145cada patch será composto pelo seguinte:
146
147 - Uma linha "From" opcional que nomeia o autor do patch. Esta linha só é
148   necessária se você estiver repassando o patch de outra pessoa via e-mail,
149   mas nunca é demais adicioná-la em caso de dúvida.
150
151 - Uma descrição de uma única linha sobre o que o patch faz. Esta mensagem deve
152   ser suficiente para que um leitor que a veja sem outro contexto consiga
153   compreender o escopo do patch; esta é a linha que aparecerá nos logs de
154   alterações (changelogs) de "forma curta". Esta mensagem geralmente é formatada
155   com o nome do subsistema relevante primeiro, seguido pelo propósito do patch.
156   Por exemplo:
157
158   ::
159
160     gpio: fix build on CONFIG_GPIO_SYSFS=n
161
162 - Uma linha em branco seguida por uma descrição detalhada do conteúdo do
163   patch. Esta descrição pode ser tão longa quanto necessário; ela deve dizer
164   o que o patch faz e por que ele deve ser aplicado ao kernel.
165
166 - Uma ou mais linhas de marcadores (tags) com, no mínimo, uma linha
167   "Signed-off-by:" do autor do patch. Os marcadores serão descritos em mais
168   detalhes abaixo.
169
170Os itens acima, juntos, formam o log de alterações (changelog) do patch. Escrever
171bons changelogs é uma arte crucial, mas frequentemente negligenciada; vale a
172pena dedicar mais um momento para discutir esse assunto. Ao escrever um
173changelog, você deve ter em mente que várias pessoas diferentes lerão suas
174palavras. Elas incluem mantenedores de subsistemas e revisores que precisam
175decidir se o patch deve ser incluído, distribuidores e outros mantenedores
176tentando decidir se um patch deve ser retroportado (backported) para outros
177kernels, caçadores de bugs se perguntando se o patch é responsável por um
178problema que estão perseguindo, usuários que querem saber como o kernel mudou e
179muito mais. Um bom changelog transmite a informação necessária para todas essas
180pessoas da maneira mais direta e concisa possível.
181
182Para esse fim, a linha de resumo deve descrever os efeitos e a motivação da
183alteração o melhor possível, dada a restrição de uma única linha. A descrição
184detalhada pode então ampliar esses tópicos e fornecer qualquer informação
185adicional necessária. Se o patch corrige um bug, cite o commit que introduziu o
186bug, se possível (e, por favor, forneça tanto o ID do commit quanto o título ao
187citar commits). Se um problema estiver associado a uma saída específica de log
188ou do compilador, inclua essa saída para ajudar outras pessoas que buscam uma
189solução para o mesmo problema. Se a mudança tem o objetivo de dar suporte a
190outras alterações que virão em um patch posterior, informe isso. Se as APIs
191internas forem alteradas, detalhe essas mudanças e como outros desenvolvedores
192devem reagir. Em geral, quanto mais você puder se colocar no lugar de todos que
193lerão seu changelog, melhor será esse changelog (e o kernel como um todo).
194
195Desnecessário dizer que o changelog deve ser o texto usado ao submeter (commit)
196a alteração em um sistema de controle de versão. Ele será seguido por:
197
198 - O patch em si, no formato de patch unificado ("-u"). O uso da opção "-p" no
199   diff associará os nomes das funções às alterações, tornando o patch resultante
200   mais fácil de ser lido por outras pessoas.
201
202As tags  já mencionadas brevemente acima são usados para fornecer
203informações sobre como o patch surgiu. Eles são descritos em detalhes no
204documento :ref:`Documentation/process/submitting-patches.rst <submittingpatches>`;
205o que se segue aqui é um breve resumo.
206
207Um marcador é usado para se referir a commits anteriores que introduziram os
208problemas corrigidos pelo patch::
209
210	Fixes: 1f2e3d4c5b6a ("The first line of the commit specified by the first 12 characters of its SHA-1 ID")
211
212Outro marcador é usado para vincular páginas da web com contextos ou detalhes
213adicionais, por exemplo, uma discussão anterior que levou ao patch ou um
214documento com uma especificação implementada pelo patch::
215
216  Link: https://example.com/somewhere.html  optional-other-stuff
217
218De acordo com as orientações do Pinguim-Chefe, um marcador Link
219só deve ser adicionado a um commit se ele levar a informações úteis que não
220são encontradas no próprio commit.
221
222Se a URL apontar para um relatório de bug público que está sendo corrigido pelo
223patch, use o marcador "Closes:" em seu lugar::
224
225	Closes: https://example.com/issues/1234  optional-other-stuff
226
227Alguns rastreadores de bugs têm a capacidade de fechar problemas de forma
228automática quando um commit com tal marcador é aplicado. Alguns bots que
229monitoram listas de discussão também podem rastrear esses marcadores e tomar certas
230ações. Rastreadores de bugs privados e URLs inválidas são proibidos.
231
232Outro tipo de marcador é usado para documentar quem esteve envolvido no
233desenvolvimento do patch. Cada um deles usa este formato::
234
235  tag: Full Name <email address>  optional-other-stuff
236
237Os marcadores de uso comum são:
238
239 - Signed-off-by: esta é uma certificação do desenvolvedor de que ele ou ela
240   tem o direito de enviar o patch para inclusão no kernel. É um acordo com o
241   Developer's Certificate of Origin (Certificado de Origem do Desenvolvedor),
242   cujo texto completo pode ser encontrado em
243   :ref:`Documentation/process/submitting-patches.rst <submittingpatches>`.
244   Códigos sem um signoff adequado não podem ser mesclados (merged) no mainline.
245
246 - Co-developed-by: afirma que o patch foi criado em coautoria por vários
247   desenvolvedores; é usado para dar atribuição aos coautores (além do autor
248   atribuído pelo marcador From:) quando várias pessoas trabalham em um único
249   patch. Cada Co-developed-by: deve ser imediatamente seguido por um
250   Signed-off-by: do coautor associado. Detalhes e exemplos podem ser encontrados
251   em :ref:`Documentation/process/submitting-patches.rst <submittingpatches>`.
252
253 - Acked-by: indica o acordo de outro desenvolvedor (frequentemente um
254   mantenedor do código relevante) de que o patch é apropriado para inclusão
255   no kernel.
256
257 - Tested-by: afirma que a pessoa nomeada testou o patch e verificou que ele
258   funciona.
259
260 - Reviewed-by: o desenvolvedor nomeado revisou o patch para verificar sua
261   correção; veja a declaração do revisor em
262   :ref:`Documentation/process/submitting-patches.rst <submittingpatches>`
263   para mais detalhes.
264
265 - Reported-by: nomeia um usuário que relatou o problema que é corrigido por este
266   patch; este marcador é usado para dar crédito às pessoas (frequentemente sub-
267   valorizadas) que testam nosso código e nos informam quando as coisas não
268   funcionam corretamente. Nota: este marcador deve ser seguido por um marcador
269   Closes: apontando para o relato, a menos que o relato não esteja disponível na
270   web. O marcador Link: pode ser usado em vez de Closes: se o patch corrigir
271   apenas uma parte do(s) problema(s) relatado(s).
272
273 - A Suggested-by: este marcador indica que a ideia do patch foi sugerida pela
274   pessoa nomeada e garante o crédito a ela pela ideia. Isso, espera-se, irá
275   inspirá-la a nos ajudar novamente no futuro.
276
277 - Cc: a pessoa nomeada recebeu uma cópia do patch e teve a oportunidade de
278   comentar sobre ele.
279
280Tenha cuidado ao adicionar os marcadores mencionados acima aos seus patches, pois
281todos, exceto Cc:, Reported-by: e Suggested-by:, precisam de permissão explícita
282fontes da pessoa nomeada. Para esses três, a permissão implícita é suficiente se
283a pessoa contribuiu para o kernel Linux usando esse nome e endereço de e-mail de
284acordo com os arquivos do lore ou o histórico de commits — e, no caso de
285Reported-by: e Suggested-by:, se fizeram o relato ou a sugestão publicamente.
286Nota: o bugzilla.kernel.org é um local público nesse sentido, mas os endereços
287de e-mail usados lá são privados; portanto, não os exponha em marcadores, a menos
288que a pessoa os tenha usado em contribuições anteriores.
289
290
291Enviando o patch
292-----------------
293
294Antes de enviar seus patches por e-mail, há algumas outras coisas com as quais
295você deve se preocupar:
296
297 - Você tem certeza de que seu cliente de e-mail não vai corromper os patches?
298   Patches que sofreram alterações desnecessárias de espaço em branco ou quebra
299   de linha causadas pelo cliente de e-mail não serão aplicados na outra ponta
300   e, frequentemente, não serão examinados em detalhes. Se houver qualquer
301   dúvida, envie o patch para você mesmo e certifique-se de que ele chegue intacto.
302
303   O documento :ref:`Documentation/process/email-clients.rst <email_clients>`
304   possui algumas dicas úteis sobre como fazer clientes de e-mail específicos
305   funcionarem para o envio de patches.
306
307 - Você tem certeza de que seu patch está livre de erros bobos? Você deve sempre
308   passar os patches pelo scripts/checkpatch.pl e corrigir as reclamações que
309   ele apresentar. Por favor, tenha em mente que o checkpatch.pl, embora seja a
310   personificação de uma quantidade razoável de reflexão sobre como os patches do
311   kernel devem parecer, não é mais inteligente que você. Se corrigir uma
312   reclamação do checkpatch.pl piorar o código, não o faça.
313
314Os patches devem sempre ser enviados como texto simples (plain text). Por favor,
315não os envie como anexos; isso torna muito mais difícil para os revisores citarem
316trechos do patch em suas respostas. Em vez disso, coloque o patch diretamente no
317corpo da sua mensagem.
318
319Ao enviar patches por e-mail, é importante enviar cópias para qualquer pessoa
320que possa estar interessada neles. Ao contrário de alguns outros projetos, o
321kernel incentiva as pessoas a pecarem pelo excesso, enviando cópias demais; não
322assuma que as pessoas relevantes verão sua publicação nas listas de discussão. Em
323particular, as cópias devem ir para:
324
325- O(s) mantenedor(es) do(s) subsistema(s) afetado(s). Como descrito antes, o
326   arquivo MAINTAINERS é o primeiro lugar para procurar por essas pessoas.
327
328 - Outros desenvolvedores que estiveram trabalhando na mesma área — especialmente
329   aqueles que possam estar trabalhando lá agora. Usar o git para ver quem mais
330   modificou os arquivos nos quais você está trabalhando pode ser útil.
331
332 - Se você estiver respondendo a um relato de bug ou a uma solicitação de recurso
333   (feature request), envie uma cópia também para o autor original.
334
335 - Envie uma cópia para a lista de discussão relevante ou, se nada mais se
336   aplicar, para a lista linux-kernel.
337
338 - Se você estiver corrigindo um bug, pense se a correção deve ir para a próxima
339   atualização estável (stable update). Se sim, stable@vger.kernel.org deve
340   receber uma cópia do patch. Adicione também um "Cc: stable@vger.kernel.org"
341   aos marcadores (tags) dentro do próprio patch; isso fará com que a equipe do
342   stable receba uma notificação quando sua correção for integrada ao mainline.
343
344Ao selecionar os destinatários para um patch, é bom ter uma ideia de quem você
345acha que eventualmente aceitará o patch e fará a mesclagem (merge). Embora seja
346possível enviar patches diretamente para Linus Torvalds e fazer com que ele os
347mescle, as coisas normalmente não são feitas dessa forma. Linus está ocupado, e
348existem mantenedores de subsistemas que vigiam partes específicas do kernel. Em
349geral, você desejará que esse mantenedor mescle seus patches. Se não houver um
350mantenedor óbvio, Andrew Morton costuma ser o destino de patch de último recurso.
351
352Os patches precisam de boas linhas de assunto (subject lines). O formato canônico
353para a linha de um patch é algo como:
354
355::
356
357
358  [PATCH nn/mm] subsys: descrição de uma linha do patch
359
360onde "nn" é o número ordinal do patch, "mm" é o número total de patches na
361série, e "subsys" é o nome do subsistema afetado. Claramente, nn/mm pode ser
362omitido no caso de um patch único e isolado (standalone).
363
364Se você tiver uma série significativa de patches, é costumeiro enviar uma
365descrição introdutória como a parte zero. Essa convenção não é seguida
366universalmente, no entanto; se você a utilizar, lembre-se de que as informações
367da introdução não entram nos changelogs do kernel. Portanto, certifique-se de
368que os patches, em si, possuam informações completas em seus changelogs.
369
370Em geral, a segunda parte e as subsequentes de um patch de múltiplas partes devem
371ser enviadas como uma resposta à primeira parte, de modo que todas formem uma
372única linha de discussão (thread) na ponta receptora. Ferramentas como o git e o
373quilt possuem comandos para enviar por e-mail um conjunto de patches com o
374encadeamento correto. Se você tiver uma série longa, contudo, e estiver usando o
375git, por favor, evite a opção --chain-reply-to para não criar um aninhamento
376excepcionalmente profundo.
377