--- title: Capítulo 11. Atualizando um Port prev: books/porters-handbook/testing next: books/porters-handbook/security showBookMenu: true weight: 11 params: path: "/books/porters-handbook/upgrading/" --- [[port-upgrading]] = Atualizando um Port :doctype: book :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :sectnumoffset: 11 :partnums: :source-highlighter: rouge :experimental: :images-path: books/porters-handbook/ ifdef::env-beastie[] ifdef::backend-html5[] :imagesdir: ../../../../images/{images-path} endif::[] ifndef::book[] include::shared/authors.adoc[] include::shared/mirrors.adoc[] include::shared/releases.adoc[] include::shared/attributes/attributes-{{% lang %}}.adoc[] include::shared/{{% lang %}}/teams.adoc[] include::shared/{{% lang %}}/mailing-lists.adoc[] include::shared/{{% lang %}}/urls.adoc[] toc::[] endif::[] ifdef::backend-pdf,backend-epub3[] include::../../../../../shared/asciidoctor.adoc[] endif::[] endif::[] ifndef::env-beastie[] toc::[] include::../../../../../shared/asciidoctor.adoc[] endif::[] Quando um port não estiver na versão mais recente disponibilizada pelos autores, atualize a sua cópia de trabalho local do [.filename]#/usr/ports#. O port pode já ter sido atualizado para a nova versão. Ao trabalhar com diversos ports, provavelmente será mais fácil usar o Subversion para manter toda a coleção de ports atualizada, conforme descrito no extref:{handbook}ports[Handbook, ports-using]. Isso trará o benefício adicional de rastrear todas as dependências de ports. O próximo passo é ver se há uma atualização já pendente. Para fazer isso, existem duas opções. Há uma interface de pesquisa no https://bugs.freebsd.org/search/[Relatório de Problemas do FreeBSD (PR) ou banco de dados de bugs]. Selecione `Ports & Packages` no menu de seleção múltipla `Product` e digite o nome do port no campo `Summary`. No entanto, às vezes as pessoas esquecem de colocar o nome do port no campo Resumo de maneira não ambígua. Nesse caso, tente pesquisar o campo `Comment` na seção `Detailled Bug Information`, ou tente o <> (também conhecido como `portsmon`). Este sistema tenta classificar os PRs do port por portname. Para procurar por PRs sobre um port específico, use a http://portsmon.FreeBSD.org/portoverview.py[Visão geral de um port]. Se não houver nenhum PR pendente, o próximo passo é enviar um email para o mantenedor do port, como apresentado em `make maintainer`. Essa pessoa pode já estar trabalhando em uma atualização ou ter algum motivo para não atualizar o port neste momento (devido a, por exemplo, problemas de estabilidade da nova versão), e não há necessidade de duplicar seu trabalho. Note que os ports não mantidos são listadas com um mantenedor `ports@FreeBSD.org`, que é apenas a lista de discussão geral de ports, então enviar emails provavelmente não ajudará nesse caso. Se o mantenedor lhe pedir para fazer a atualização ou não houver mantenedor, então ajude o FreeBSD preparando a atualização! Por favor, faça isso usando o comando man:diff[1] do sistema base. Para criar um `diff` adequado para um único patch, copie o arquivo que precisa de patching para [.filename]#something.orig#, salve as alterações em [.filename]#something# e depois crie o patch: [source,shell] .... % diff -u something.orig something > something.diff .... Caso contrário, use o método `svn diff` (<>) ou copie o conteúdo do port para um diretório completamente diferente e use o resultado do man:diff[1] recursivo para os diretórios novos e antigos do port (por exemplo, se o diretório de ports modificado for chamado [.filename]#superedit# e o original está na nossa árvore como [.filename]#superedit.bak# então salve o resultado do comando `diff -ruN superedit.bak superedit`). Tanto o diff unificado ou como o de contexto é aceito, mas os committers do port geralmente preferem diffs unificados. Observe o uso da opção `-N` -- essa é a maneira correta de forçar o diff a lidar adequadamente com o caso de novos arquivos sendo adicionados ou de arquivos antigos sendo excluídos. Antes de nos enviar o diff, por favor, examine a saída para se certificar de que todas as alterações fazem sentido. (Em particular, primeiro limpe os diretórios de trabalho com `make clean`). [NOTE] ==== Se alguns arquivos foram adicionados, copiados, movidos ou removidos, adicione essas informações ao relatório de problemas, para que o committer que pegar o patch saiba quais comandos man:svn[1] executar. ==== Para simplificar operações comuns com arquivos de patch, use `make makepatch` como descrito em crossref:slow-porting[slow-patch,Patching]. Existem outras ferramentas, como [.filename]#/usr/ports/Tools/scripts/patchtool.py#. Antes de usá-lo, por favor leia [.filename]#/usr/ports/Tools/scripts/README.patchtool#. Se o port não é mantido e você o utiliza ativamente, por favor, considere se voluntariar como o seu mantenedor. O FreeBSD tem mais de 4000 ports sem mantenedores, e esta é uma área onde mais voluntários são sempre necessários. (Para uma descrição detalhada das responsabilidades dos mantenedores, consulte a seção no extref:{developers-handbook}[Developer's Handbook, POLICIES-MAINTAINER].) Para enviar o diff, use o https://bugs.freebsd.org/submit/[formulário de envio de bugs] (no produto `Ports & Packages`, e no componente `Individual Port(s)`). Sempre inclua a categoria com o nome do port, seguido por dois pontos e uma breve descrição do problema. Exemplos: `_category/portname_: _add FOO option_`; `_category/portname_: _Update to XY_`. Por favor mencione quaisquer arquivos adicionados ou deletados na mensagem, pois eles devem ser explicitamente especificados no man:svn[1] ao fazer o commit. Não comprima ou codifique o diff. Antes de enviar o bug, revise a seção extref:{problem-reports}[Escrevendo um relatório de problema, pr-writing] no artigo Relatórios de Problemas. Ele contém muito mais informações sobre como escrever relatórios úteis de problemas. [IMPORTANT] ==== Se a atualização for motivada por preocupações de segurança ou por uma falha grave em um port que já está disponível na arvore, notifique a Equipe de Gerenciamento de Ports mailto:portmgr@FreeBSD.org[portmgr@FreeBSD.org] para solicitar imediata recompilação e redistribuição do pacote do port. Caso contrário, usuários desavisados ​​do `pkg` continuarão a instalar a versão antiga via `pkg install` por várias semanas. ==== [NOTE] ==== Por favor, use o man:diff[1] ou `svn diff` para criar atualizações para ports existentes. Outros formatos incluem o arquivo inteiro e impossibilitam ver o que mudou. Quando os diffs não são incluídos, toda a atualização pode ser ignorada. ==== Agora que tudo isso foi feito, leia sobre como manter-se atualizado crossref:keeping-up[keeping-up,Mantendo-se Atualizado]. [[svn-diff]] == Usando o Subversion para Criar Patches Quando possível, envie por favor um man:svn[1]diff. Eles são mais fáceis de manusear do que os diffs entre diretórios "novos e antigos". Nele é mais fácil de ver o que mudou e também é mais fácil de atualizar o diff no caso de algo ter sido modificado na Coleção de Ports desde que o diff foi gerado, ou no caso do committer pedir que algo seja corrigido. Além disso, um patch gerado com `svn diff` pode ser facilmente aplicado com `svn patch` e irá economizar algum tempo para o committer. [source,shell] .... % cd ~/my_wrkdir <.> % svn co https://svn.FreeBSD.org/ports/head/dns/pdnsd <.> % cd ~/my_wrkdir/pdnsd .... <.> Isso pode ser em qualquer lugar, é claro. Compilações de ports não se limitam ao [.filename]#/usr/ports/#. <.> O https://svn.FreeBSD.org/[svn.FreeBSD.org] é o servidor Subversion público do FreeBSD. Veja extref:{handbook}mirrors[Mirrors do Subversion, svn-mirrors] para mais informações. Enquanto estiver no diretório de ports, faça as alterações necessárias. Se você adicionar, copiar, mover ou remover um arquivo, use o `svn` para registrar essas alterações: [source,shell] .... % svn add new_file % svn copy some_file file_copy % svn move old_name new_name % svn remove deleted_file .... Certifique-se de verificar o port usando a lista de verificação crossref:quick-porting[porting-testing,Testando o Port] e crossref:quick-porting[porting-portlint,Verificando o Port com `portlint`]. [source,shell] .... % svn status % svn update <.> .... <.> Isso tentará mesclar as diferenças entre o patch e a versão do repositório atual. Veja a saída cuidadosamente. A letra na frente de cada nome de arquivo indica o que foi feito com ele. Consulte <> para uma lista completa. [[table-svn-up]] .Prefixos de Atualização de Arquivos do Subversion [cols="1,1", frame="none"] |=== |U |O arquivo foi atualizado sem problemas. |G |O arquivo foi atualizado sem problemas (somente quando está trabalhando com um repositório remoto). |M |O arquivo foi modificado e foi mesclado sem conflitos. |C |O arquivo foi modificado e foi mesclado com conflitos. |=== E se o status `C` for exibido como resultado de um `svn update`, isso significa que algo mudou no repositório Subversion e o man:svn[1] não foi capaz de mesclar as alterações locais com as do repositório. É sempre uma boa ideia inspecionar as alterações de qualquer maneira, o man:svn[1] não sabe nada sobre a estrutura de um port, então pode (e provavelmente irá) mesclar coisas que não fazem sentido. O último passo é fazer um man:diff[1] unificado das mudanças: [source,shell] .... % svn diff > ../`make -VPKGNAME`.diff .... [NOTE] ==== Se os arquivos foram adicionados, copiados, movidos ou removidos, inclua os comandos man:svn[1]`add`, `copy`, `move` e `remove` que foram usados. O `svn move` ou o `svn copy` deve ser executado antes de aplicar o patch. O `svn add` ou `svn remove` deve ser executado após o patch ser aplicado. ==== Envie o patch seguindo as extref:{problem-reports}[diretrizes de envios de relatórios de problemas, pr-writing]. [[moved-and-updating-files]] == [.filename]#UPDATE# e [.filename]#MOVED# [[moved-and-updating-updating]] === [.filename]#/usr/ports/UPDATING# Se a atualização do port exigir etapas especiais, como alteração de arquivos de configuração ou execução de um programa específico, ela deverá ser documentada neste arquivo. O formato de uma entrada neste arquivo é: [.programlisting] .... YYYYMMDD: AFFECTS: users of portcategory/portname AUTHOR: Your name Special instructions .... [TIP] ==== Quando incluir instruções exatas para o portmaster, portupgrade e/ou instruções ao pkg, por favor, certifique-se de escapar o shell escaping corretamente. Por exemplo, _não_ use: [source,shell] .... # pkg delete -g -f docbook-xml* docbook-sk* docbook[2345]??-* docbook-4* .... Como mostrado, o comando só irá funcionar com bourne shells. Em vez disso, use o formato abaixo, que funcionará com ambos bourne shell e c-shell: [source,shell] .... # pkg delete -g -f docbook-xml\* docbook-sk\* docbook\[2345\]\?\?-\* docbook-4\* .... ==== [NOTE] ==== Recomenda-se que a linha AFFECTS contenha uma glob que corresponda a todos os ports afetados pela entrada, para que as ferramentas automatizadas possam analisá-la com a maior facilidade possível. Se uma atualização diz respeito a todas as versõs do BIND 9 o conteúdo de `AFFECTS` deve ser `usuários do dns/bind9*`, _não deve_ ser `usuários do BIND 9` ==== [[moved-and-updating-moved]] === [.filename]#/usr/ports/MOVED# Este arquivo é usado para listar os ports movidos ou removidos. Cada linha no arquivo é composta por nome do port, para onde o port foi movido, quando e por quê. Se o port foi removido, a seção detalhando onde ele estava pode ser deixado em branco. Cada seção deve ser separada pelo caractere `|` (pipe), assim: [.programlisting] .... old name|new name (blank for deleted)|date of move|reason .... A data deve ser inserida no formato `YYYY-MM-DD`. Novas entradas são adicionadas ao final da lista para mantê-las em ordem cronológica, com a entrada mais antiga no topo da lista. Se um port foi removido, e depois restaurado, exclua a linha neste arquivo que informa que ele foi removido. Se um port foi renomeado e depois renomeado de volta para seu nome original, adicione uma nova entrada com o nome intermediário para o nome antigo e remova a entrada antiga para não criar um loop. [NOTE] ==== Quaisquer alterações devem ser validadas com `Tools/scripts/MOVEDlint.awk`. Se estiver usando um diretório de ports diferente de [.filename]#/usr/ports#, use: [source,shell] .... % cd /home/user/ports % env PORTSDIR=$PWD Tools/scripts/MOVEDlint.awk .... ====