Skip to content

fix(recipe): arch 换源幂等(仅 x86),清掉累积 Server 行并补官方兜底 - #394

Merged
ccmywish merged 1 commit into
RubyMetric:devfrom
yayoinoyume:feat/arch-mirrorlist-idempotency
Sep 7, 2026
Merged

fix(recipe): arch 换源幂等(仅 x86),清掉累积 Server 行并补官方兜底#394
ccmywish merged 1 commit into
RubyMetric:devfrom
yayoinoyume:feat/arch-mirrorlist-idempotency

Conversation

@yayoinoyume

@yayoinoyume yayoinoyume commented Sep 6, 2026

Copy link
Copy Markdown
Contributor
  • x86_64 换源前先清空 /etc/pacman.d/mirrorlist 中所有生效 Server 行(含多次换源累积的旧行)
  • 再写入「新源 + 官方源兜底」,保证每次换源后文件状态确定
  • 幂等仅作用于 x86_64;ARM 分支保持原有行为(不清理、仅 prepend),不触及 ARM
  • 仅作用于 mirrorlist,不影响 pacman.conf 中的 archlinuxcn
  • 修正官方源地址:上游写的 repo.archlinux.org 域名不存在(DNS 无法解析,官方 mirrorlist 无此项),修正为 Arch 官方推荐的 geo.mirror.pkgbuild.com(自动按地理位置选最近镜像)
  • 按 doc/50 更新 recipe 时间戳(2026-09-06)、登记贡献者(sauciers 2→3)

关联issue

#393


问题描述

1. 换源不幂等,mirrorlist 累积旧 Server 行:

chsrc set arch <源> 每次只向 /etc/pacman.d/mirrorlist prepend 新的 Server 行、从不清理旧行。多次换源后累积所有历史源,最先命中的可能是旧源(行为不可预期),文件随换源次数线性变脏。

2. 官方源地址无效:

Arch Linux 的 Upstream 源地址写死为 https://repo.archlinux.org,但该域名不存在(DNS 解析失败、Arch 官方 mirrorlist 无此项)。任何用户执行 chsrc set arch upstream 试图恢复官方源,得到的都是无法同步的死地址,pacman -Syy 必然失败。

3. chsrc reset arch 未实现:

Arch Linux 的 resetfn 未声明,chsrc reset arch 仅提示“暂未对 arch 实现 reset 功能”,无法恢复官方默认源。


方案与实现

1. 换源幂等(仅 x86_64)

os_arch_setsrc 在 x86_64 分支内,换源前先执行 sed -i '/^Server = /d' /etc/pacman.d/mirrorlist 清空所有生效 Server 行(含多次换源累积的旧行),再写入「新源 + 官方源兜底」,保证每次换源后文件状态确定:

  • set arch upstream → 恰好 1 行(官方源,目标即官方时不重复兜底)
  • 其它源 → 恰好 2 行(镜像行 + 官方兜底行,兜底排第二)
  • 幂等仅作用于 x86_64;ARM 分支保持上游原有行为(不清理、仅 prepend),不触及 ARM
  • 仅作用于 /etc/pacman.d/mirrorlist,不影响 pacman.conf 中的 [archlinuxcn]

2. 修正官方源地址

repo.archlinux.org(不存在)→ geo.mirror.pkgbuild.comArch 官方推荐、按地理位置自动选最近镜像)。涉及 def_sources 的 Upstream 项以及 x86 兜底行(新增 OS_Arch_Upstream 宏,两处共用)。

3. 新增 chsrc reset arch

Arch Linux 原先 resetfn=NULL(prepare 宏 gs)。本次改为 gsr 并新增 os_arch_resetsrc (char *option) { os_arch_setsrc (option); },完全按 chsrc 标准 reset 惯例(与 Ubuntu/Fedora/Ruby 等一致)。chsrc reset arch 恢复官方源(geo 一行),复用同一幂等,且不触碰 pacman.conf

4. 贡献登记(doc/50)

  • chef_set_recipe_last_updated → 2026-09-06
  • chef_set_sauciers 2 → 3(新增 @yayoinoyume
  • 并在 chsrc-main.c 注册贡献者信息。

重要注意:幂等仅针对 x86_64 实现,chsrc arch dish 的 ARM 分支目前是「仅 prepend、无清理、无兜底」。


测试验证结果

1. 基本信息类

指令 输出 结论
chsrc --version v0.2.7.1 (2026/09/05)
chsrc ls arch 8 源齐全,upstream = https://geo.mirror.pkgbuild.com
chsrc get arch 打印当前 mirrorlist Server 行
chsrc(无参数) 帮助

2. 换源类

指令 输出 mirrorlist 结果 结论
set arch tuna/ali/tencent/huawei/ustc/bfsu/sjtu-sy sed 清行→写入→pacman -Syyu 失败 恰 2 行(镜像+官方 兜底)
set arch upstream 同上 恰 1 行(仅官方,无重复兜底)
set arch upstream ×3 连续 每次恰 1 行 不累积
set arch https://geo.mirror.pkgbuild.com(自定义=官方) 1 行(相等判定成立)
set arch https://mirror.example.org/archlinux 备份 .bak 生成 2 行
set arch(不带源名) 进入测速 选择了最快镜像站
chsrc reset arch 选中Upstream,备份并恢复 恢复官方默认镜像源
set arch <非法源名> 镜像站 nonexistent123 不存在 + 提示 ls arch,EXIT=4 未改

- x86_64 换源前先清空 /etc/pacman.d/mirrorlist 中所有生效 Server 行(含多次换源累积的旧行)
- 再写入「新源 + 官方源兜底」,保证每次换源后文件状态确定
- 幂等仅作用于 x86_64;ARM 分支保持原有行为(不清理、仅 prepend),不触及 ARM
- 仅作用于 mirrorlist,不影响 pacman.conf 中的 archlinuxcn
- 修正官方源地址:上游写的 repo.archlinux.org 域名不存在(DNS 无法解析,官方 mirrorlist 无此项),修正为 Arch 官方推荐的 geo.mirror.pkgbuild.com(自动按地理位置选最近镜像)
- 按 doc/50 更新 recipe 时间戳(2026-09-06)、登记贡献者 @yayoinoyume(sauciers 2→3)
@github-actions

github-actions Bot commented Sep 6, 2026

Copy link
Copy Markdown

Hi @yayoinoyume

❤️ 感谢你的贡献!我们将在最少半小时,最多5天内阅读此 PR 并回复你

@ccmywish ccmywish added this to the v0.2.8 milestone Sep 7, 2026
@ccmywish ccmywish added 改善加强 改善加强 os_dish os_dish Linux Linux相关 labels Sep 7, 2026
@ccmywish
ccmywish merged commit 8e144ca into RubyMetric:dev Sep 7, 2026
2 checks passed
@ccmywish

ccmywish commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

👍👍👍

待会儿给你设置为这个 recipe 的 chef

Happy changing source~

@yayoinoyume

Copy link
Copy Markdown
Contributor Author

很高兴我的贡献能被合并!谢谢你的鼓励,我一直梦想着这一天!我会为我的代码负责,祝chsrc越来越好!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Linux Linux相关 os_dish os_dish 改善加强 改善加强

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants