Segundo a wikipedia: Um patch (termo da língua inglesa que significa, literalmente, “remendo”) é um programa de computador criado para atualizar ou corrigir um software de forma a melhorar sua usabilidade ou performance. Quando patches corrigem bugs ou vulnerabilidades de segurança, se dá o nome de bugfix.
Esta técnica pode ser utilizada como uma das formas de distribuir uma liberação de software. É muito utilizada em jogos para computadores de forma a atualizar o conteúdo disponível.
O comando
patch
UNIX: Uma patch (Unix) é um programa de computador do sistema operacional UNIX que aplica as diferenças textuais entre dois programas e, mais freqüentemente, a arquivos de computador contendo essas diferenças, ou arquivos diff.
De acordo com o manual: patch pega um arquivo de “patch”:
patchfile
contendo uma diferença lista produzida pelo programa diff e aplica aqueles diferenças em um ou mais arquivos originais, produzindo versões.
Normalmente, as versões corrigidas são colocadas no lugar do original.
patch [arquivo que você deseja aplicar o patch] [o patch]
Suponhamos que você tenha o seguinte arquivo em C++:
vim hello.cpp
#include <iostream>
int main( int argc , char **argv ){
std::cout << "Olá, Mundo!" << '\n';
return 0;
}
E então, você cria um novo baseado nele e altera algumas coisas:
cp hello.cpp new_hello.cpp
vim new_hello.cpp
#include <iostream>
int main( int argc , char **argv ){
std::cout << "Olá, Mundo!" << '\n';
std::cout << "Êta mundo bom de acabar ..." << '\n';
return 0;
}
Quando você rodar o comando diff com a parâmetro -u
você e gera o um arquivo de patch: file.patch
:
diff -u hello.cpp new_hello.cpp > file.patch
E então o conteúdo de file.patch
terá o seguinte código:
--- hello.cpp 2021-06-29 00:01:27.329937847 -0300
+++ new_hello.cpp 2021-06-29 00:02:08.281947880 -0300
@@ -2,6 +2,7 @@
int main( int argc , char **argv ){
std::cout << "Olá, Mundo!" << '\n';
+ std::cout << "Êta mundo bom de acabar ..." << '\n';
return 0;
}
Apesar desse exemplo ser básico e poder alterar a linha manulamente, na maioria dos casos em projetos maiores, seria muito trabalho.
Logo, para aplicar o patch, como vimos na Sintaxe dele acima, basta rodar o comando patch
:
patch hello.cpp file.patch
E se você for ver o conteúdo de hello.cpp
agora perceberá que está idêntico ao do new_hello.cpp
.
Fácil, né? Lógico que ainda há muitaaaas opções e vale à pela dar uma olhada no manual e no help:
patch --help
man patch
Só aplicando um patch.