Back

Gentoo Version Bump

前言

在使用Gentoo的时候,经常看到了某个软件的上游发布了新版本,隔壁arch的小伙伴都用上了,但是Gentoo这边还没更新,心痒难耐。 这时候推荐自己亲自动手上,bump(升级)到新的版本真的非常容易。

例如今天有小伙伴说wps都更新到11.1.0.10920了,gentoo-zh这边还是旧的,其实天苯的overlay里面已经有新版了,假装没看到,(逃

我们可以在自己本地的overlay里面bump到新版本之后测试,如果没有问题,就可以向维护者提出bump 请求(gentoo主仓库常见做法),或者自己发pull request到对于的git仓库(overlay常见做法)。

在gentoo主仓库发version bump请求是在 https://bugs.gentoo.org ,所以需要提前注册一个帐号,发version bump的时候还需要避免"Zero day bump request",具体是至少要等48小时之后才能发bump request,相关Wiki:https://wiki.gentoo.org/wiki/Zero-day_bump_requests。

这是一个version bump的例子: app-editors/le: version bump

在gentoo-zh,更推荐的方式是直接发version bump的pull request。这个需要提前注册好Github帐号,并且fork gentoo-zh仓库,如果以前已经fork过,不需要额外操作(即不用删除重新fork)

overlay version bump

因为大家添加gentoo-zh overlay的地址不一定一样,有的喜欢直接使用开发的git仓库(https://github.com/microcai/gentoo-zh.git),有的喜欢使用gentoo-mirror(https://github.com/gentoo-mirror/gentoo-zh.git)的仓库。如果使用的是开发仓库,可以直接在上面修改。如果使用的是gentoo-mirror就建议在自己的本地overlay先bump。

这里我先介绍,如何在自己的本地overlay里version bump并且测试好,然后才在复制commit到 gentoo-zh 仓库,最后提交发pull request。

在自己的overlay里bump测试

步骤:

  1. 建立自己的本地overlay(只需一次,以后bump新的包不需要再来一次)
  2. 复制已有的ebuild到自己的overly,如果已经有同名的包,建议先删除
  3. bump到新版本,编译安装运行测试
  4. 测试通过之后,可以提交修改到gentoo-zh。如果测试没过,直接git还原修改即可

自定义overlay

如果没有自己的本地overlay,可以自定义overlay,官方Wiki介绍在这里:https://wiki.gentoo.org/wiki/Creating_an_ebuild_repository。 特权操作我使用的是doas,可以替换成sudo或者切换到root用户操作。 简单来说就是:

$ doas eselect repository create local  # 自定义本地overlay
$ cd /var/db/repos/local/
$ doas git init                         # 使用git管理自己的overlay
$ doas git add .
$ doas git commit -m 'create overlay'

复制想要bump的ebuild到你的overlay

这里以gentoo-zh的wps为例,当前gentoo-zh里wps的版本是11.1.0.10702,最新版本是11.1.0.10920。wps的完整包名是 app-office/wps-office:

$ doas rm -rf /var/db/repos/local/app-office/wps-office
$ doas mkdir -p /var/db/repos/local/app-office/wps-office
$ doas cp -r /var/db/repos/gentoo-zh/app-office/wps-office/* /var/db/repos/local/app-office/wps-office
$ cd /var/db/repos/local/app-office/wps-office
/var/db/repos/local/app-office/wps-office $ doas git add .

这时候确认一下local overlay的状态:

/var/db/repos/local/app-office/wps-office $ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   app-office/wps-office/Manifest
        new file:   app-office/wps-office/metadata.xml
        new file:   app-office/wps-office/wps-office-11.1.0.10702.ebuild

提交修改,这个commit是后面cherry-pick不遇到冲突的关键。

/var/db/repos/local/app-office/wps-office $ doas git commit -m 'app-office/wps-office: add 11.1.0.10702'

如果需要保留旧版的时候:

/var/db/repos/local/app-office/wps-office $ doas cp wps-office-11.1.0.10702.ebuild wps-office-11.1.0.10920.ebuild
/var/db/repos/local/app-office/wps-office $ doas git add wps-office-11.1.0.10920.ebuild

不需要保留原版的时候:

/var/db/repos/local/app-office/wps-office $ doas git mv wps-office-11.1.0.10702.ebuild wps-office-11.1.0.10920.ebuild

这里我们选择不保留旧版,查看local overlay的状态:

/var/db/repos/local/app-office/wps-office $ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
       renamed:    wps-office-11.1.0.10702.ebuild -> wps-office-11.1.0.10920.ebuild

由于我们升级到新的版本需要下载新版本的distfile(可能是源码或者二进制包),这时候需要更新manifest文件。

更新manifest文件可以通过ebuild/repoman等等命令,这里使用的是repoman:

/var/db/repos/local/app-office/wps-office $ doas repoman manifest
>>> Downloading 'https://wdl1.cache.wps.cn/wps/download/ep/Linux2019/10920/wps-office_11.1.0.10920_amd64.deb'
/var/cache/distfiles/wps-office_11. 100%[==================================================================>] 351.76M  28.7MB/s    in 12s
...... # 删除部分log
>>> Creating Manifest for /var/db/repos/local/app-office/wps-office

这时候去看看local overlay的状态:

/var/db/repos/local/app-office/wps-office $ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        renamed:    wps-office-11.1.0.10702.ebuild -> wps-office-11.1.0.10920.ebuild

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   Manifest

/var/db/repos/local/app-office/wps-office $ cat Manifest
DIST wps-office_11.1.0.10920_amd64.deb 368846078 BLAKE2B b33f6849244b658c65003501fae8b6ac4ce9f51131e96a380e055df9278bda26618f98aff7cf52e354570f6c9c82b31010eaf6765e7ef161b6e10747b08044b2 SHA512 15d8540cd4aa1efcdfd90c1ac69fee7298caf510edd45f9558fab5075d111e6458d07aea0c06dadde8b56d001177ab2447bcfee4177400938db6f56cc7d23e6f
DIST wps-office_11.1.0.10920_arm64.deb 327865640 BLAKE2B 665139ded95a017d7ed1bfcc7de5b19d46c5b08e2a905695da86e2358f652f3a20046cafab7626b6014b040c894e112306783fc956d22882906d7ebfa964f5c3 SHA512 b7dca412b337872acc70be028cddae38ff0e0902f5683d1520b56753f0bb48e35644166f7311cd0c03819a3cd9be125d41ec50e3876405a2ebbed1eef050f9d6
DIST wps-office_11.1.0.10920_mips64el.deb 324211870 BLAKE2B 3278b46e1a9b81aa1d3146bf53febcaf53724e2d960dbcd69f92efc38f5f5d5013bcc366868cf6f7105207bbb0531b95f5c9f8887183d8fccd132d5248ef1fc8 SHA512 349f094c0a09bd9944f0424b6551e27711c2795ca9624bbc4967af6e5ee3dc95f85b743eda2b5dea4c222d1009b069eacf3ca660b51c198e44d3b9d0cfbff35b

添加修改之后的manifest文件:

/var/db/repos/local/app-office/wps-office $ doas git add Manifest
/var/db/repos/local/app-office/wps-office $ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   Manifest
        renamed:    wps-office-11.1.0.10702.ebuild -> wps-office-11.1.0.10920.ebuild

安装运行测试

/var/db/repos/local/app-office/wps-office $ doas emerge -av app-office/wps-office
These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild  N     ] app-office/wps-office-11.1.0.10920::local  USE="systemd (-big-endian)" 0 KiB

Total: 1 package (1 new), Size of downloads: 0 KiB

Would you like to merge these packages? [Yes/No]

回车之后等emerge运行完成,如果中途遇到错误,例如编译错误之类的,在这个包不能顺利bump上去的时候,建议等包维护来处理。 如果emerge正常安装完成,接下来就是具体运行测试了。如果在运行测试也没有发现问题,我们就可以继续完成bump的后续工作了

通常建议在本地使用repoman或者pkgchek/pkgscan等等工具检查是否会有已知的问题:

/var/db/repos/local/app-office/wps-office $ repoman -dfx
RepoMan scours the neighborhood...
  ebuild.badheader              1
   app-office/wps-office/wps-office-11.1.0.10920.ebuild: line 1: Invalid Copyright
RepoMan sez: "You're only giving me a partial QA payment?
              I'll take it this time, but I'm not happy."

这里检查只发现一个Copyright的小问题,是因为这个包上次更新是2021年的,现在是2022年了。由于repoman的commit会帮忙修改,所以这里可以忽略。

然后我们开始提交,这里也可以使用git commit -m 'xxx/xxx: xxx',repoman commit底层也是调用git commit,但是会做更多的检查,所以推荐使用。 version bump commit的消息格式通常是 “/: bump to 11.1.0”

/var/db/repos/local/app-office/wps-office $ doas repoman commit -m 'app-office/wps-office: bump to 11.1.0.10920'
RepoMan scours the neighborhood...
>>> Creating Manifest for /var/db/repos/local/app-office/wps-office

Note: use --include-dev (-d) to check dependencies for 'dev' profiles
...
Commit complete.
RepoMan sez: "If everyone were like you, I'd be out of business!"

检查我们的提交:

$ git show
commit 4adaa116596ee8f1500ec55f882bb56aa68076d6 (HEAD -> master)
Author: Yongxiang Liang <tanekliang@gmail.com>
Date:   Thu Jan 20 22:48:04 2022 +0800

    app-office/wps-office: bump to 11.1.0.10920

    Package-Manager: Portage-3.0.30, Repoman-3.0.3
    Signed-off-by: Yongxiang Liang <tanekliang@gmail.com>

diff --git a/app-office/wps-office/Manifest b/app-office/wps-office/Manifest
index 49bda6e49..5aafb1e82 100644
--- a/app-office/wps-office/Manifest
+++ b/app-office/wps-office/Manifest
@@ -1,3 +1,3 @@
-DIST wps-office_11.1.0.10702_amd64.deb 364304508 BLAKE2B 877aee01ef637d3e14569399a7b93226f17b7dc9cae482889d520b630c1d2fb59eceb5f8e5fed934ca666cda226433a3b6c50ef0a3bf18a60965dc0eeb322064 SHA512 9742955bd0efe802aa0666c857f42257bd0461fec566e141c9e899b31f6482894720a3c37e28337744ecc9ff2b5a6fc4900370260241423d9489823723ded547
-DIST wps-office_11.1.0.10702_arm64.deb 328456554 BLAKE2B 45e53ad757306a95e7ac7f98827e3f3d91d354b198f46ef67443bf1f81eba0395777665f6f0d69bcda5c7b8e9767aeb3108fdf7f0023fca1d434157986d36e3d SHA512 75773dfa6fee697218a8e1e7fa8be5dd2c7d673bcb26416c864ba963f305d6ddd0cb4511b3263fcce1b50a052342d8d1f8a7ff15637e6295d2156a220cc23f07
-DIST wps-office_11.1.0.10702_mips64el.deb 321387520 BLAKE2B 80217266f3387c8a9f8686608391d275cfbd275678131b315d4244e8217404aeee1c69b4fee381c5e1818e1a61fac96503196031c8fa014795dbb5669e56b28f SHA512 10f0f85da540e7d4939b574bd2336bea7b7753f4e97001fc7393f14f1191e7b2e42c9122f3833e996773ef80fc05b66d5b937995c484c888e1c533538fe76f12
+DIST wps-office_11.1.0.10920_amd64.deb 368846078 BLAKE2B b33f6849244b658c65003501fae8b6ac4ce9f51131e96a380e055df9278bda26618f98aff7cf52e354570f6c9c82b31010eaf6765e7ef161b6e10747b08044b2 SHA512 15d8540cd4aa1efcdfd90c1ac69fee7298caf510edd45f9558fab5075d111e6458d07aea0c06dadde8b56d001177ab2447bcfee4177400938db6f56cc7d23e6f
+DIST wps-office_11.1.0.10920_arm64.deb 327865640 BLAKE2B 665139ded95a017d7ed1bfcc7de5b19d46c5b08e2a905695da86e2358f652f3a20046cafab7626b6014b040c894e112306783fc956d22882906d7ebfa964f5c3 SHA512 b7dca412b337872acc70be028cddae38ff0e0902f5683d1520b56753f0bb48e35644166f7311cd0c03819a3cd9be125d41ec50e3876405a2ebbed1eef050f9d6
......

如果这个包是在gentoo-zh,也非常欢迎有小伙伴直接发pull request到 gentoo-zh

fork gentoo-zh然后提pr

给gentoo-zh提交pull request的流程是:

  1. 注册github帐号,fork gentoo-zh(以后新的pull request不需要重复,仅需一次)
  2. 在本地clone gentoo-zh仓库,添加需要的remote (以后新的pull request不需要重复,仅需一次)
  3. 拉取gentoo-zh和local overlay最新的修改
  4. 使用git cherry-pick““复制” local overlay的commit到本地gentoo-zh仓库
  5. 在github里发起pull request

复制提交到gentoo-zh并且pull request

这里涉及到四个仓库:

  1. 本地的local overlay仓库, 地址是 /var/db/repos/local
  2. 本地gentoo-zh仓库, 这里地址是 ~/gentoo-zh,也可以根据自己的喜欢调整
  3. 远程microcai/gentoo-zh仓库, 地址是 https://github.com/microcai/gentoo-zh.git
  4. 自己fork的远程仓库,这里是liangyongxiang/gentoo-zh,地址是:git@github.com:liangyongxiang/gentoo-zh.git

选择https还是ssh地址根据个人喜欢即可。

准备工作

首先clone自己的远程仓库,这个步骤仅仅在后续bump其他包不需要做。

~/gentoo-zh $ git clone git@github.com:liangyongxiang/gentoo-zh.git ~/gentoo-zh
~/gentoo-zh $ git remote add upstream https://github.com/microcai/gentoo-zh.git
~/gentoo-zh $ git remote add local /var/db/repos/local

查看仓库状态:

~/gentoo-zh $ git status
local   /var/db/repos/local (fetch)
local   /var/db/repos/local (push)
origin  git@github.com:liangyongxiang/gentoo-zh.git (fetch)
origin  git@github.com:liangyongxiang/gentoo-zh.git (push)
upstream        https://github.com/microcai/gentoo-zh.git (fetch)
upstream        https://github.com/microcai/gentoo-zh.git (push)

摘取提交

拉取远程microcai/gentoo-zh仓库的最新的修改,然后基于远程仓库的master分支创建一个新的分支来处理提交,这里的分支名是wps-office:

~/gentoo-zh $ git fetch upstream
~/gentoo-zh $ git fetch local
~/gentoo-zh $ git checkout -b wps-office upstream/master

查看仓库状态,可以看到这里有刚刚在local overlay里的提交:

~/gentoo-zh $ git log local/master

commit 4adaa116596ee8f1500ec55f882bb56aa68076d6 (local/master)
Author: Yongxiang Liang <tanekliang@gmail.com>
Date:   Thu Jan 20 22:48:04 2022 +0800

    app-office/wps-office: bump to 11.1.0.10920

    Package-Manager: Portage-3.0.30, Repoman-3.0.3
    Signed-off-by: Yongxiang Liang <tanekliang@gmail.com>

commit edec02ee834f92e9143226ee6c10047af991f70b
Author: Yongxiang Liang <tanekliang@gmail.com>
Date:   Thu Jan 20 22:45:40 2022 +0800

    app-office/wps-office: add 11.1.0.10702
......

一个比较笨的办法是将local overlay的commit操作重复一遍。 这是使用的是更加省事的方式,即使用git cherry-pick来复制之前local overlay的commit,我们需要摘取的是最后一个提交 4adaa116596ee8f1500ec55f882bb56aa68076d6,如果有多个提交想要摘取可以使用 git cherry-pick A^..B (包括A在内的到B的提交),参考:https://stackoverflow.com/questions/1670970/how-to-cherry-pick-multiple-commits

~/gentoo-zh $ git cherry-pick 4adaa116596ee8f1500ec55f882bb56aa68076d6
[wps-office 130a38bc4] app-office/wps-office: bump to 11.1.0.10920
 Date: Thu Jan 20 22:48:04 2022 +0800
 2 files changed, 5 insertions(+), 5 deletions(-)
 rewrite app-office/wps-office/Manifest (100%)
 rename app-office/wps-office/{wps-office-11.1.0.10702.ebuild => wps-office-11.1.0.10920.ebuild} (96%)

查看状态:

~/gentoo-zh $ git status
On branch wps-office
Your branch is ahead of 'upstream/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

推送到自己的远程仓库

~/gentoo-zh $ git push origin
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 32 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 2.58 KiB | 2.58 MiB/s, done.
Total 6 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
remote:
remote: Create a pull request for 'wps-office' on GitHub by visiting:
remote:      https://github.com/liangyongxiang/gentoo-zh/pull/new/wps-office
remote:
To github.com:liangyongxiang/gentoo-zh.git
 * [new branch]          wps-office -> wps-office

如果细心的小伙伴可能会发现,这里对自己的远程仓库只有push的操作,没有pull或者fetch的操作。 自己的远程仓库只是用来临时保持pull request需要的commit的,在pull request合并之后就不再需要,所有信息都在上游仓库里了。 所以自己的远程仓库并不需要和上游的远程仓库保持同步。

在摘取提交的时候,首先fetch上游的远程仓库,这是为了保持和上游同步,避免出现不必要的冲突。

到这里,本地的工作基本完成了,接下来是在github发起pull request。

可以参考网上其他教程,例如 https://chinese.freecodecamp.org/news/how-to-make-your-first-pull-request-on-github/ ,略

这里我发的pull request: https://github.com/microcai/gentoo-zh/pull/1607

Built with Hugo
Theme Stack designed by Jimmy