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