{"id":105,"date":"2012-01-04T15:35:46","date_gmt":"2012-01-04T18:35:46","guid":{"rendered":"http:\/\/www.fnbrandao.com.br\/blog\/?p=105"},"modified":"2012-02-15T07:08:13","modified_gmt":"2012-02-15T10:08:13","slug":"o-guia-de-dez-minutos-de-diff-e-patch","status":"publish","type":"post","link":"https:\/\/www.fnbrandao.com.br\/blog\/2012\/01\/o-guia-de-dez-minutos-de-diff-e-patch\/","title":{"rendered":"O Guia de Dez Minutos de diff e patch"},"content":{"rendered":"<p>O seguinte texto foi traduzido e adaptado de:<\/p>\n<p><a href=\"http:\/\/jungels.net\/articles\/diff-patch-ten-minutes.html\" target=\"_blank\">http:\/\/jungels.net\/articles\/diff-patch-ten-minutes.html<\/a><\/p>\n<p>Primeira situa\u00e7\u00e3o: voc\u00ea est\u00e1 tentando compilar um pacote \u00e0 partir do c\u00f3digo fonte e descobre que algu\u00e9m j\u00e1 o modificou para compilar na sua plataforma. Ele disponibilizou o seu trabalho como um <em>&#8220;patch&#8221;<\/em>, mas voc\u00ea n\u00e3o tem certeza de como utiliz\u00e1-lo. Para utiliz\u00e1-lo voc\u00ea deve aplicar o <em>patch<\/em> no c\u00f3digo fonte original com uma ferramenta de linha de comando chamada <em>patch<\/em>.<\/p>\n<p>Segunda situa\u00e7\u00e3o: voc\u00ea fez o download do c\u00f3digo fonte de um pacote open source e depois de algumas altera\u00e7\u00f5es voc\u00ea conseguiu compil\u00e1-lo na sua plataforma. Voc\u00ea gostaria de disponibilizar o seu trabalho para outros programadores, ou para os autores do pacote, sem distribuir todo o pacote modificado. Nesta situa\u00e7\u00e3o voc\u00ea deve criar um <em>patch<\/em>, e a ferramenta necess\u00e1ria \u00e9 a <em>diff<\/em>.<\/p>\n<p>Este \u00e9 um guia r\u00e1pido para gerar ou utilizar <em>patches<\/em> que ir\u00e1 ajud\u00e1-lo nestas situa\u00e7\u00f5es, mostrando como usar as ferramentas nas situa\u00e7\u00f5es mais comuns.<\/p>\n<h3>Aplicando <em>patches<\/em> com <em>patch<\/em><\/h3>\n<p>Para aplicar um <em>patch<\/em> em um arquivo, v\u00e1 ao diret\u00f3rio onde o arquivo est\u00e1 e chame o comando <em>patch<\/em>:<\/p>\n<p><code>patch < foo.patch<\/code><\/p>\n<p>O comando acima assume que o <em>patch<\/em> est\u00e1 distribu\u00eddo no formato unificado, que identifica o arquivo no qual <em>patch<\/em> deve ser aplicado. Se n\u00e3o estiver no formato unificado, voc\u00ea pode especificar o arquivo na linha de comando:<\/p>\n<p><code>patch foo.txt < bar.patch<\/code><\/p>\n<p>A aplica\u00e7\u00e3o de <em>patches<\/em> em um diret\u00f3rio (caso mais comum) \u00e9 similar, mas voc\u00ea deve setar um <em>\"p level\"<\/em>. Isto significa que dentro dos arquivos de <em>patches<\/em>, os arquivos s\u00e3o identificados por caminhos que possam ser diferentes de quando o <em>patch<\/em> foi criado. O <em>\"p level\"<\/em> faz com que o <em>patch<\/em> ignore partes do caminho do arquivo para que seja poss\u00edvel identificar os arquivos corretamente. Geralmente um <em>\"p level\"<\/em> de 1 ir\u00e1 funcionar, ent\u00e3o utilize:<\/p>\n<p><code>patch -p1 < baz.patch<\/code><\/p>\n<p>Voc\u00ea deve mudar para o diret\u00f3rio raiz do c\u00f3digo fonte antes de executar este comando. Se o <em>\"p level\"<\/em> utilizado n\u00e3o identificar corretamente os arquivos, procure nomes de arquivos no <em>patch<\/em>. Se voc\u00ea ver um nome como:<\/p>\n<p><code>\/users\/stephen\/package\/src\/net\/http.c<\/code><\/p>\n<p>E voc\u00ea estiver trabalhando em um diret\u00f3rio que contenha <em>net\/http.c<\/em>, use:<\/p>\n<p><code>patch -p5 < baz.patch<\/code><\/p>\n<p>Em geral, conte quantos separadores de diret\u00f3rio (\/) voc\u00ea precisa remover \u00e0 partir do come\u00e7o do caminho, at\u00e9 que o restante seja um caminho que exista no diret\u00f3rio atual. O valor encontrado ser\u00e1 o <em>\"p level\"<\/em> que deve ser utilizado.<\/p>\n<p>Para remover um <em>patch<\/em>, use a flag <em>-R<\/em>:<\/p>\n<p><code>patch -p5 -R < baz.patch<\/code><\/p>\n<h3>Criando <em>patches<\/em> com <em>diff<\/em><\/h3>\n<p>Utilizar a ferramenta <em>diff<\/em> \u00e9 simples quer voc\u00ea esteja trabalhando com um arquivo ou com diret\u00f3rios. Para criar um <em>patch<\/em> \u00e0 partir de um arquivo, use:<\/p>\n<p><code>diff -u original.c new.c > original.patch<\/code><\/p>\n<p>Para criar um <em>patch<\/em> de um diret\u00f3rio inteiro, fa\u00e7a uma c\u00f3pia do diret\u00f3rio:<\/p>\n<p><code>cp -R original new<\/code><\/p>\n<p>Fa\u00e7a as altera\u00e7\u00f5es necess\u00e1rias no diret\u00f3rio <em>new\/<\/em>. E ent\u00e3o cria o <em>patch<\/em> com o comando:<\/p>\n<p><code>diff -rupN original\/ new\/ > original.patch<\/code><\/p>\n<p>Isto \u00e9 tudo o que voc\u00ea precisa saber para come\u00e7ar a utilizar as ferramentas <em>diff<\/em> e <em>patch<\/em>. Para mais informa\u00e7\u00f5es utilize:<\/p>\n<p><code>man diff<\/p>\n<p>man patch<\/code><\/p>\n<h3>Tradu\u00e7\u00f5es<\/h3>\n<p><strong>Ingl\u00eas:<\/strong> <a href=\"http:\/\/jungels.net\/articles\/diff-patch-ten-minutes.html\" target=\"_blank\">http:\/\/jungels.net\/articles\/diff-patch-ten-minutes.html<\/a><\/p>\n<p><strong>Espanhol:<\/strong> <a href=\"http:\/\/www.rat.uclatux.org.ve\/2009\/05\/guia-de-10-minutos-de-diff-y-patch\/\" target=\"_blank\">http:\/\/www.rat.uclatux.org.ve\/2009\/05\/guia-de-10-minutos-de-diff-y-patch\/<\/a><\/p>\n<p><strong>Franc\u00eas:<\/strong> <a href=\"http:\/\/fredgnix.wordpress.com\/2012\/02\/15\/diff-et-patch-en-dix-minutes\/\" target=\"_blank\">http:\/\/fredgnix.wordpress.com\/2012\/02\/15\/diff-et-patch-en-dix-minutes\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>O seguinte texto foi traduzido e adaptado de: http:\/\/jungels.net\/articles\/diff-patch-ten-minutes.html Primeira situa\u00e7\u00e3o: voc\u00ea est\u00e1 tentando compilar um pacote \u00e0 partir do c\u00f3digo fonte e descobre que algu\u00e9m j\u00e1 o modificou para compilar na sua plataforma. Ele disponibilizou o seu trabalho como um &#8220;patch&#8221;, mas voc\u00ea n\u00e3o tem certeza de como utiliz\u00e1-lo. Para utiliz\u00e1-lo voc\u00ea deve aplicar [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3],"tags":[159,160],"class_list":["post-105","post","type-post","status-publish","format-standard","hentry","category-programacao","tag-diff","tag-patch"],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.fnbrandao.com.br\/blog\/wp-json\/wp\/v2\/posts\/105","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fnbrandao.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fnbrandao.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fnbrandao.com.br\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fnbrandao.com.br\/blog\/wp-json\/wp\/v2\/comments?post=105"}],"version-history":[{"count":4,"href":"https:\/\/www.fnbrandao.com.br\/blog\/wp-json\/wp\/v2\/posts\/105\/revisions"}],"predecessor-version":[{"id":113,"href":"https:\/\/www.fnbrandao.com.br\/blog\/wp-json\/wp\/v2\/posts\/105\/revisions\/113"}],"wp:attachment":[{"href":"https:\/\/www.fnbrandao.com.br\/blog\/wp-json\/wp\/v2\/media?parent=105"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fnbrandao.com.br\/blog\/wp-json\/wp\/v2\/categories?post=105"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fnbrandao.com.br\/blog\/wp-json\/wp\/v2\/tags?post=105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}