diff options
Diffstat (limited to 'documentation/content/zh-cn/books/porters-handbook/port-upgrading/chapter.adoc')
-rw-r--r-- | documentation/content/zh-cn/books/porters-handbook/port-upgrading/chapter.adoc | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/documentation/content/zh-cn/books/porters-handbook/port-upgrading/chapter.adoc b/documentation/content/zh-cn/books/porters-handbook/port-upgrading/chapter.adoc new file mode 100644 index 0000000000..6b2c7b0b9c --- /dev/null +++ b/documentation/content/zh-cn/books/porters-handbook/port-upgrading/chapter.adoc @@ -0,0 +1,164 @@ +--- +title: 第 10 章 升级一个 port +prev: books/porters-handbook/testing +next: books/porters-handbook/security +--- + +[[port-upgrading]] += 升级一个 port +:doctype: book +:toc: macro +:toclevels: 1 +:icons: font +:sectnums: +:source-highlighter: rouge +:experimental: +:skip-front-matter: +:xrefstyle: basic +:relfileprefix: ../ +:outfilesuffix: +:sectnumoffset: 10 +:toc-title: 目录 +:table-caption: 表 +:figure-caption: 图 +:example-caption: 例 + +include::shared/mirrors.adoc[] +include::shared/authors.adoc[] +include::shared/releases.adoc[] +include::shared/zh-cn/mailing-lists.adoc[] +include::shared/zh-cn/teams.adoc[] +include::shared/zh-cn/urls.adoc[] + +toc::[] + +如果您发现某个 port 相对原作者所发布的版本已经过时, 则首先需要确认的是您的 port 是最新的。 您可以在 FreeBSD FTP 镜像的 [.filename]#ports/ports-current# 目录中找到它们。 但是, 如果您正在使用较多的 port, 则可能使用 CVSup 来保持 Ports Collection 最新更为简单, 这在 link:{handbook}#CVSUP-CONFIG[使用手册] 中进行了介绍。 此外, 这样做也有助于保持 port 依赖关系的正确性。 + +下一步是检查是否已经有在等待的更新。 要完成这项工作, 可以采用下列两种方法之一。 有一个用于搜索 http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query[ FreeBSD 问题报告 (PR) 数据库] (也被称作 `GNATS`)。 在下拉框中选择 `ports`, 然后输入 port 的名字。 + +但是, 有些时候人们会忘记将避免混淆的 port 的名字放到 Synopsis 字段中。 这种时候, 您可以试试看 <<portsmon, FreeBSD Ports 监视系统>> (也被叫做 `portsmon`)。 这个系统会尝试按照 port 的名字来进行分类。 要搜索和某个特定 port 有关的 PR, 可以使用 http://portsmon.FreeBSD.org/portoverview.py[ port概览]。 + +如果没有候审的 PR, 下一步是给 port 的维护者写信, 这可以通过执行 `make maintainer` 看到。 这个人可能正在进行升级工作, 或者由于某种理由暂时没有升级 (例如, 新版本有稳定性问题); 一般您不希望重复他们的工作。 注意没有维护者的 port 的维护者会显示为 `ports@FreeBSD.org`, 这是一般性 port 问题的邮件列表, 因此发邮件给它一般没什么意义。 + +如果维护者要求您去完成升级, 或者没有维护者, 您就有机会通过自行完成升级来帮助 FreeBSD 了! 请使用基本系统提供的 man:diff[1] 命令来完成相关的工作。 + +如果只修改一个文件, 可以直接使用 `diff` 来生成补丁, 将需要修改的文件复制成 _something.orig_, 并将改动放进 _something_, 接着生成补丁: + +[source,bash] +.... +% /usr/bin/diff something.orig something > something.diff +.... + +如果不是这样的话, 则您应使用 `cvs diff` 的方法 (<<cvs-diff>>), 或将目录整个复制到另一个目录, 并使用 man:diff[1] 比较两个目录时在目录中递归产生的输出结果 (例如, 如果您修改后的 port 目录的名字是 [.filename]#superedit# 而原始文件的目录是 [.filename]#superedit.bak#, 则应保存 `diff -ruN superedit.bak superedit` 的结果)。 一致式 (unified) 或 上下文式 (context) diff 都是可以的, 但一般来说 port committer 会更喜欢一致式 diff。 请注意这里使用的选项 `-N`, 它的目的是强制 diff 正确地处理出现新文件, 或老文件被删除的情形。 在把 diff 发给我们之前, 请再次检查输出, 以便确认每一个修改都是有意义的。 (特别注意, 在对比目录之前要用 `make clean` 清理一下)。 + +为了简化常用的补丁文件操作, 您可以使用 [.filename]#/usr/ports/Tools/scripts/patchtool.py#。 使用之前, 请首先阅读 [.filename]#/usr/ports/Tools/scripts/README.patchtool#。 + +如果 port 目前还无人维护, 而且您自己经常使用它, 请考虑自荐为它的维护者。 FreeBSD 有超过 4000 个没有维护者的 port, 而这正是最需要志愿人员的领域。 (要了解关于维护者的任务描述, 请参见 link:{developers-handbook}#POLICIES-MAINTAINER[ 开发手册中的相关部分]。) + +将 diff 发送给我们的最佳方式是通过 man:send-pr[1] (category 一栏写 `ports`)。 如果您正维护那个 port, 请务必在 synopsis 的开头写上 `[maintainer update]`, 并将您的 PR 的 "Class" 设置为 `maintainer-update`。 反之, 您的 PR 的 "Class" 就应该是 `change-request`。 请在信中逐个提及每一个删除或增加的文件, 因为这些都必须明确地在使用 man:cvs[1] 进行 commit 时明确地指定。 如果 diff 超过了 20K, 请考虑压缩并对其进行 uuencode; 否则, 简单地将其原样加入 PR 即可。 + +在您 man:send-pr[1] 之前, 请再次阅读 Problem Reports 一文中的 link:{problem-reports}#pr-writing/[ 如何撰写问题报告] 小节; 它给出了丰富的关于如何撰写更好的问题报告的介绍。 + +[IMPORTANT] +==== +如果您的更新是由于安全考虑, 或修复已经 commit 的 port 中的严重问题, 请通知 {portmgr} 来申请立即重建和分发您的 port 的 package。 否则, 不愿怀疑的使用 man:pkg_add[1] 的用户, 可能会在未来数周之内继续通过使用 `pkg_add -r` 安装旧版本。 +==== + +[NOTE] +==== +再次强调, 请使用 man:diff[1] 而非 man:shar[1] 来发送现有 port 的更新! 这可以帮助 ports committer 理解需要修改的内容。 +==== + +现在您已经了解了所需的所有操作, 您可能会像要阅读在 <<keeping-up>> 中关于如何保持最新的描述。 + +[[cvs-diff]] +== 使用 CVS 制作补丁 + +如果可能的话, 请提交man:cvs[1] diff; 这种情形要比直接比较 "新、旧" 目录要容易处理。 此外, 这种方法也让您更容易看出到底改了什么, 并在其他人更新了 Ports Collection 时容易合并这些改动, 在提交之前, 这可以减少维护补丁所需的工作。 + +[source,bash] +.... +% cd ~/my_wrkdir <.> +% cvs -d R_CVSROOT co pdnsd <.> <.> +% cd ~/my_wrkdir/pdnsd +.... + +<.> 当然, 这可以是您指定的任意目录; 联编 port 并不局限于 [.filename]#/usr/ports/# 的子目录。 + +<.> R_CVSROOT 是任何一个公共的 cvs 镜像服务器, 您可以在 link:{handbook}#cvsup/[FreeBSD 使用手册] 中挑选一个。 + +<.> pdnsd 是 port 的模块名字; 通常说来它和 port 的名字一样, 不过也有些例外, 特别是那些本地化类别 (package:german/selfhtml[] 对应的模块名字是 de-selfhtml); 您可以通过 link:https://www.FreeBSD.org/cgi/cvsweb.cgi/ports[cvsweb 界面] 查询, 或者也可以指定完整路径, 例如在我们这个例子中是 [.filename]#ports/dns/pdnsd#。 + +在工作目录中, 您可以像往常一样进行任何更改。 如果您添加或删除了文件, 则需要告诉 `cvs` 来追踪这些改动: + +[source,bash] +.... +% cvs add new_file +% cvs remove deleted_file +.... + +请反复检查 <<porting-testing>> 列出的事项并使用 <<porting-portlint>> 进行检查。 + +[source,bash] +.... +% cvs status +% cvs update <.> +.... + +<.> 这会合并 CVS 中其他人做的改动和您的补丁; 在这个过程中, 您需要仔细观察输出。 文件名前面的那个字母会显示做了什么, 请参阅 <<table-cvs-up>> 中给出的说明。 + +[[table-cvs-up]] +.cvs update 文件名前字母前缀的含义 +[cols="1,1", frame="none"] +|=== +|U +|文件更新无误。 + +|P +|文件更新无误 (通常只有在使用远程代码库时才会看到)。 + +|M +|文件有本地修改, 并合并成功而未产生任何冲突。 + +|C +|文件有本地修改, 进行了合并并产生了冲突。 +|=== + +如果您在执行 `cvs update` 时某些文件出现了 `C`, 则说明有其他人在 CVS 中做了修改, 而 man:cvs[1] 无法将这些改动与您本地的改动进行合并。 不过, 无论如何, 最好都检查一下合并的结果, 因为 `cvs` 并不知道 port 应该是什么样子, 因此它所做的合并无论是否产生了冲突, 都有可能 (并且并不罕见) 产生没有意义的结果。 + +最后一步是以 CVS 中的文件为基础生成 unified man:diff[1]: + +[source,bash] +.... +% cvs diff -uN > ../`basename ${PWD}`.diff +.... + +[NOTE] +==== +指定 `-N` 十分重要, 因为它确保了添加或删除的文件也出现在补丁中。 补丁将包含删除的文件, 在打上补丁时, 这些文件会被清空, 所以最好在 PR 中提醒 committer 删除它们。 +==== + +根据 <<port-upgrading>> 的指导提交您的补丁。 + +[[moved-and-updating-files]] +== UPDATING 和 MOVED 文件 + +如果在升级 port 时需要类似修改配置文件或运行特定的程序这样的特别步骤, 则应在 [.filename]#/usr/ports/UPDATING# 文件中予以说明。 这个文件中的项目格式如下: + +[.programlisting] +.... +YYYYMMDD: + AFFECTS: users of port类别/port名字 + AUTHOR: 您的名字 <您的电子邮件地址> + + 所需执行的特别步骤 +.... + +如果您需要在内文中加入具体的 portmaster 或 portupgrade 的说明, 请确保所用的 shell 命令使用了正确的转义字符。 + +如果 port 被删除或改名,则应在 [.filename]#/usr/ports/MOVED# 中添加相应的说明项目。 这个文件中的项目格式如下: + +[.programlisting] +.... +原来的名字|新名字 (如果删除则应留空)|删除或改名的日期|原因 +.... |