Patch

Introdução

Um patch (literalmente, "remendo") é uma rotina ou um programa criado para modificar um software.

Esta técnica é comumente utilizada como uma das formas de distribuir uma liberação de software.

É muito utilizada em atualizações de jogos para computadores (como Warcraft, Counter Striker, Tibia, Fifa, Pes ou Winning Eleven) e correção de falhas em sistemas operacionais como no Windows.

Para se ter um controle adequado do versionamento de um software, é recomendável a utilização de algum sistema para controle de versões, como o CVS - Concurrent Version System ou SVN - Subversion.

Utilização

No exemplo tomemos arquivos de texto (ascii), para ser mais fáceis de demonstrar, mas pode ser qualquer tipo de documento digital.

Gerei o arquivo abaixo 'file.txt', contendo a listagem do /tmp de minha máquina, e este arquivo será utilizado para todos exemplos.
  1 207782_433830870019694_540544551_n.jpg
  2 301241_426986710682705_508360782_n.jpg
  3 318413_426019217446121_14645177_n.jpg
  4 50f3f97e3931e
  5 50f41c7d93f26
  6 50f41c7d94033
  7 50f41c7d940f7
  8 50f41c8521307
  9 50f58332100d1
 10 50f583321c922
 11 50f583321cc7c
 [..]
 53 50f6f56f6fe69
 54 50f6f579c6f73
 55 523528_425302940851082_654186542_n.jpg
 56 546369_424357047612338_1660319043_n.jpg
 57 564152_432751220106254_1544924945_n.jpg
 58 829F1468CACDAD07147D0840CD72ECE4F07A8D43.23.0.1271.64_service_ipc
 59 brito
 60 CRX_75DAF8CB7768
 61 file.txt
 62 gnash-cookies.12909
 63 gnash-cookies.13225
 64 gnash-cookies.13301
 65 gnash-cookies.13474
 66 gnash-cookies.16089
 67 gnash-cookies.16295
 68 gnash-cookies.2537
 69 gnash-cookies.2789
 70 gnash-cookies.2873
 71 gnash-cookies.2960
 72 gnash-cookies.3524
 73 gnash-cookies.4581
 74 gnash-cookies.4657
 75 gvtinv_415370082994.pdf
 76 hsperfdata_brito
 77 icedteaplugin-brito
 78 keyring-rNVCN0
 79 ngipc_000008F1
 80 ngipc_ngslotd
 81 orbit-brito
 82 pulse-2L9K88eMlGn7
 83 pulse-g13SmVqJqRsJ
 84 pulse-PKdhtXMmr18n
 85 spideroak_inotify_db.clgDGH
 86 ssh-bBRkqUNy1725
 87 unity_support_test.0
 88 virtual-brito.qxTAE3

Agora na versão 2 do file.txt, vamos remover todas as linhas que possuem números.
  1 brito
  2 file.txt
  3 hsperfdata_brito
  4 icedteaplugin-brito
  5 ngipc_ngslotd
  6 orbit-brito
  7 spideroak_inotify_db.clgDGH

E estes serão as duas versões/arquivos que usaremos deste tutorial.

Diferenças

Primeiramente, para aplicar as modificações ou atualizações; tem-se que levanta suas diferenças e armazenar em um arquivo. As diferenças entre os 2 arquivos, ou versões.

comando diff
diff file.txt teste/file.txt > file.patch

