Criar e aplicar um arquivo de .patch

Um arquivo de patch contém instruções para modificação do conteúdo de arquivos. É um recurso muito utilizado para distribuir alterações de código-fonte, pois é um arquivo de tamanho reduzido que contém somente as alterações entre determinadas versões do código.

Como gerar um arquivo .patch? Por meio do utilitário diff.

Vou utilizar duas versões do Drupal para demonstrar isso:

$ cd /tmp
$ wget https://ftp.drupal.org/files/projects/drupal-7.57.tar.gz
$ wget https://ftp.drupal.org/files/projects/drupal-7.58.tar.gz
$ tar xzf drupal-7.57.tar.gz
$ tar xzf drupal-7.58.tar.gz

O comando básico para exibir as modificações entre arquivos em dois diretórios é:

$ diff -ur drupal-7.57 drupal-7.58

Veja que estamos comparando dois diretórios existentes no diretório atual, isso é importante porque influencia no parâmetro -p de quando se for utilizar o patch. Isso está explicado no final deste artigo.

Para ignorar alguns arquivos, por exemplo, aqueles com extensão .info, use a opção –exclude:

$ diff -ur drupal-7.57 drupal-7.58 --exclude=*.info

Atente que o comportamento padrão não considera os novos arquivos, então use a opção –new-file para incluí-los:

$ diff -ur drupal-7.57 drupal-7.58 --exclude=*.info --new-file

Por fim, salve o arquivo de patch:

$ diff -ur drupal-7.57 drupal-7.58 --exclude=*.info --new-file > patch-drupal-7-57-para-7-58.patch

Agora, vamos aplicar o patch. Entre no diretório e use o comando patch:

$ cd drupal-7.57
$ patch -p1 < ../patch-drupal-7-57-para-7-58.patch
patching file CHANGELOG.txt
patching file includes/bootstrap.inc
patching file includes/request-sanitizer.inc

O parâmetro -p1 indica que o primeiro diretório do caminho deve ser desprezado ao aplicar o patch. Isso é necessário pois entramos no diretório em que queremos aplicar o patch para garantir que é o diretório correto que será modificado.

Caso o patch fosse gerado (se o comando diff fosse executado) de dentro do diretório de destino, usaria-se o parâmetro -p0 ao aplicar o patch. Se você ficou em dúvida, apenas siga a lógica que foi demonstrada na sequência de comandos acima.

# patch-drupal-7-57-para-7-58.patch
--- drupal-7.57/includes/bootstrap.inc  2018-02-21 14:28:43.000000000 -0300
+++ drupal-7.58/includes/bootstrap.inc  2018-03-27 16:28:19.000000000 -0300

Se compararmos os diretórios, não haverá diferença, pois as modificações da nova versão foram aplicadas a versão anterior:

$ cd /tmp
$ diff -ur drupal-7.57 drupal-7.58 --exclude=*.info --new-file

Dúvidas? Use o campo de comentários abaixo.

Reinaldo Gil Lima de Carvalho é Analista Judiciário do TRT 8ª Região,
consultor do Debian GNU/Linux e organizador compulsivo do conhecimento.

 

  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário