1.. SPDX-License-Identifier: GPL-2.0 2 3.. _pt_BR_submittingpatches: 4 5Enviando patches: o guia essencial para colocar o seu código no kernel 6====================================================================== 7 8Para uma pessoa ou empresa que deseja enviar uma mudança para o 9kernel Linux, o processo pode, por vezes, ser intimidador se você não 10estiver familiarizado com "o sistema". Este texto é uma coleção de sugestões 11que podem aumentar muito as chances de sua mudança ser aceita. 12 13Este documento contém um grande número de sugestões em um formato relativamente 14conciso. Para informações detalhadas sobre como funciona o processo de 15desenvolvimento do kernel, consulte Documentation/process/development-process.rst. 16Além disso, leia Documentation/process/submit-checklist.rst 17para uma lista de itens a serem verificados antes de enviar o código. 18Para patches de binding de device tree, leia 19Documentation/devicetree/bindings/submitting-patches.rst. 20 21Esta documentação assume que você está usando o ``git`` para preparar seus 22patches. Se você não está familiarizado com o ``git``, é muito recomendado que 23você aprenda a usá-lo, ele tornará a sua vida como um desenvolvedor do kernel e, 24em geral, muito mais fácil. 25 26Alguns subsistemas e árvores de mantenedores possuem informações adicionais 27sobre seus fluxos de trabalho e expectativas, consulte 28Documentation/process/maintainer-handbooks.rst. 29 30Obtenha uma árvore de código-fonte atual 31---------------------------------------- 32 33Se você não tiver um repositório com o código-fonte atual do kernel em mãos, 34use o ``git`` para obter um. Você vai querer começar com o repositório mainline, 35que pode ser obtido com:: 36 37 git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 38 39Note, no entanto, que você pode não querer desenvolver diretamente na 40árvore mainline. A maioria dos mantenedores de subsistemas mantém suas 41próprias árvores e desejam ver os patches preparados em relação a essas árvores. 42Consulte a entrada **T:** do subsistema no arquivo MAINTAINERS para encontrar 43essa árvore, ou simplesmente pergunte ao mantenedor se a árvore não estiver 44listada lá. 45 46.. _pt_BR_describe_changes: 47 48Descreva as suas mudanças 49------------------------- 50 51Descreva o seu problema. Seja o seu patch uma correção de bug de uma linha ou 525000 linhas de um novo recurso, deve haver um problema subjacente que o motivou 53a fazer esse trabalho. Convença o revisor de que existe um problema que vale a 54pena corrigir e que faz sentido que ele leia além do primeiro parágrafo. 55 56Descreva o impacto visível ao usuário. Travamentos e bloqueios diretos são 57bastante convincentes, mas nem todos os bugs são tão evidentes. Mesmo que o 58problema tenha sido identificado durante a revisão do código, descreva o impacto 59que você acredita que ele pode ter sobre os usuários. Tenha em mente que a 60maioria das instalações Linux executa kernels de árvores estáveis secundárias 61ou árvores específicas de fornecedores/produtos que selecionam apenas patches 62específicos do upstream, então inclua qualquer coisa que possa ajudar a 63direcionar sua mudança downstream: circunstâncias provocadoras, trechos do 64dmesg, descrições do travamento, regressões de desempenho, picos de latência, 65bloqueios, etc. 66 67Quantifique as otimizações e compensações. Se você afirma haver melhorias no 68desempenho, consumo de memória, uso da pilha ou tamanho do binário, inclua 69números que as comprovem. Mas também descreva custos que não são óbvios. 70Otimizações geralmente não são gratuitas, sendo trocas entre CPU, memória e 71legibilidade; ou, quando se trata de heurísticas, entre diferentes cargas de 72trabalho. Descreva as desvantagens esperadas da sua otimização para que o 73revisor possa pesar os custos contra os benefícios. 74 75Uma vez estabelecido o problema, descreva o que você está efetivamente fazendo 76sobre ele, com detalhes técnicos. É importante descrever a mudança em inglês 77claro para o revisor verificar que o código está se comportando como 78você pretendia. 79 80O mantenedor agradecerá se você escrever a descrição do seu patch em uma forma 81que possa ser facilmente inserida no sistema de gerenciamento de código-fonte do 82Linux, o ``git``, como uma "mensagem de commit". Veja 83:ref:`pt_BR_the_canonical_patch_format`. 84 85Resolva apenas um problema por patch. Se a sua descrição começar a ficar longa, 86isso é um sinal de que você provavelmente precisa dividir o seu patch. 87Consulte :ref:`pt_BR_split_changes`. 88 89Quando você enviar ou reenviar um patch ou uma série de patches, inclua a 90descrição completa do patch e a justificativa para ele. Não diga apenas 91que esta é a versão N do patch (ou série). Não espere que o mantenedor 92do subsistema consulte versões anteriores do patch ou URLs de referência 93para encontrar a descrição do patch e colocá-la no patch. 94Ou seja, o patch (ou a série) e sua descrição devem ser autossuficientes. 95Isso beneficia tanto os mantenedores quanto os revisores. Alguns revisores 96provavelmente nem chegaram a receber as versões anteriores do patch. 97 98Descreva suas alterações no modo imperativo, por exemplo, "faça xyzzy executar 99frotz" em vez de "[Este patch] faz xyzzy executar frotz" ou "[Eu] mudei xyzzy 100para executar frotz", como se você estivesse dando ordens à base de código para 101mudar o seu comportamento. 102 103Se você quiser se referir a um commit específico, não se refira apenas ao 104ID SHA-1 do commit. Por favor, inclua também o resumo de uma linha do 105commit, para tornar mais fácil para os revisores saberem sobre o que se trata. 106Exemplo:: 107 108 Commit e21d2170f36602ae2708 ("video: remove unnecessary 109 platform_set_drvdata()") removed the unnecessary 110 platform_set_drvdata(), but left the variable "dev" unused, 111 delete it. 112 113Você também deve ter a certeza de usar pelo menos os primeiros doze caracteres do 114ID SHA-1. O repositório do kernel possui um número *muito* grande de objetos, o que torna as 115colisões com IDs mais curtos uma possibilidade real. Tenha em mente que, mesmo que 116não haja colisão com o seu ID de seis caracteres agora, essa condição pode 117mudar daqui a cinco anos. 118 119Se discussões relacionadas ou qualquer outra informação de contexto por trás da mudança 120puderem ser encontradas na web, adicione tags 'Link:' apontando para isso. Se o patch é o 121resultado de algumas discussões anteriores na lista de e-mails ou algo documentado na 122web, aponte para ele. 123 124Ao criar links para arquivos de listas de e-mails, de preferência use o serviço 125de arquivo de mensagens lore.kernel.org. Para criar a URL do link, use o 126conteúdo do cabeçalho ``Message-ID`` da mensagem, sem os colchetes angulares 127circundantes. Por exemplo:: 128 129 Link: https://lore.kernel.org/30th.anniversary.repost@klaava.Helsinki.FI 130 131Por favor, verifique o link para se certificar de que ele está realmente 132funcionando e aponta para a mensagem relevante. 133 134No entanto, tente tornar a sua explicação compreensível sem recursos 135externos. Além de fornecer um URL para um arquivo da lista de e-mails ou bug, 136resuma os pontos relevantes da discussão que levaram ao patch conforme enviado. 137 138Caso o seu patch corrija um bug, use a tag 'Closes:' com um URL que referencie o 139relato nos arquivos da lista de e-mails ou em um rastreador público de bugs. Por exemplo:: 140 141 Closes: https://example.com/issues/1234 142 143Alguns rastreadores de bugs têm a capacidade de fechar os problemas 144automaticamente quando um commit com tal tag é aplicado. Alguns bots que monitoram as listas de 145e-mails também podem rastrear tais tags e tomar certas ações. Rastreadores de bugs 146privados e URLs inválidos são proibidos. 147 148Se o seu patch corrige um bug em um commit específico, por exemplo, você encontrou um problema usando 149``git bisect``, por favor, use a tag 'Fixes:' com pelo menos os primeiros 12 150caracteres do ID SHA-1 e o resumo de uma linha. Não divida a tag em 151várias linhas, as tags estão isentas da regra de "quebra de linha nas 75 colunas" para 152simplificar os scripts de parsing. Por exemplo:: 153 154 Fixes: 54a4f0239f2e ("KVM: MMU: make kvm_mmu_zap_page() return the number of pages it actually freed") 155 156As seguintes configurações do ``git config`` podem ser usadas para adicionar um formato aprimorado para 157exibir o estilo acima nos comandos ``git log`` ou ``git show``:: 158 159 [core] 160 abbrev = 12 161 [pretty] 162 fixes = Fixes: %h (\"%s\") 163 164Um exemplo de chamada:: 165 166 $ git log -1 --pretty=fixes 54a4f0239f2e 167 Fixes: 54a4f0239f2e ("KVM: MMU: make kvm_mmu_zap_page() return the number of pages it actually freed") 168 169.. _pt_BR_split_changes: 170 171Separe as suas mudanças 172----------------------- 173 174Separe cada **mudança lógica** em um patch separado. 175 176Por exemplo, se as suas alterações incluírem tanto correções de bugs quanto melhorias 177de desempenho para um único driver, separe essas alterações em dois 178ou mais patches. Se as suas alterações incluírem uma atualização de API e um novo 179driver que utiliza essa nova API, separe-os em dois patches. 180 181Por outro lado, se você fizer uma única alteração em vários arquivos, 182agrupe essas alterações em um único patch. Assim, uma única mudança 183lógica está contida em um único patch. 184 185O ponto a lembrar é que cada patch deve fazer uma mudança facilmente compreendida 186que possa ser verificada pelos revisores. Cada patch deve ser justificável 187por seus próprios méritos. 188 189Se um patch depender de outro patch para que uma mudança seja 190completa, não tem problema. Simplesmente note **"this patch depends on patch X"** 191na descrição do seu patch. 192 193Ao dividir a sua mudança em uma série de patches, tome um cuidado especial para 194garantir que o kernel compile e seja executado adequadamente após cada patch da 195série. Desenvolvedores que usam o ``git bisect`` para rastrear um problema podem acabar 196dividindo a sua série de patches em qualquer ponto; eles não ficarão gratos se você 197introduzir bugs no meio do processo. 198 199Se você não conseguir condensar o seu conjunto de patches em um conjunto menor 200de patches, então publique, digamos, apenas uns 15 de cada vez e aguarde pela 201revisão e integração. 202 203 204 205Verifique o estilo das suas mudanças 206------------------------------------ 207 208Verifique o seu patch quanto a violações básicas de estilo, cujos detalhes podem ser 209encontrados em Documentation/process/coding-style.rst. 210Não fazer isso simplesmente desperdiça 211o tempo dos revisores e fará com que o seu patch seja rejeitado, provavelmente 212sem sequer ser lido. 213 214Uma exceção significativa é quando se move código de um arquivo para 215outro -- neste caso você não deve modificar o código movido no 216mesmo patch que o move. Isso delineia claramente o ato de 217mover o código e as suas alterações. Isso ajuda muito a revisão das 218diferenças reais e permite que as ferramentas rastreiem melhor o histórico do 219próprio código. 220 221Verifique os seus patches com o verificador de estilo de patch antes de os submeter 222(scripts/checkpatch.pl). Note, porém, que o verificador de estilo deve ser 223visto como um guia, e não como um substituto para o julgamento humano. Se o seu 224código parecer melhor com uma violação, provavelmente é melhor deixá-lo como está. 225 226O verificador emite relatórios em três níveis: 227 - ERROR: coisas que muito provavelmente estão erradas 228 - WARNING: coisas que requerem uma revisão cuidadosa 229 - CHECK: coisas que requerem reflexão 230 231Você deve ser capaz de justificar todas as violações que permanecerem no seu 232patch. 233 234Selecione os destinatários do seu patch 235--------------------------------------- 236 237Você deve sempre copiar o(s) mantenedor(es) e a(s) lista(s) do subsistema 238apropriado(s) em qualquer patch para o código que eles mantêm; dê uma 239olhada no arquivo MAINTAINERS e no histórico de revisão do código-fonte 240para ver quem são esses mantenedores. O script scripts/get_maintainer.pl 241pode ser muito útil nesta etapa (passe os caminhos para seus patches 242como argumentos para scripts/get_maintainer.pl). Se você não conseguir 243encontrar um mantenedor para o subsistema em que está trabalhando, 244Andrew Morton (akpm@linux-foundation.org) serve como um mantenedor de 245último recurso. 246 247linux-kernel@vger.kernel.org deve ser usado por padrão para todos os 248patches, mas o volume dessa lista fez com que vários desenvolvedores a 249ignorassem. Por favor, não envie spam para listas e pessoas não 250relacionadas. 251 252Muitas listas relacionadas ao kernel estão hospedadas em kernel.org; 253você pode encontrar uma lista delas em https://subspace.kernel.org. 254Existem listas relacionadas ao kernel hospedadas em outros lugares 255também, no entanto. 256 257Linus Torvalds é o árbitro final de todas as mudanças aceitas no 258kernel do Linux. Seu endereço de e-mail é <torvalds@linux-foundation.org>. 259Ele recebe muitos e-mails e, neste momento, muito poucos patches passam 260por Linus diretamente, então, normalmente, você deve fazer o seu melhor 261para -evitar- enviar e-mails para ele. 262 263Se você tiver um patch que corrija um bug de segurança explorável, 264envie esse patch para security@kernel.org. Para bugs severos, um 265curto embargo pode ser considerado para permitir que os distribuidores 266disponibilizem o patch aos usuários; em tais casos, obviamente, o 267patch não deve ser enviado a nenhuma lista pública. Veja também 268Documentation/process/security-bugs.rst. 269 270Patches que corrigem um bug severo em um kernel já lançado devem ser 271direcionados aos mantenedores stable (estáveis), colocando uma linha como esta:: 272 273 Cc: stable@vger.kernel.org 274 275na área de sign-off do seu patch (note, NÃO como um destinatário de e-mail). 276Você também deve ler Documentation/process/stable-kernel-rules.rst 277além deste documento. 278 279Se as alterações afetarem as interfaces userland-kernel, 280por favor, envie ao mantenedor das MAN-PAGES (como listado no arquivo MAINTAINERS) 281um patch para as páginas de manual, ou pelo menos uma notificação da alteração, 282para que alguma informação chegue às páginas de manual. Mudanças na API 283do espaço de usuário também devem ser copiadas para linux-api@vger.kernel.org. 284 285 286Sem MIME, sem links, sem compressão, sem anexos. Apenas texto puro 287------------------------------------------------------------------ 288 289Linus e outros desenvolvedores do kernel precisam ser capazes de ler e 290comentar as mudanças que você está enviando. É importante que um 291desenvolvedor do kernel seja capaz de "citar" suas mudanças, usando 292ferramentas de e-mail padrão, para que eles possam comentar em partes 293específicas do seu código. 294 295Por esse motivo, todos os patches devem ser enviados por e-mail "inline". A 296maneira mais fácil de fazer isso é com ``git send-email``, que é 297fortemente recomendado. Um tutorial interativo para ``git send-email`` 298está disponível em https://git-send-email.io. 299 300Se você optar por não usar ``git send-email``: 301 302.. warning:: 303 304 Tenha cuidado com a quebra de linha do seu editor corrompendo seu patch, 305 se você optar por recortar e colar o seu patch. 306 307Não anexe o patch como um anexo MIME, comprimido ou não. 308Muitos aplicativos populares de e-mail nem sempre transmitirão um 309anexo MIME como texto puro, tornando impossível comentar o seu 310código. Um anexo MIME também leva um pouco mais de tempo para Linus 311processar, diminuindo a probabilidade da sua alteração anexada em MIME 312ser aceita. 313 314Exceção: Se o seu cliente de e-mail estiver danificando os patches, 315alguém pode pedir que você os reenvie usando MIME. 316 317Veja Documentation/process/email-clients.rst para dicas sobre como 318configurar seu cliente de e-mail para que ele envie seus patches intocados. 319 320Responda aos comentários de revisão 321----------------------------------- 322 323Seu patch quase certamente receberá comentários dos revisores sobre maneiras 324pelas quais o patch pode ser melhorado, na forma de uma resposta ao seu 325e-mail. Você deve responder a esses comentários; ignorar revisores é uma 326boa maneira de ser ignorado em troca. Você pode simplesmente responder aos 327e-mails deles para responder aos seus comentários. Comentários de revisão 328ou perguntas que não levam a uma alteração no código devem quase certamente 329resultar em um comentário ou entrada no changelog para que o próximo 330revisor entenda melhor o que está acontecendo. 331 332Certifique-se de dizer aos revisores quais alterações você está fazendo e 333de agradecê-los pelo tempo dedicado. A revisão de código é um processo 334cansativo e demorado, e os revisores às vezes ficam mal-humorados. Mesmo 335nesse caso, no entanto, responda educadamente e resolva os problemas que 336eles apontaram. Ao enviar uma próxima versão, adicione um ``changelog do patch`` 337à carta de apresentação (cover letter) ou aos patches individuais, 338explicando a diferença em relação ao envio anterior (veja 339:ref:`pt_BR_the_canonical_patch_format`). 340Notifique as pessoas que comentaram no seu patch sobre as novas versões 341adicionando-as à lista de CC dos patches. 342 343Veja Documentation/process/email-clients.rst para recomendações sobre 344clientes de e-mail e etiqueta de listas de discussão. 345 346.. _pt_BR_interleaved_replies: 347 348Use respostas intercaladas e aparadas em discussões por e-mail 349-------------------------------------------------------------- 350O top-posting (responder no topo) é fortemente desencorajado em 351discussões de desenvolvimento do kernel do Linux. Respostas 352intercaladas (ou "inline") tornam as conversas muito mais fáceis de 353acompanhar. Para mais detalhes, veja: 354https://en.wikipedia.org/wiki/Posting_style#Interleaved_style 355 356Como é frequentemente citado na lista de discussão:: 357 358 A: http://en.wikipedia.org/wiki/Top_post 359 Q: Onde encontro informações sobre essa coisa chamada top-posting? 360 A: Porque bagunça a ordem em que as pessoas normalmente leem o texto. 361 Q: Por que o top-posting é algo tão ruim? 362 A: Top-posting. 363 Q: Qual é a coisa mais irritante no e-mail? 364 365Da mesma forma, por favor, apare (corte) todas as citações 366desnecessárias que não são relevantes para a sua resposta. Isso torna 367as respostas mais fáceis de encontrar, e economiza tempo e espaço. Para 368mais detalhes, veja: http://daringfireball.net/2007/07/on_top :: 369 370 A: Não. 371 Q: Devo incluir citações após minha resposta? 372 373.. _pt_BR_resend_reminders: 374 375Não desanime - nem fique impaciente 376----------------------------------- 377 378Depois de ter enviado a sua alteração, seja paciente e espere. Os 379revisores são pessoas ocupadas e podem não chegar ao seu patch 380imediatamente. 381 382Era uma vez, patches costumavam desaparecer no vazio sem comentários, 383mas o processo de desenvolvimento funciona de forma mais suave do que 384isso agora. Você deve receber comentários dentro de algumas semanas 385(normalmente 2-3); se isso não acontecer, certifique-se de que você 386enviou seus patches para o lugar certo. Espere por no mínimo uma 387semana antes de reenviar ou dar um "ping" nos revisores - 388possivelmente mais tempo durante períodos ocupados, como as janelas 389de mesclagem (merge windows). 390 391Também não há problema em reenviar o patch ou a série de patches após 392algumas semanas com a palavra "RESEND" adicionada à linha de Assunto:: 393 394 [PATCH Vx RESEND] sub/sys: Resumo condensado do patch 395 396Não adicione "RESEND" quando você estiver enviando uma versão 397modificada do seu patch ou série de patches - "RESEND" se aplica 398apenas ao reenvio de um patch ou série de patches que não foram 399modificados de forma alguma em relação ao envio anterior. 400 401 402Inclua PATCH no Assunto 403----------------------- 404 405Devido ao alto tráfego de e-mails para Linus e para a linux-kernel, é 406uma convenção comum prefixar a sua linha de Assunto com [PATCH]. Isso 407permite que Linus e outros desenvolvedores do kernel distingam 408mais facilmente os patches de outras discussões por e-mail. 409 410O ``git send-email`` fará isso por você automaticamente. 411 412 413Assine seu trabalho - o Certificado de Origem do Desenvolvedor 414-------------------------------------------------------------- 415 416Para melhorar o rastreamento de quem fez o que, especialmente com patches 417que podem percolar até o seu local de descanso final no kernel através de 418várias camadas de mantenedores, nós introduzimos um procedimento de 419"sign-off" nos patches que estão sendo enviados por e-mail. 420 421O sign-off é uma linha simples no final da explicação do patch, que 422certifica que você o escreveu ou que de outra forma tem o direito de 423repassá-lo como um patch de código aberto. As regras são bem simples: 424se você pode certificar o seguinte:: 425 426 Certificado de Origem do Desenvolvedor 1.1 427 428 Ao fazer uma contribuição para este projeto, eu certifico que: 429 430 (a) A contribuição foi criada no todo ou em parte por mim e eu 431 tenho o direito de enviá-la sob a licença de código aberto 432 indicada no arquivo; ou 433 434 (b) A contribuição baseia-se em trabalho anterior que, até onde eu 435 sei, é coberto por uma licença de código aberto apropriada 436 e eu tenho o direito, sob essa licença, de enviar esse 437 trabalho com modificações, tenham sido criadas no todo ou 438 em parte por mim, sob a mesma licença de código aberto (a menos que eu 439 tenha permissão para enviar sob uma licença diferente), conforme 440 indicado no arquivo; ou 441 442 (c) A contribuição foi fornecida diretamente a mim por alguma outra 443 pessoa que certificou (a), (b) ou (c) e eu não a modifiquei. 444 445 (d) Eu entendo e concordo que este projeto e a contribuição 446 são públicos e que um registro da contribuição (incluindo todas 447 as informações pessoais que eu envio com ela, incluindo meu 448 sign-off) é mantido indefinidamente e pode ser redistribuído de forma 449 consistente com este projeto ou com a(s) licença(s) de código 450 aberto envolvida(s). 451 452então você apenas adiciona uma linha dizendo:: 453 454 Signed-off-by: Random J Developer <random@developer.example.org> 455 456usando uma identidade conhecida (desculpe, sem contribuições anônimas.) 457Isso será feito para você automaticamente se você usar o ``git commit -s``. 458As reversões também devem incluir "Signed-off-by". O ``git revert -s`` 459faz isso por você. 460 461Algumas pessoas também colocam tags extras no final. Elas serão 462apenas ignoradas por enquanto, mas você pode fazer isso para marcar 463procedimentos internos da empresa ou apenas para apontar algum 464detalhe especial sobre o sign-off. 465 466Quaisquer outros SoBs (Signed-off-by:'s) seguindo o SoB do autor 467são de pessoas que manusearam e transportaram o patch, mas não 468estiveram envolvidas no seu desenvolvimento. As cadeias de SoB devem 469refletir a rota **real** que um patch percorreu à medida que foi 470propagado aos mantenedores e, finalmente, para Linus, com a primeira 471entrada de SoB sinalizando a autoria principal de um único autor. 472 473 474Quando usar Acked-by:, Cc: e Co-developed-by: 475--------------------------------------------- 476 477A tag Signed-off-by: indica que o signatário esteve envolvido no 478desenvolvimento do patch, ou que ele/ela estava no caminho de 479entrega do patch. 480 481Se uma pessoa não esteve diretamente envolvida na preparação ou manuseio de um 482patch, mas deseja manifestar e registrar sua aprovação, ela pode 483pedir para ter uma linha Acked-by: adicionada ao changelog do patch. 484 485Acked-by: destina-se a ser usado por aqueles responsáveis ou envolvidos com o 486código afetado de uma forma ou de outra. Mais comumente, o mantenedor quando esse 487mantenedor não contribuiu nem encaminhou o patch. 488 489Acked-by: também pode ser usado por outras partes interessadas, como pessoas com conhecimento de 490domínio (por exemplo, o autor original do código sendo modificado), revisores 491do lado do espaço de usuário para um patch uAPI do kernel ou usuários-chave de um recurso. Opcionalmente, 492nestes casos, pode ser útil adicionar um "# Sufixo" para esclarecer seu significado:: 493 494 Acked-by: The Stakeholder <stakeholder@example.org> # As primary user 495 496Acked-by: não é tão formal quanto Signed-off-by:. É um registro de que o avaliador 497pelo menos revisou o patch e indicou aceitação. Por isso, os responsáveis pela fusão de 498patches às vezes converterão manualmente um "sim, parece bom para mim" de um avaliador 499em um Acked-by: (mas note que geralmente é melhor pedir um 500ack explícito). 501 502Acked-by: também é menos formal do que Reviewed-by:. Por exemplo, mantenedores podem 503usá-lo para sinalizar que estão de acordo com a inclusão de um patch, mas podem não tê-lo 504revisado tão minuciosamente como se um Reviewed-by: fosse fornecido. Da mesma forma, um 505usuário-chave pode não ter realizado uma revisão técnica do patch, mas ainda assim estar 506satisfeito com a abordagem geral, o recurso ou a interface voltada para o usuário. 507 508Acked-by: não indica necessariamente o reconhecimento de todo o patch. 509Por exemplo, se um patch afeta vários subsistemas e tem um Acked-by: de 510um mantenedor de subsistema, isso geralmente indica o reconhecimento apenas 511da parte que afeta o código desse mantenedor. O bom senso deve ser usado aqui. 512Em caso de dúvida, as pessoas devem consultar a discussão original nos arquivos da 513lista de discussão. Um "# Sufixo" também pode ser usado neste caso para esclarecer. 514 515Se uma pessoa teve a oportunidade de comentar em um patch, mas não 516forneceu tais comentários, você pode opcionalmente adicionar uma tag ``Cc:`` ao patch. 517Esta tag documenta que partes potencialmente interessadas foram incluídas na 518discussão. Note que esta é uma de apenas três tags que você pode usar 519sem a permissão explícita da pessoa nomeada (veja 'Marcar pessoas requer 520permissão' abaixo para detalhes). 521 522Co-developed-by: afirma que o patch foi co-criado por múltiplos desenvolvedores; 523é usado para dar atribuição a coautores (além do autor 524atribuído pela tag From:) quando várias pessoas trabalham em um único patch. Como 525Co-developed-by: denota autoria, cada Co-developed-by: deve ser imediatamente 526seguido por um Signed-off-by: do coautor associado. O procedimento padrão de assinatura 527se aplica, ou seja, a ordem das tags Signed-off-by: deve refletir a 528história cronológica do patch na medida do possível, independentemente se 529o autor for atribuído via From: ou Co-developed-by:. Notavelmente, o último 530Signed-off-by: deve ser sempre o do desenvolvedor que está enviando o patch. 531 532Note que a tag From: é opcional quando o autor no From: também é a pessoa (e 533e-mail) listada na linha From: do cabeçalho do e-mail. 534 535Exemplo de um patch enviado pelo autor do From::: 536 537 <changelog> 538 539 Co-developed-by: First Co-Author <first@coauthor.example.org> 540 Signed-off-by: First Co-Author <first@coauthor.example.org> 541 Co-developed-by: Second Co-Author <second@coauthor.example.org> 542 Signed-off-by: Second Co-Author <second@coauthor.example.org> 543 Signed-off-by: From Author <from@author.example.org> 544 545Exemplo de um patch enviado por um autor do Co-developed-by::: 546 547 From: From Author <from@author.example.org> 548 549 <changelog> 550 551 Co-developed-by: Random Co-Author <random@coauthor.example.org> 552 Signed-off-by: Random Co-Author <random@coauthor.example.org> 553 Signed-off-by: From Author <from@author.example.org> 554 Co-developed-by: Submitting Co-Author <sub@coauthor.example.org> 555 Signed-off-by: Submitting Co-Author <sub@coauthor.example.org> 556 557 558Usando Reported-by:, Tested-by:, Reviewed-by:, Suggested-by: e Fixes: 559--------------------------------------------------------------------- 560 561A tag Reported-by dá crédito às pessoas que encontram bugs e os relatam e 562espera-se que isso as inspire a nos ajudar novamente no futuro. A tag destina-se a 563bugs; por favor, não a use para dar crédito a solicitações de recursos. A tag deve ser 564seguida por uma tag Closes: apontando para o relato, a menos que o relato não 565esteja disponível na web. A tag Link: pode ser usada em vez de Closes: se o patch 566corrigir uma parte do(s) problema(s) sendo relatado(s). Note que a tag Reported-by é 567uma de apenas três tags que você pode usar sem a permissão explícita da 568pessoa nomeada (veja 'Marcar pessoas requer permissão' abaixo para detalhes). 569 570Uma tag Tested-by: indica que o patch foi testado com sucesso (em 571algum ambiente) pela pessoa nomeada. Esta tag informa aos mantenedores que 572algum teste foi realizado, fornece um meio para localizar testadores para 573patches futuros e garante crédito para os testadores. 574 575Reviewed-by:, por sua vez, indica que o patch foi revisado e considerado 576aceitável de acordo com a Declaração do Revisor:: 577 578 Declaração de supervisão do revisor 579 580 Ao oferecer minha tag Reviewed-by:, eu declaro que: 581 582 (a) Eu realizei uma revisão técnica deste patch para 583 avaliar sua adequação e prontidão para inclusão no 584 kernel mainline. 585 586 (b) Quaisquer problemas, preocupações ou perguntas relacionadas ao patch 587 foram comunicadas de volta ao remetente. Eu estou satisfeito 588 com a resposta do remetente aos meus comentários. 589 590 (c) Embora possa haver coisas que poderiam ser melhoradas com este 591 envio, eu acredito que é, neste momento, (1) uma 592 modificação que vale a pena para o kernel, e (2) livre de problemas 593 conhecidos que argumentariam contra sua inclusão. 594 595 (d) Embora eu tenha revisado o patch e acredite que seja sólido, eu 596 não faço (a menos que explicitamente declarado em outro lugar) 597 garantias de que alcançará seu propósito 598 declarado ou funcionará adequadamente em qualquer situação. 599 600Uma tag Reviewed-by é uma declaração de opinião de que o patch é uma 601modificação apropriada do kernel sem nenhum problema técnico sério 602restante. Qualquer revisor interessado (que tenha feito o trabalho e seja uma 603pessoa com identidade conhecida) pode oferecer uma tag Reviewed-by para um patch. Esta tag 604serve para dar crédito aos revisores e para informar os mantenedores do grau de 605revisão que foi feito no patch. Tags Reviewed-by:, quando fornecidas por 606revisores conhecidos por entender a área de assunto e realizar revisões completas, 607normalmente aumentarão a probabilidade de seu patch entrar no kernel. 608 609Ambas as tags Tested-by e Reviewed-by, uma vez recebidas na lista de discussão do testador 610ou revisor, devem ser adicionadas pelo autor aos patches aplicáveis ao enviar as 611próximas versões. No entanto, se o patch mudou substancialmente na versão 612seguinte, essas tags podem não ser mais aplicáveis e, portanto, devem ser removidas. 613Normalmente, a remoção das tags Acked-by, Tested-by ou Reviewed-by de alguém deve ser 614mencionada no changelog do patch com uma explicação (após o separador '---'). 615 616Uma tag Suggested-by: indica que a ideia do patch foi sugerida pela pessoa 617nomeada e garante crédito à pessoa pela ideia: se creditarmos diligentemente 618nossos relatores de ideias, eles serão, com sorte, inspirados a nos ajudar novamente no 619futuro. Note que esta é uma de apenas três tags que você pode usar sem 620permissão explícita da pessoa nomeada (veja 'Marcar pessoas requer 621permissão' abaixo para detalhes). 622 623Uma tag Fixes: indica que o patch corrige um bug em um commit anterior. Ela 624é usada para facilitar a determinação de onde um problema se originou, o que pode ajudar 625na revisão da correção de um bug. Esta tag também auxilia a equipe do kernel estável a determinar 626quais versões do kernel estável devem receber sua correção. Este é o método preferido 627para indicar um bug corrigido pelo patch. Veja :ref:`pt_BR_describe_changes` 628para mais detalhes. 629 630Nota: Anexar uma tag Fixes: não subverte o processo de regras do kernel 631estável, nem o requisito de enviar em Cc: para stable@vger.kernel.org em todos os patches 632candidatos estáveis. Para mais informações, por favor, leia 633Documentation/process/stable-kernel-rules.rst. 634 635Por fim, embora fornecer tags seja bem-vindo e tipicamente muito apreciado, por favor 636note que os signatários (ou seja, remetentes e mantenedores) podem usar sua discrição ao 637aplicar as tags oferecidas. 638 639 640Marcar pessoas requer permissão 641------------------------------- 642 643Tenha cuidado ao adicionar as tags mencionadas acima aos seus patches, pois todas 644exceto Cc:, Reported-by: e Suggested-by: precisam de permissão explícita da 645pessoa nomeada. Para essas três, a permissão implícita é suficiente se a pessoa 646contribuiu para o kernel Linux usando esse nome e endereço de e-mail de acordo 647com os arquivos do lore ou o histórico de commits -- e no caso de Reported-by: 648e Suggested-by: tenha feito o relato ou sugestão em público. Note que o 649bugzilla.kernel.org é um local público nesse sentido, mas os endereços de e-mail 650usados lá são privados; portanto, não os exponha em tags, a menos que a pessoa 651os tenha usado em contribuições anteriores. 652 653.. _pt_BR_the_canonical_patch_format: 654 655O formato canônico do patch 656--------------------------- 657 658Esta seção descreve como o próprio patch deve ser formatado. Note 659que, se você tiver seus patches armazenados em um repositório ``git``, a formatação 660adequada do patch pode ser obtida com ``git format-patch``. As ferramentas não podem criar 661o texto necessário, no entanto, portanto, leia as instruções abaixo de qualquer maneira. 662 663Linha de Assunto 664^^^^^^^^^^^^^^^^ 665 666A linha de assunto canônica do patch é:: 667 668 Assunto: [PATCH 001/123] subsistema: frase de resumo 669 670O corpo canônico da mensagem do patch contém o seguinte: 671 672 - Uma linha ``from`` especificando o autor do patch, seguida por uma linha 673 vazia (necessário apenas se a pessoa enviando o patch não for o autor). 674 675 - O corpo da explicação, com quebra de linha em 75 colunas, que será 676 copiado para o changelog permanente para descrever este patch. 677 678 - Uma linha vazia. 679 680 - As linhas ``Signed-off-by:``, descritas acima, que também 681 irão para o changelog. 682 683 - Uma linha de marcador contendo simplesmente ``---``. 684 685 - Quaisquer comentários adicionais não adequados para o changelog. 686 687 - O próprio patch (saída do ``diff``). 688 689O formato da linha de Assunto torna muito fácil classificar os e-mails 690alfabeticamente pela linha de assunto - praticamente qualquer leitor de e-mail 691suportará isso - pois, como o número de sequência é preenchido com zeros, 692a classificação numérica e alfabética é a mesma. 693 694O ``subsystem`` no Assunto do e-mail deve identificar qual 695área ou subsistema do kernel está recebendo o patch. 696 697A ``frase de resumo`` no Assunto do e-mail deve descrever de forma concisa 698o patch que esse e-mail contém. A ``frase de resumo`` não deve ser um nome de arquivo. 699Não use a mesma ``frase de resumo`` para cada patch em uma série de patches inteira (onde uma ``série 700de patches`` é uma sequência ordenada de múltiplos patches relacionados). 701 702Tenha em mente que a ``frase de resumo`` do seu e-mail se torna um 703identificador globalmente único para aquele patch. Ela se propaga por todo o caminho 704até o changelog do ``git``. A ``frase de resumo`` pode ser usada posteriormente em 705discussões de desenvolvedores que se referem ao patch. As pessoas vão querer 706pesquisar no Google pela ``frase de resumo`` para ler a discussão sobre esse 707patch. Também será a única coisa que as pessoas poderão ver rapidamente 708quando, dois ou três meses depois, estiverem passando por talvez 709milhares de patches usando ferramentas como ``gitk`` ou ``git log 710--oneline``. 711 712Por essas razões, o ``resumo`` não deve ter mais de 70-75 713caracteres, e deve descrever tanto o que o patch altera, quanto 714por que o patch pode ser necessário. É um desafio ser 715sucinto e descritivo, mas é isso que um resumo bem escrito 716deve fazer. 717 718A ``frase de resumo`` pode ser prefixada por tags delimitadas por colchetes 719retos: "Assunto: [PATCH <tag>...] <frase de resumo>". As tags não 720são consideradas parte da frase de resumo, mas descrevem como o patch 721deve ser tratado. Tags comuns podem incluir um descritor de versão se 722as múltiplas versões do patch tiverem sido enviadas em resposta a 723comentários (ou seja, "v1, v2, v3"), ou "RFC" para indicar um pedido de 724comentários. 725 726Se houver quatro patches em uma série de patches, os patches individuais podem 727ser numerados assim: 1/4, 2/4, 3/4, 4/4. Isso garante que os desenvolvedores 728entendam a ordem na qual os patches devem ser aplicados e que 729eles tenham revisado ou aplicado todos os patches na série de patches. 730 731Aqui estão alguns bons exemplos de Assuntos:: 732 733 Subject: [PATCH 2/5] ext2: improve scalability of bitmap searching 734 Subject: [PATCH v2 01/27] x86: fix eflags tracking 735 Subject: [PATCH v2] sub/sys: Condensed patch summary 736 Subject: [PATCH v2 M/N] sub/sys: Condensed patch summary 737 738Linha From 739^^^^^^^^^^ 740 741A linha ``from`` deve ser a primeira linha no corpo da mensagem, 742e tem a forma: 743 744 From: Patch Author <author@example.com> 745 746A linha ``from`` especifica quem será creditado como o autor do 747patch no changelog permanente. Se a linha ``from`` estiver faltando, 748então a linha ``From:`` do cabeçalho do e-mail será usada para determinar 749o autor do patch no changelog. 750 751O autor pode indicar sua afiliação ou o patrocinador do trabalho 752adicionando o nome de uma organização às linhas ``from`` e ``SoB``, 753por exemplo: 754 755 From: Patch Author (Company) <author@example.com> 756 757Corpo da Explicação 758^^^^^^^^^^^^^^^^^^^ 759 760O corpo da explicação será commitado no changelog 761permanente da fonte, então deve fazer sentido para um leitor competente que já 762esqueceu há muito tempo os detalhes imediatos da discussão que podem ter levado a 763este patch. Incluir sintomas da falha que o patch aborda 764(mensagens de log do kernel, mensagens oops, etc.) é especialmente útil para 765pessoas que possam estar pesquisando nas mensagens de commit procurando pelo patch 766aplicável. O texto deve ser escrito com detalhes suficientes para que, quando lido 767semanas, meses ou até anos depois, possa dar ao leitor os detalhes 768necessários para compreender o raciocínio do **por que** o patch foi criado. 769 770Se um patch corrige uma falha de compilação, pode não ser necessário incluir 771_todas_ as falhas de compilação; apenas o suficiente para que seja provável que 772alguém pesquisando pelo patch possa encontrá-lo. Como na ``frase de resumo``, 773é importante ser tanto sucinto quanto descritivo. 774 775.. _pt_BR_backtraces: 776 777Backtraces em mensagens de commit 778""""""""""""""""""""""""""""""""" 779 780Backtraces ajudam a documentar a cadeia de chamadas que leva a um problema. No entanto, 781nem todos os backtraces são úteis. Por exemplo, as cadeias de chamadas iniciais de boot são 782únicas e óbvias. Copiar a saída dmesg completa verbatim, no entanto, 783adiciona informações que distraem, como timestamps, listas de módulos, dumps de 784registradores e pilhas. 785 786Portanto, os backtraces mais úteis devem destilar as informações 787relevantes do dump, o que facilita o foco no problema 788real. Aqui está um exemplo de um backtrace bem aparado:: 789 790 unchecked MSR access error: WRMSR to 0xd51 (tried to write 0x0000000000000064) 791 at rIP: 0xffffffffae059994 (native_write_msr+0x4/0x20) 792 Call Trace: 793 mba_wrmsr 794 update_domains 795 rdtgroup_mkdir 796 797Comentários 798^^^^^^^^^^^ 799 800A linha marcadora ``---`` serve ao propósito essencial de marcar para 801as ferramentas de manipulação de patches onde a mensagem do changelog termina. 802 803Um bom uso para os comentários adicionais após o marcador ``---`` é 804para um ``diffstat``, para mostrar quais arquivos mudaram, e o número de 805linhas inseridas e excluídas por arquivo. Um ``diffstat`` é especialmente útil 806em patches maiores. Se você for incluir um ``diffstat`` após o 807marcador ``---``, por favor, use as opções do ``diffstat`` ``-p 1 -w 70`` para que 808os nomes dos arquivos sejam listados a partir do topo da árvore de código-fonte do kernel e não 809usem muito espaço horizontal (cabem facilmente em 80 colunas, talvez com algum 810recuo). (o ``git`` gera diffstats apropriados por padrão.) 811 812Outros comentários relevantes apenas para o momento ou para o mantenedor, não 813adequados para o changelog permanente, também devem ir aqui. Um bom 814exemplo de tais comentários podem ser ``changelogs do patch`` que descrevem 815o que mudou entre as versões v1 e v2 do patch. 816 817Por favor, coloque esta informação **após** a linha ``---`` que separa 818o changelog do restante do patch. A informação da versão não 819faz parte do changelog que é commitado na árvore git. É 820informação adicional para os revisores. Se for colocada acima das 821tags de commit, precisará de interação manual para removê-la. Se estiver abaixo 822da linha separadora, ela é automaticamente removida ao aplicar o 823patch. Se disponíveis, adicionar links para as versões anteriores do patch (por exemplo, 824link do arquivo lore.kernel.org) é recomendado para ajudar os revisores:: 825 826 <commit message> 827 ... 828 Signed-off-by: Author <author@mail> 829 --- 830 V2 -> V3: Removed redundant helper function 831 V1 -> V2: Cleaned up coding style and addressed review comments 832 833 v2: https://lore.kernel.org/bar 834 v1: https://lore.kernel.org/foo 835 836 path/to/file | 5+++-- 837 ... 838 839Veja mais detalhes sobre o formato de patch adequado nas seguintes 840referências. 841 842 843Cabeçalhos In-Reply-To explícitos 844--------------------------------- 845 846Pode ser útil adicionar manualmente cabeçalhos In-Reply-To: a um patch 847(por exemplo, ao usar ``git send-email``) para associar o patch com 848discussões relevantes anteriores, por exemplo, para vincular uma correção de bug ao e-mail com 849o relatório do bug. No entanto, para uma série de múltiplos patches, geralmente é 850melhor evitar usar In-Reply-To: para vincular a versões mais antigas da 851série. Desta forma, múltiplas versões do patch não se tornam uma 852floresta incontrolável de referências nos clientes de e-mail. Se um link for 853útil, você pode usar o redirecionador https://lore.kernel.org/ (por exemplo, no 854texto do e-mail de capa) para vincular a uma versão anterior da série de patches. 855 856 857Informações sobre a árvore base 858------------------------------- 859 860Quando outros desenvolvedores recebem seus patches e iniciam o processo de revisão, 861é absolutamente necessário que eles saibam qual é o commit/branch 862base no qual seu trabalho se aplica, considerando a enorme quantidade de 863árvores de mantenedores presentes hoje em dia. Note novamente a entrada **T:** no 864arquivo MAINTAINERS explicado acima. 865 866Isso é ainda mais importante para processos automatizados de CI que tentam 867executar uma série de testes a fim de estabelecer a qualidade da sua 868submissão antes que o mantenedor inicie a revisão. 869 870Se você estiver usando ``git format-patch`` para gerar seus patches, você pode 871incluir automaticamente as informações da árvore base em sua submissão ao 872usar a flag ``--base``. A maneira mais fácil e conveniente de usar 873esta opção é com branches de tópicos (topical branches):: 874 875 $ git checkout -t -b my-topical-branch master 876 Branch 'my-topical-branch' set up to track local branch 'master'. 877 Switched to a new branch 'my-topical-branch' 878 879 [perform your edits and commits] 880 881 $ git format-patch --base=auto --cover-letter -o outgoing/ master 882 outgoing/0000-cover-letter.patch 883 outgoing/0001-First-Commit.patch 884 outgoing/... 885 886Quando você abrir ``outgoing/0000-cover-letter.patch`` para edição, você 887notará que ele terá o trailer ``base-commit:`` bem no 888final, o qual fornece ao revisor e às ferramentas de CI informações suficientes 889para realizar o ``git am`` adequadamente sem se preocupar com conflitos:: 890 891 $ git checkout -b patch-review [base-commit-id] 892 Switched to a new branch 'patch-review' 893 $ git am patches.mbox 894 Applying: First Commit 895 Applying: ... 896 897Por favor, veja ``man git-format-patch`` para mais informações sobre esta 898opção. 899 900.. note:: 901 902 A funcionalidade ``--base`` foi introduzida no git versão 2.9.0. 903 904Se você não estiver usando git para formatar seus patches, você ainda pode incluir 905o mesmo trailer ``base-commit`` para indicar o hash do commit da árvore 906na qual seu trabalho se baseia. Você deve adicioná-lo na cover 907letter (carta de apresentação) ou no primeiro patch da série e ele deve ser colocado 908abaixo da linha ``---`` ou bem no final de todo o outro 909conteúdo, logo antes da sua assinatura de e-mail. 910 911Certifique-se de que o commit base está em uma árvore oficial de mantenedor/mainline 912e não em alguma árvore interna acessível apenas por você - caso contrário seria 913inútil. 914 915Ferramentas 916----------- 917 918Muitos dos aspectos técnicos deste processo podem ser automatizados usando 919b4, documentado em <https://b4.docs.kernel.org/en/latest/>. Isso pode 920ajudar com coisas como rastreamento de dependências, execução do checkpatch e 921com a formatação e o envio de e-mails. 922 923Referências 924----------- 925 926Andrew Morton, "The perfect patch" (tpp). 927 <https://www.ozlabs.org/~akpm/stuff/tpp.txt> 928 929Jeff Garzik, "Linux kernel patch submission format". 930 <https://web.archive.org/web/20180829112450/http://linux.yyz.us/patch-format.html> 931 932Greg Kroah-Hartman, "How to piss off a kernel subsystem maintainer". 933 <http://www.kroah.com/log/linux/maintainer.html> 934 935 <http://www.kroah.com/log/linux/maintainer-02.html> 936 937 <http://www.kroah.com/log/linux/maintainer-03.html> 938 939 <http://www.kroah.com/log/linux/maintainer-04.html> 940 941 <http://www.kroah.com/log/linux/maintainer-05.html> 942 943 <http://www.kroah.com/log/linux/maintainer-06.html> 944 945Kernel Documentation/process/coding-style.rst 946 947Linus Torvalds's mail on the canonical patch format: 948 <https://lore.kernel.org/r/Pine.LNX.4.58.0504071023190.28951@ppc970.osdl.org> 949 950Andi Kleen, "On submitting kernel patches" 951 Some strategies to get difficult or controversial changes in. 952 953 http://halobates.de/on-submitting-patches.pdf 954