第 11 章 端口升级

如果端口不是作者提供的最新版本,请更新 /usr/ports 的本地工作副本。该端口可能已经更新到新版本。

当处理多个端口时,使用 Git 保持整个 ports 集合更新可能更容易,如 使用 Ports 集合 中所述。这将额外的好处是跟踪所有端口的依赖关系。

下一步是查看是否有更新正在等待。为此,有两种选择。有一个可搜索的接口用于访问 FreeBSD 问题报告 (PR) 或 bug 数据库。在“产品”多选菜单中选择“端口和软件包”,并在“摘要”字段中输入端口名称。

如果没有待处理的 PR,下一步是向端口维护者发送电子邮件,如 make maintainer 所示。此人可能已经在进行升级工作,或者有理由现在不升级端口(例如,新版本存在稳定性问题),因此无需重复他们的工作。请注意,未维护的端口的维护者列为 [email protected],这只是通用的端口邮件列表,因此在这种情况下,向那里发送邮件可能不会有任何帮助。

如果维护者要求您进行升级,或者没有维护者,那么请通过准备更新来帮助 FreeBSD!请使用基本系统中的 diff(1) 命令来执行此操作。

要为单个补丁创建合适的 diff,请将需要修补的文件复制到 something.orig,将更改保存到 something,然后创建补丁

% diff -u something.orig something > something.diff

否则,要么使用 git diff 方法(使用 Git 创建补丁),要么将端口内容复制到一个完全不同的目录,并使用新旧端口目录的递归 diff(1) 输出结果(例如,如果修改后的端口目录称为 superedit,原始目录在我们的树中为 superedit.bak,则保存 diff -ruN superedit.bak superedit 的结果)。统一或上下文 diff 都可以,但端口提交者通常更喜欢统一 diff。请注意 -N 选项的使用 - 这是强制 diff 正确处理添加新文件或删除旧文件情况的公认方法。在向我们发送 diff 之前,请检查输出以确保所有更改都有意义。(特别是,请确保首先使用 make clean 清理工作目录)。

如果添加、复制、移动或删除了一些文件,请将此信息添加到问题报告中,以便接收补丁的提交者知道需要运行哪些 git(1) 命令。

为了简化补丁文件的常用操作,请使用 make makepatch,如 修补 中所述。还存在其他工具,例如 /usr/ports/Tools/scripts/patchtool.py。在使用它之前,请阅读 /usr/ports/Tools/scripts/README.patchtool

如果端口未维护,并且您正在积极使用它,请考虑自愿成为其维护者。FreeBSD 有超过 4000 个没有维护者的端口,这是一个始终需要更多志愿者的领域。(有关维护者职责的详细说明,请参阅 开发人员手册 中的相关部分)。

要提交 diff,请使用 bug 提交表单(产品“端口和软件包”,组件“单个端口”)。始终包含带有端口名称的类别,后跟冒号,以及问题的简要描述。例如:category/portname: add FOO optioncategory/portname: Update to X.Y。请在消息中提及任何添加或删除的文件,因为在执行提交时必须将其显式指定给 git(1)。请勿压缩或编码 diff。

在提交 bug 之前,请查看问题报告文章中的 编写问题报告 部分。它包含更多关于如何编写有用的问题报告的信息。

如果升级是由安全问题或当前已提交端口中的严重故障引起的,请通知端口管理团队 <[email protected]> 以请求立即重建和重新分发端口的软件包。否则,在几周内,毫无戒心的 pkg 用户将继续通过 pkg install 安装旧版本。

请使用 diff(1)git diff 来创建对现有端口的更新。其他格式包括整个文件,这使得无法仅查看发生了哪些更改。如果未包含 diff,则可能会忽略整个更新。

现在所有这些都已完成,请阅读有关如何保持更新的信息,请参阅 保持更新

11.1. 使用 Git 创建补丁

如果可能,请提交 git(1) 补丁或 diff。它们比“新旧”目录之间的 diff 更易于处理。更容易查看发生了哪些更改,以及在开始处理它后 Ports 集合中修改了一些内容时,或提交者要求修复某些内容时更新 diff。此外,使用 git-format-patch(1)git-diff(1) 生成的补丁可以使用 git-am(1)git-apply(1) 轻松应用,这将为提交者节省一些时间。最后,git-format-patch(1) 生成的 git 补丁包含您的作者信息和提交消息。这些将记录在存储库的日志中,这是提交更改的推荐方法。

