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