---
title: Capítulo 11. Atualizando um Port
prev: books/porters-handbook/testing
next: books/porters-handbook/security
showBookMenu: true
weight: 11
path: "/books/porters-handbook/"
---

[[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 <<portsmon,Sistema de Monitoramento de Ports do FreeBSD>> (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` (<<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 <<table-svn-up>> 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 <Your email address>

  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
....
====
