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.