1.. SPDX-License-Identifier: GPL-2.0 2 3Tópicos avançados 4================= 5 6Neste ponto, esperamos que você já tenha uma boa noção de como funciona o 7processo de desenvolvimento. No entanto, ainda há mais a aprender! Esta seção 8cobrirá uma série de tópicos que podem ser úteis para desenvolvedores que 9desejam se tornar parte regular do processo de desenvolvimento do kernel Linux. 10 11Gerenciamento de patches com o git 12---------------------------------- 13 14O uso de controle de versão distribuído para o kernel começou no início de 152002, quando Linus começou a testar o aplicativo proprietário BitKeeper. 16Embora o BitKeeper fosse controverso, a abordagem de gerenciamento de versão 17de software que ele incorporava certamente não era. O controle de versão 18distribuído permitiu uma aceleração imediata do projeto de desenvolvimento do 19kernel. Atualmente, existem várias alternativas gratuitas ao BitKeeper. Para o 20bem ou para o mal, o projeto do kernel adotou o git como sua ferramenta de 21escolha. 22 23Gerenciar patches com o git pode facilitar muito a vida do desenvolvedor, 24especialmente à medida que o volume desses patches cresce. O git também tem suas 25pontas soltas e apresenta certos riscos; é uma ferramenta jovem e poderosa que 26ainda está sendo refinada por seus desenvolvedores. Este documento não tentará 27ensinar o leitor a usar o git; isso seria material suficiente para um documento 28longo por si só. Em vez disso, o foco aqui será em como o git se encaixa 29especificamente no processo de desenvolvimento do kernel. Os desenvolvedores 30que desejam se atualizar com o git encontrarão mais informações em: 31 32 https://git-scm.com/ 33 34 https://www.kernel.org/pub/software/scm/git/docs/user-manual.html 35 36e em vários tutoriais encontrados na web. 37 38A primeira ordem do dia é ler os sites acima e obter uma compreensão sólida de 39como o git funciona antes de tentar usá-lo para disponibilizar patches para 40outros. Um desenvolvedor que utiliza o git deve ser capaz de obter uma cópia do 41repositório principal, explorar o histórico de revisões, comitar alterações na 42árvore, usar branches, etc. A compreensão das ferramentas do git para a 43reescrita de histórico (como o rebase) também é útil. O git vem com sua própria 44terminologia e conceitos; um novo usuário do git deve saber sobre refs, remote 45branches, o index, fast-forward merges, pushes e pulls, detached HEADs, etc. 46Tudo isso pode ser um pouco intimidante no início, mas os conceitos não são tão 47difíceis de entender com um pouco de estudo. 48 49Usar o git para gerar patches para submissão por e-mail pode ser um bom exercício 50enquanto você se atualiza. 51 52Quando estiver pronto para começar a disponibilizar árvores git para que outros 53possam examinar, você, logicamente, precisará de um servidor a partir do qual um 54pull possa ser feito. Configurar um servidor desse tipo com o git-daemon é 55relativamente simples se você tiver um sistema acessível à internet. Caso 56contrário, sites de hospedagem públicos e gratuitos (o GitHub, por exemplo) 57estão começando a surgir na rede. Desenvolvedores estabelecidos podem obter uma 58conta no kernel.org, mas estas não são fáceis de conseguir; consulte 59https://kernel.org/faq/ para mais informações. 60 61O fluxo de trabalho normal do git envolve o uso de muitas branches. Cada linha 62de desenvolvimento pode ser separada em uma "topic branch" distinta e mantida de 63forma independente. Branches no git são baratas, não há razão para não fazer um 64uso livre delas. E, em qualquer caso, você não deve fazer o seu desenvolvimento 65em nenhuma branch a partir da qual pretenda pedir para que outros deem pull. 66Branches disponíveis publicamente devem ser criadas com cuidado; mescle patches 67de branches de desenvolvimento quando eles estiverem em sua forma final e prontos 68para seguir em frente — não antes. 69 70O git fornece algumas ferramentas poderosas que podem permitir que você 71reescreva o seu histórico de desenvolvimento. Um patch inconveniente (um que 72quebre o bisection, por exemplo, ou que tenha algum outro tipo de bug óbvio) 73pode ser corrigido localmente ou feito desaparecer completamente do histórico. 74Uma série de patches pode ser reescrita como se tivesse sido escrita no topo da 75linha principal de hoje, mesmo que você esteja trabalhando nela há meses. As 76alterações podem ser movidas de forma transparente de uma branch para outra. E 77assim por diante. O uso criterioso da capacidade do git de revisar o histórico 78pode ajudar na criação de conjuntos de patches limpos e com menos problemas. 79 80O uso excessivo dessa capacidade pode levar a outros problemas, no entanto, além 81de uma simples obsessão pela criação do histórico de projeto perfeito. Reescrever 82o histórico reescreverá as alterações contidas nele, transformando uma árvore do 83kernel testada (assim se espera) em uma não testada. Mas, além disso, os 84desenvolvedores não podem colaborar facilmente se não tiverem uma visão 85compartilhada do histórico do projeto; se você reescrever o histórico que outros 86desenvolvedores já deram pull em seus repositórios, tornará a vida deles muito 87mais difícil. Portanto, uma regra prática simples se aplica aqui: o histórico 88que foi exportado para terceiros deve ser visto geralmente como imutável dali em 89diante. 90 91Sendo assim, uma vez que você faz o push de um conjunto de alterações para o seu 92servidor disponível publicamente, essas alterações não devem ser reescritas. O 93git tentará aplicar essa regra se você tentar dar push em alterações que não 94resultem em um fast-forward merge (ou seja, alterações que não compartilham o 95mesmo histórico). É possível anular essa verificação, e pode haver momentos em 96que seja necessário reescrever uma árvore exportada. Mover changesets entre 97árvores para evitar conflitos na linux-next é um exemplo. No entanto, tais ações 98devem ser raras. Esta é uma das razões pelas quais o desenvolvimento deve ser 99feito em branches privadas (que podem ser reescritas, se necessário) e apenas 100movido para branches públicas quando estiver em um estado razoavelmente avançado. 101 102À medida que a linha principal (ou outra árvore na qual um conjunto de 103alterações se baseia) avança, é tentador fazer o merge com essa árvore para 104permanecer na vanguarda. Para uma branch privada, o rebasing pode ser uma maneira 105fácil de acompanhar outra árvore, mas o rebasing não é uma opção uma vez que uma 106árvore é exportada para o mundo. Quando isso acontece, um merge completo deve 107ser feito. Fazer merges ocasionalmente faz todo o sentido, mas merges excessivamente 108frequentes podem poluir o histórico desnecessariamente. A técnica sugerida neste 109caso é fazer merges raramente, e geralmente apenas em release points específicos 110(como um lançamento -rc da linha principal). Se você estiver inseguro sobre 111mudanças específicas, sempre poderá realizar merges de teste em uma branch 112privada. A ferramenta "rerere" do git pode ser útil nessas situações; ela se 113lembra de como os conflitos de merge foram resolvidos para que você não precise 114fazer o mesmo trabalho duas vezes. 115 116Uma das maiores reclamações recorrentes sobre ferramentas como o git é esta: o 117movimento em massa de patches de um repositório para outro torna fácil a 118inclusão de mudanças desaconselháveis que entram na linha principal abaixo do 119radar de revisão. Os desenvolvedores do kernel costumam ficar descontentes quando 120veem esse tipo de coisa acontecer; disponibilizar uma árvore git com patches não 121revisados ou fora do tópico pode afetar a sua capacidade de ter suas árvores 122puxadas no futuro. Citando Linus: 123 124:: 125 126 Você pode me enviar patches, mas para eu puxar um patch git de você, eu 127 preciso saber que você sabe o que está fazendo, e preciso ser capaz de 128 confiar nas coisas *sem* ter que ir lá e verificar cada mudança 129 individualmente à mão. 130 131(https://lwn.net/Articles/224135/). 132 133Para evitar esse tipo de situação, certifique-se de que todos os patches 134dentro de uma determinada branch permaneçam estritamente alinhados ao tópico 135associado; uma branch de "correções de drivers" não deveria fazer alterações no 136código central de gerenciamento de memória. E, acima de tudo, não use uma árvore 137git para burlar o processo de revisão. Publique ocasionalmente um resumo da 138árvore na lista de discussão relevante e, quando for o momento certo, solicite 139que a árvore seja incluída na linux-next. 140 141Se e quando outros começarem a enviar patches para inclusão em sua árvore, não 142se esqueça de revisá-los. Certifique-se também de manter as informações corretas 143de autoria; a ferramenta "am" do git faz o melhor que pode a esse respeito, mas 144você pode ter que adicionar uma linha "From:" ao patch se ele tiver sido 145retransmitido a você por terceiros. 146 147Ao solicitar um pull, certifique-se de fornecer todas as informações 148relevantes: onde está a sua árvore, qual branch deve ser puxada e quais 149alterações resultarão do pull. O comando git request-pull pode ser útil a esse 150respeito; ele formatará a solicitação da maneira que outros desenvolvedores 151esperam e também verificará se você se lembrou de dar push nessas alterações 152para o servidor público. 153 154 155Revisão de patches 156------------------ 157 158Alguns leitores certamente objetarão a inclusão desta seção em "tópicos 159avançados" sob o argumento de que mesmo desenvolvedores iniciantes do kernel 160deveriam estar revisando patches. É certamente verdade que não há melhor maneira 161de aprender a programar no ambiente do kernel do que examinando o código 162postado por outros. Além disso, revisores estão sempre em falta; ao examinar o 163código, você pode fazer uma contribuição significativa para o processo como um 164todo. 165 166Revisar código pode ser uma perspectiva intimidadora, especialmente para um novo 167desenvolvedor do kernel que pode se sentir nervoso em questionar — em público — 168um código que foi postado por aqueles com mais experiência. No entanto, mesmo o 169código escrito pelos desenvolvedores mais experientes pode ser aprimorado. Talvez 170o melhor conselho para revisores (todos os revisores) seja este: formule os 171comentários de revisão como perguntas em vez de críticas. Perguntar "como o lock 172é liberado neste caminho?" sempre funcionará melhor do que afirmar "o bloqueio 173aqui está errado." 174 175Outra técnica útil em caso de desacordo é pedir que outros se manifestem. Se uma 176discussão chegar a um impasse após algumas trocas de mensagens, peça a opinião 177de outros revisores ou mantenedores. Frequentemente, aqueles que concordam com 178um revisor permanecem em silêncio, a menos que sejam solicitados. A opinião de 179múltiplas pessoas carrega exponencialmente mais peso. 180 181Diferentes desenvolvedores revisarão o código sob diferentes pontos de vista. 182Alguns estão preocupados principalmente com o estilo de codificação e se as 183linhas de código possuem espaços em branco no final (trailing white space). 184Outros se concentrarão principalmente em saber se a alteração implementada pelo 185patch como um todo é algo bom para o kernel ou não. Ainda assim, outros buscarão 186por bloqueios problemáticos, uso excessivo de pilha (stack usage), possíveis 187problemas de segurança, duplicação de código encontrado em outros lugares, 188documentação adequada, efeitos adversos no desempenho, alterações na ABI do 189espaço do usuário (user-space ABI), etc. Todos os tipos de revisão, se levarem a 190um código melhor entrando no kernel, são bem-vindos e valem a pena. 191 192Não há exigência estrita para o uso de tags específicas como ``Reviewed-by``. Na 193verdade, revisões em texto simples são mais informativas e incentivadas mesmo 194quando uma tag é fornecida, por exemplo: "Analisei os aspectos A, B e C deste 195envio e tudo me parece correto." Alguma forma de mensagem de revisão ou resposta 196é obviamente necessária, caso contrário, os mantenedores não saberão que o 197revisor sequer examinou o patch! 198 199Por último, mas não menos importante, a revisão de patches pode se tornar um 200processo negativo, focado em apontar problemas. Por favor, reserve um elogio de 201vez em quando, particularmente para os novatos! 202