xref: /linux/Documentation/translations/pt_BR/process/7.AdvancedTopics.rst (revision 72fdff1416e280e2baaa3cca69574defb998437e)
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