debian/patches
Esta página resultou da seguinte discussão na lista debian-devel em janeiro de 2008: <alpine.DEB.1.00.0801250818360.5187@wr-linux02>. Também inclui ideias da discussão #250202 sobre a Política Debian.
Nota: O formato de patch agora é uma DEP, DEP-3: Diretrizes de etiquetamento de patches.
Sistemas existentes
Características gerais
Sistemas de patch |
Status |
Localização dos patches |
Como desativar um patch |
Aceita saída de diff -u |
Vantagem |
supported |
debian/patches in .debian.tar.gz file |
Rename to include a non-word non-hyphen character |
Yes |
Native to dpkg as 3.0 (quilt) format |
|
supported |
debian/patches |
Remove its name from debian/patches/series |
Yes |
Suitable for generating patches on any size codebase. Advanced VCS-like features. |
|
cdbs simple-patchsys |
debian/patches |
Remove its .diff or .patch suffix |
Yes |
Simple |
|
2.0 a.k.a. wig&pen |
obsolete (use 3.0 quilt) |
debian/patches in .debian.tar.gz file |
Rename to include a non-word non-hyphen character |
Yes |
Native to dpkg as 2.0 format |
debian/patches |
Remove its name from debian/patches/00list |
Header needs to be added |
Can do scripting |
||
debian/patches |
Remove it from the directory |
Yes |
Patches applied in ASCIIbetical order, no series file. Tarball-in-tarball (if you're in to that). |
Pacotes usando o sistema dpatch podem ser convertidos facilmente para o sistema quilt, o qual tem melhor suporte por outros softwares; por exemplo, guilt para git.
Alvos patching/unpatching que podem ser incluídos em debian/rules
Graças à cooperação dos(as) mantenedores(as) do dpatch, quilt e CDBS, os alvos patch e unpatch tornaram-se os padrões.
Arquivo |
Pacote |
Faz um patch |
Desfaz um patch |
/usr/share/dpatch/dpatch.make |
dpatch |
patch |
unpatch |
/usr/share/quilt/quilt.make |
quilt |
patch |
unpatch |
/usr/share/cdbs/1/rules/patchsys-quilt.mk |
quilt |
patch |
unpatch |
/usr/share/cdbs/1/rules/simple-patchsys.mk |
cdbs |
patch |
unpatch |
/usr/share/cdbs/1/rules/dpatch.mk |
cdbs |
patch |
unpatch |
Observe que, no caso do quilt, pode ser melhor usar $(QUILT_STAMPFN), já que patch é um alvo phony.
Limitações
Usuários(as) de um pacote-fonte precisam da fonte desempacotada não pronta para construção, mas pronta para inspeção e modificação. Os dois principais casos de uso são a aplicação de modificações locais (menores) (correções de segurança, opções de tempo de compilação), e inspeção manual ou automatizada do código-fonte (auditoria, pesquisa). Isso deve ser possível sem instalar pacotes adicionais além do dpkg-dev.
Foi discutido que o uso de sistemas de patch estava dificultando o trabalho das equipes de portes, NMUs, segurança e qualidade por várias razões:
- Profusão de sistemas de patch. As pessoas teriam que aprendê-los todos e ser capazes de detectar qual o sistema usado no pacote em que estão trabalhando.
A dificuldade de reempacotar as fontes. Se as modificações diretas dos pacotes-fonte bloquearem o alvo unpatch, e se esse alvo for chamado clean, o dpkg-buildpackage falhará.
Esta abordagem não é compatível com o formato 3.0 (quilt).
Documentos como /usr/share/doc/debian/source-unpack.txt não alertam que as modificações nas fontes recém-desempacotadas podem quebrar a etapa de patch.
Proposed improvements
Basta documentar como corrigir as fontes em um arquivo chamado README.source, cujo modelo poderia ser fornecido no pacote do sistema de patches usado.
- Padronize a interface dos sistemas de patch.
Use um único envoltório (wrapper), possivelmente obrigatório. Bugs: 4588 e outros.
- "Qualifique" os sistemas que são difundidos e duráveis, e desencoraje o uso de outros.
Faça dpkg-source aplicar os patches automagicamente após desempacotar as fontes (usando procedimentos internos).
Alternativamente, faça com que o dpkg-source envie uma mensagem informativa se detectar que um sistema de patch é usado.
Envie as fontes com patch (o alvo clean chamaria patch). Revés: incha o diff.gz.
Implemente um alvo chamado patched, que fornece fontes em tal estado que chamar debian/rules binary não reverterá as mudanças introduzidas.
Ideias rejeitadas
Fazer dpkg-source chamar a receita de patching:
- Esta é uma ameaça à segurança;
- Exigiria que as dependências de construção de um pacote fossem instaladas.
Em vez disso, dpkg-source faz o próprio patching no formato 3.0 (quilt) que foi implementado nesse meio tempo.
Usando um VCS (em vez de um sistema de patch) para rastrear alterações
Manter um pacote inteiro, incluindo fontes upstream, em um sistema de controle de versão (VCS) é frequentemente usado como um método de gerenciamento da modificação para fontes upstream.
Comparação entre dois paradigmas
debian/patches |
VCSes |
Changes to upstream sources are divided in logical blocks that are the patches. |
Changes to upstream sources are divided into logical blocks that are groups of commits. |
dpkg-buildpackage can fail after modifications of the sources |
dpkg-buildpackage can not be blocked by the impossibility to unpatch the sources. |
The diff.gz file only contains files located in the debian directory |
Informations conveyed by defining groups of commits is not reflected in the diff.gz file. |
Well documented in beginners tutorials, strong tradition in packaging teams. |
No tutorials for beginners, new and not widespread yet. |
Repositories can be limited to contain only the debian directory. |
Need to keep the upstream sources in a VCS as well. Not true in my experience. What's the justification for this assertion? --BenFinney |
Some systems, such as dpatch allow scripting. |
Changes are systematically applied. |
É claro que o uso do VCS tem outras vantagens, mas essa tabela se concentra na perspectiva de sua substituição para sistemas de gerenciamento de patches.
Eu monitoro minhas mudanças de empacotamento em um VCS e não sou obrigado(a) a manter a fonte upstream no VCS. O que impede que usuários(as) de um VCS mantenham apenas debian/ no repositório VCS e, por exemplo, bzr-buildpackage --merge para se fundir com a fonte upstream separada? - BenFinney 2008-10-06
Questões não respondidas
- Grupos de commits podem ser mais confusos do que um patch bem documentado: enquanto um patch pode ser modificado, um commit só pode ser revertido por outro commit, adicionando ainda mais complexidade ao grupo de commits. Como as informações contidas na quebra de lógica das modificações para upstream em um conjunto de patches podem ser transmitidas no paradigma VCS?
Situação atual
No momento da versão dpkg 1.14.17, o formato 3.0 foi incluído e os bugs: 4588 e outros foram fechados.
FixMe: renomear página para DebianPatches? O endereço "debian/*" não parece se adequar à hierarquia wiki.