% git clone https://git.FreeBSD.org/ports.git ~/my_wrkdir  (1) (2)
% cd ~/my_wrkdir
1这当然可以在任何地方。构建端口并不局限于 /usr/ports/ 内。
2git.FreeBSD.org 是 FreeBSD 公共 Git 服务器。有关更多信息,请参阅 FreeBSD Git 存储库 URL 表

在端口目录中,进行所需的任何更改。如果添加、移动或删除文件,请使用 git 来跟踪这些更改

% git add new_file
% git mv old_name new_name
% git rm deleted_file

请确保使用 测试端口使用 portlint 检查端口 中的清单来检查端口。

此外,使用 make makesum 更新 distinfo 中的校验和引用。

在创建补丁之前,请获取最新的存储库并在其顶部重新设置更改的基础。仔细观察并跟踪输出。如果任何文件无法重新设置基础,则表示在您编辑同一文件时上游文件发生了更改,并且需要手动解决冲突。

% git fetch origin main
% git rebase origin/main

检查为补丁暂存的更改

% git status
% git diff --staged

最后一步是创建更改的统一 diff 或补丁

要使用 git-format-patch(1) 生成补丁

% git checkout -b my_branch
% git commit
% git format-patch main

这将生成一个名为 0001-foo.patch 的补丁。这是首选方法,因为它将包含作者身份,并且在进行一系列不应合并在一起的更改时也更容易。

或者,要使用 git-diff(1) 生成统一 diff

% git diff --staged > ../`make -VPKGNAME`.diff

这将生成一个名为 foo-1.2.3.diff 的 diff。其中 foo 被提交消息的第一行(即提交消息的主题)替换。

创建补丁后,您可以切换到主分支以开始其他开发。

% git checkout main

补丁被接受并合并后,您可以根据需要删除本地开发分支

% git branch -D my_branch

如果添加、移动或删除了文件,请包含使用的 git(1) addmvrm 命令。必须在应用补丁之前运行 git mv。必须在应用补丁后运行 git addgit rm

按照 问题报告提交指南 发送补丁。

11.2. 更新和移动

11.2.1. /usr/ports/UPDATING

如果升级端口需要特殊步骤,例如更改配置文件或运行特定程序,则必须在此文件中记录这些步骤。此文件中条目的格式为

YYYYMMDD:
  AFFECTS: users of portcategory/portname
  AUTHOR: Your name <Your email address>

  Special instructions

在包含精确的 portmaster、portupgrade 和/或 pkg 指令时,请确保正确转义 shell。例如,请勿使用

# pkg delete -g -f docbook-xml* docbook-sk* docbook[2345]??-* docbook-4*

如所示,该命令仅适用于 bourne shell。相反,请使用下面所示的形式,该形式适用于 bourne shell 和 c-shell

# pkg delete -g -f docbook-xml\* docbook-sk\* docbook\[2345\]\?\?-\* docbook-4\*

建议 AFFECTS 行包含与条目受影响的所有端口匹配的 glob,以便自动化工具能够尽可能轻松地解析它。如果更新涉及所有现有的 BIND 9 版本,则 AFFECTS 内容必须为 users of dns/bind9*,而不能为 users of BIND 9

11.2.2. /usr/ports/MOVED

此文件用于列出已移动或删除的端口。文件中的每一行都由端口名称、端口移动到的位置、时间和原因组成。如果端口已删除,则可以留空详细说明端口移动到的位置的部分。每个部分都必须用 |(管道)字符分隔,如下所示

old name|new name (blank for deleted)|date of move|reason

日期必须以 YYYY-MM-DD 的格式输入。新条目添加到列表的末尾以保持其按时间顺序排列,最旧的条目位于列表的顶部。

如果端口已删除但后来已恢复,请删除该文件中说明已删除该端口的行。

如果端口已重命名然后又重命名回其原始名称,请添加一个包含中间名称到旧名称的新条目,并删除旧条目以避免创建循环。

必须使用 Tools/scripts/MOVEDlint.awk 验证任何更改。

如果使用除 /usr/ports 之外的端口目录,请使用

% cd /home/user/ports
% env PORTSDIR=$PWD Tools/scripts/MOVEDlint.awk

最后修改时间:2024 年 9 月 23 日,作者 Fernando Apesteguía