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