Hands on: quilt

· 3 minutos de leitura
Hands on: quilt

Quilt é uma ferramenta para criação e manipulação de patches de código fonte. Sua utilização é bem simples e permite criar patches de forma bem prática. Ele foi originalmente criado pelo desenvolvedor Andrew Morton, sendo uma série de scripts para gerenciar patches no Linux. Mas Andreas Grünbacher, um outro desenvolvedor, melhorou os scripts de Andrew para gerar constumizações do kernel para o SuSe Linux.

Para um exemplo prático, vejamos a seguinte estrutura de arquivos:


[marcos@puppet pytabs]$ ls
main.py  new_tab.py  new_tab.pyc  new_tab.ui  window.ui

Para criar um novo patch, execute:


quilt new alteracao1.patch

Após a execução deste comando, será criada uma pasta “patches”, que conterá todos os patches criados. Por hora esta pasta contém apenas o arquivo series, já que não adicionamos e nem alteramos nenhum arquivo para adicionar ao patch recem criado. O arquivo series mostra a ordem em que os patches criados serão aplicados.

Após a execução, segue a nova estrutura de fontes:


[marcos@puppet pytabs]$ quilt new alteracao1.patch
Patch patches/alteracao1.patch is now on top
[marcos@puppet pytabs]$ ls
main.py  new_tab.py  new_tab.pyc  new_tab.ui  patches  window.ui
[marcos@puppet pytabs]$ ls patches/
series
[marcos@puppet pytabs]$ cat patches/series
alteracao1.patch

Para adicionar um arquivo ao patch corrente, execute:


quilt add main.py

Este comando irá adicionar o arquivo main.py ao patch alteracao1.patch. A partir de agora, todas as alterações feitas neste arquivo irão ser adicionadas ao patch. A saída do comando mostra esta informação:


[marcos@puppet pytabs]$ quilt add main.py
File main.py added to patch patches/alteracao1.patch

Após fazer uma alteração no arquivo main.py, execute um quilt refresh para então gerar/atualizar o patch alteracao1.patch. A saída abaixo mostra o patch gerado e atualizado:


[marcos@puppet pytabs]$ vim main.py
[marcos@puppet pytabs]$ quilt refresh
Refreshed patch patches/alteracao1.patch
[marcos@puppet pytabs]$ cat patches/alteracao1.patch
Index: pytabs/main.py
===================================================================
--- pytabs.orig/main.py
+++ pytabs/main.py
@@ -8,6 +8,7 @@ import new_tab

 class AppWindow():
 	def __init__(self):
+		print '__init__ called'
 		user_home = os.environ['HOME']
 		conf_path = user_home + '/.config/'
 		app_path = user_home + '/.config/pytabs/'
[marcos@puppet pytabs]$ vim main.py
[marcos@puppet pytabs]$ quilt refresh
Refreshed patch patches/alteracao1.patch
[marcos@puppet pytabs]$ cat patches/alteracao1.patch
Index: pytabs/main.py
===================================================================
--- pytabs.orig/main.py
+++ pytabs/main.py
@@ -8,6 +8,7 @@ import new_tab

 class AppWindow():
 	def __init__(self):
+		print '__init__ called'
 		user_home = os.environ['HOME']
 		conf_path = user_home + '/.config/'
 		app_path = user_home + '/.config/pytabs/'
@@ -37,7 +38,9 @@ class AppWindow():
 		Gtk.main()

 	def onButtonAddTab(self, button):
-		tabs = new_tab.Tab(self.connection)
+		print 'Adding new tab'
+		tabs = new_tab.Tab( self.connection )
+		print 'addtab called'

 	def onButtonListTabs(self, button):
 		win_list = ListTabs(self.connection)

A partir de agora, o patch está aplicado sobre o código fonte. A partir de agora, múltiplos patches podem ser criados. Na verdade o quilt cria um “pilha” de patches, onde a base (primeiro patch da pilha) é aplicado primeiro e todos os próximos vão sendo aplicados na sequência. Para mostrar os patches e sua ordem de aplicação podemos executar o quilt series:


[marcos@puppet pytabs]$ quilt series
patches/alteracao1.patch
patches/alteracao2.patch

Para “desaplicar” o patch, ou seja, desfazer suas alterações, basta executar o comando pop. Este comando irá desfazer o patch no topo da pilha. Para aplicar novamente basta executar quilt push, que também irá aplicar o patch mais próximo da base que ainda não foi aplicado:


[marcos@puppet pytabs]$ quilt pop
Removing patch patches/alteracao2.patch
Restoring new_tab.ui

Now at patch patches/alteracao1.patch
[marcos@puppet pytabs]$ quilt pop
Removing patch patches/alteracao1.patch
Restoring main.py

No patches applied
[marcos@puppet pytabs]$ quilt series
patches/alteracao1.patch
patches/alteracao2.patch
[marcos@puppet pytabs]$ quilt push
Applying patch patches/alteracao1.patch
patching file main.py

Now at patch patches/alteracao1.patch
[marcos@puppet pytabs]$ quilt push
Applying patch patches/alteracao2.patch
patching file new_tab.ui

Now at patch patches/alteracao2.patch
[marcos@puppet pytabs]$ quilt push
File series fully applied, ends at patch patches/alteracao2.patch

Existem muitos outros comandos do quilt como: annotate delete diff edit files greap headers import remove rename

Agora, você já pode “patchar” projetos e enviar seus patches! Até a próxima!

Referências: Quilt - Wikipédia Quilt manual