1,58d0
< 207782_433830870019694_540544551_n.jpg
< 301241_426986710682705_508360782_n.jpg
< 318413_426019217446121_14645177_n.jpg
< 50f3f97e3931e
< 50f41c7d93f26
< 50f41c7d94033
< 50f41c7d940f7
< 50f41c8521307
< 50f58332100d1
< 50f583321c922
< 50f583321cc7c
< 50f583321ceec
< 50f58333d17f0
< 50f6b31817790
< 50f6b31841eaa
< 50f6b31842094
< 50f6b31b0c095
< 50f6b4d747063
< 50f6b4d7472e4
< 50f6b4d7474d1
< 50f6b4d747618
< 50f6b4d74774b
< 50f6b4d7a794f
< 50f6b5b72d5d6
< 50f6b5db6cda7
< 50f6b5e545829
< 50f6b5ea3db2a
< 50f6b5ef3cf3f
< 50f6b5f4385c4
< 50f6b5f9721a3
< 50f6b5fe5eccc
< 50f6b60359d5f
< 50f6b60854f55
< 50f6b60d500ab
< 50f6b6124b185
< 50f6b617855a7
< 50f6b61c41cef
< 50f6b6213c512
< 50f6b62858b4c
< 50f6b62b632af
< 50f6b6305a6dd
< 50f6b635a025e
< 50f6b63a522a8
< 50f6b63f4f66b
< 50f6b6444a7bf
< 50f6b649458f9
< 50f6b64a759f0
< 50f6b64b4e73a
< 50f6b64b671ae
< 50f6f56f6f665
< 50f6f56f6fcdf
< 50f6f56f6fdb6
< 50f6f56f6fe69
< 50f6f579c6f73
< 523528_425302940851082_654186542_n.jpg
< 546369_424357047612338_1660319043_n.jpg
< 564152_432751220106254_1544924945_n.jpg
< 829F1468CACDAD07147D0840CD72ECE4F07A8D43.23.0.1271.64_service_ipc
60d1
< CRX_75DAF8CB7768
62,75d2
< gnash-cookies.12909
< gnash-cookies.13225
< gnash-cookies.13301
< gnash-cookies.13474
< gnash-cookies.16089
< gnash-cookies.16295
< gnash-cookies.2537
< gnash-cookies.2789
< gnash-cookies.2873
< gnash-cookies.2960
< gnash-cookies.3524
< gnash-cookies.4581
< gnash-cookies.4657
< gvtinv_415370082994.pdf
78,79d4
< keyring-rNVCN0
< ngipc_000008F1
82,84d6
< pulse-2L9K88eMlGn7
< pulse-g13SmVqJqRsJ
< pulse-PKdhtXMmr18n
86,88d7
< ssh-bBRkqUNy1725
< unity_support_test.0
< virtual-brito.qxTAE3
comando subversion
svn diff -r 10:11 file.txt > file.patch
Index: file.txt
===================================================================
--- file.txt (revisão 10)
+++ file.txt (revisão 11)
@@ -1,88 +1,7 @@
-207782_433830870019694_540544551_n.jpg
-301241_426986710682705_508360782_n.jpg
-318413_426019217446121_14645177_n.jpg
-50f3f97e3931e
-50f41c7d93f26
-50f41c7d94033
-50f41c7d940f7
-50f41c8521307
-50f58332100d1
-50f583321c922
-50f583321cc7c
-50f583321ceec
-50f58333d17f0
-50f6b31817790
-50f6b31841eaa
-50f6b31842094
-50f6b31b0c095
-50f6b4d747063
-50f6b4d7472e4
-50f6b4d7474d1
-50f6b4d747618
-50f6b4d74774b
-50f6b4d7a794f
-50f6b5b72d5d6
-50f6b5db6cda7
-50f6b5e545829
-50f6b5ea3db2a
-50f6b5ef3cf3f
-50f6b5f4385c4
-50f6b5f9721a3
-50f6b5fe5eccc
-50f6b60359d5f
-50f6b60854f55
-50f6b60d500ab
-50f6b6124b185
-50f6b617855a7
-50f6b61c41cef
-50f6b6213c512
-50f6b62858b4c
-50f6b62b632af
-50f6b6305a6dd
-50f6b635a025e
-50f6b63a522a8
-50f6b63f4f66b
-50f6b6444a7bf
-50f6b649458f9
-50f6b64a759f0
-50f6b64b4e73a
-50f6b64b671ae
-50f6f56f6f665
-50f6f56f6fcdf
-50f6f56f6fdb6
-50f6f56f6fe69
-50f6f579c6f73
-523528_425302940851082_654186542_n.jpg
-546369_424357047612338_1660319043_n.jpg
-564152_432751220106254_1544924945_n.jpg
-829F1468CACDAD07147D0840CD72ECE4F07A8D43.23.0.1271.64_service_ipc
 brito
-CRX_75DAF8CB7768
 file.txt
-gnash-cookies.12909
-gnash-cookies.13225
-gnash-cookies.13301
-gnash-cookies.13474
-gnash-cookies.16089
-gnash-cookies.16295
-gnash-cookies.2537
-gnash-cookies.2789
-gnash-cookies.2873
-gnash-cookies.2960
-gnash-cookies.3524
-gnash-cookies.4581
-gnash-cookies.4657
-gvtinv_415370082994.pdf
 hsperfdata_brito
 icedteaplugin-brito
-keyring-rNVCN0
-ngipc_000008F1
 ngipc_ngslotd
 orbit-brito
-pulse-2L9K88eMlGn7
-pulse-g13SmVqJqRsJ
-pulse-PKdhtXMmr18n
 spideroak_inotify_db.clgDGH
-ssh-bBRkqUNy1725
-unity_support_test.0
-virtual-brito.qxTAE3

Patch

Para aplicar as modificações através do comando patch, basta executar a sintaxe abaixo, com qualquer um dos arquivos patch, os gerados pelo SVN ou pelo diff e um arquivo file.txt, não modificado.
patch file.txt < file.patch
Com a aplicação do procedimento acima o arquivo file.txt, ficará idêntico a revisão final.
  1 brito
  2 file.txt
  3 hsperfdata_brito
  4 icedteaplugin-brito
  5 ngipc_ngslotd
  6 orbit-brito
  7 spideroak_inotify_db.clgDGH

Comentários