- Shell 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| LICENSE | ||
| oru | ||
| README.md | ||
oru
oru 是 My_AUR 个人打包仓库的选择器 + 批量安装器:
一条命令拉起 fzf 界面,从远端 package_list 里挑包(可多选),回车后自动依次 makepkg -si。
一句话:oru = package_list 解析器 + fzf 选择界面 + makepkg 批量执行器。
仓库/项目目录名是
Oru/,可执行文件本身叫小写的oru;脚本用${0##*/}取自身名字, 因此重命名成别的名字时提示信息会跟着变。
安装
单文件脚本、无扩展名、不依赖同目录下的其他文件,直接丢进 PATH 即可:
install -Dm755 oru ~/.local/bin/oru # 或 /usr/local/bin/oru
依赖(Arch Linux):fzf、git、makepkg(base-devel)、pacman;bat 可选,缺失时预览自动降级为 cat。
sudo pacman -S --needed fzf git base-devel bat
用法
oru # 打开 TUI:Tab 多选 / Enter 安装 / Esc 退出
oru fwaifu_alvin # 跳过 TUI 直接安装(可按给定顺序给多个包名)
oru --list # 只打印列表(纯文本、不联网、不进 TUI)
oru --refresh # 只 clone / pull 缓存仓库
oru --no-pull # 与默认流程 / 直接安装组合:跳过 git pull,用本地缓存
oru --clean-cache # 删除缓存仓库(打印路径与占用后确认)
oru --clean-log # 删除日志文件
oru --clean-log --days 30 # 只删 30 天前的日志
oru --clean # 缓存 + 日志一起清
oru --clean --yes # 清理时免确认(非交互式/脚本里必须加)
oru --clean-log --dry-run # 只打印将要删除的内容
oru -h | --help # 完整中文帮助
oru -V | --version # 版本号与仓库地址
TUI 界面
上方是包列表:Tab / Shift-Tab 切换选中,输入即模糊搜索;[已安装](绿)表示 pacman 已装,
[缺目录](红)表示列表里有但缓存仓库里找不到包目录。
下方预览窗格显示所选包的信息面板(pacman -Si 风格)+ 该包的 PKGBUILD 原文:
软件库 : My_AUR
名字 : fwaifu_alvin
版本 : 1.2.1-1
描述 : Terminal anime girl viewer powered by fastfetch and chafa
URL : https://github.com/cublueer/fwaifu
仓库路径 : ~/.cache/oru/My_AUR/fwaifu/PKGBUILD
组 : 无
许可证 : MIT
提供 : 无
依赖于 : fastfetch
生成依赖 : cargo rust git
检查依赖 : 无
可选依赖 : imagemagick chafa
冲突于 : 无
替代 : 无
维护者 : alvin
状态 : 已安装
── PKGBUILD ──
# Maintainer: alvin <starriver_alvin@163.com>
pkgname=fwaifu_alvin
...
字段全部来自 PKGBUILD 的文本解析(绝不 source,多行数组也支持);缺失的字段显示「无」;
可选依赖 只留依赖名、去掉 : 说明(与 pacman 一致,说明本身在下方 PKGBUILD 里);列表版本与
PKGBUILD 不一致时会在 版本 一栏附注 (列表: x.y.z-n);软件库 取自仓库地址末段
(ORU_REPO_URL 换了名字这里会跟着变)。
环境变量与路径
| 用途 | 默认值 | 覆盖变量 |
|---|---|---|
| 仓库地址 | https://git.starriver.cc/alvin/My_AUR |
ORU_REPO_URL |
| 缓存仓库 | ${XDG_CACHE_HOME:-$HOME/.cache}/oru/My_AUR |
ORU_CACHE_DIR |
| 日志目录 | ${XDG_STATE_HOME:-$HOME/.local/state}/oru/log |
ORU_LOG_DIR |
| 缓存锁文件 | 缓存仓库同级目录下的 .oru.lock |
ORU_LOCK_FILE |
| 彩色开关 | 非 tty 自动关闭 | NO_COLOR |
ORU_REPO_URL 可以指向任何公开可读的 git 仓库,也可以指向本地路径,便于离线验证:
ORU_REPO_URL=/path/to/local/My_AUR ORU_CACHE_DIR=/tmp/oru-cache oru --list
退出码
| 码 | 含义 |
|---|---|
0 |
全部成功(清理模式:已清理或本来就没有可清理的) |
1 |
运行中出错(网络、分叉、缺目录、列表为空…),或至少一个包安装失败 |
2 |
命令行参数用法错误 |
130 |
用户取消(TUI 里 Esc / Ctrl-C、安装过程中 Ctrl-C,或清理时拒绝确认) |
清理缓存与日志
oru --clean-cache # 只删缓存仓库
oru --clean-log # 只删日志(默认全部)
oru --clean-log --days 30 # 只删 30 天前的日志
oru --clean # 两者都清
- 删除前会打印将删除的路径与占用大小,并在交互式终端里问一次
[y/N];回答n视为取消,退出码130。 --yes(-y)免确认;非交互式环境(管道/脚本)不给--yes会直接拒绝删除并退出1。--dry-run只打印将要删除的内容,不真删。- 缓存删除会先拿
flock,不会和正在跑的oru抢仓库;只删自己算出来的缓存路径,/、$HOME等危险路径直接拒绝。 - 清理模式不写日志(否则会边写边删),也不需要
fzf/git。
日志
每次运行写一个日志文件 $ORU_LOG_DIR/<YYYYmmdd-HHMMSS>.log,内容包括:时间戳、完整命令行、
仓库地址与 git pull 前后 commit、每个包的实际目录、makepkg 的完整 stdout/stderr、
每个包的退出码与最终汇总。构建输出同时出现在终端和日志里(tee 式),不会因为写日志而看不到进度。
日志不做自动清理(oru --clean-log 手动清);同秒内的两次运行会追加到同一个文件。
工作方式与边界
- 解析:跳过
//、#注释与空行;有效行为包名 版本-rel - 维护者。格式异常的行只跳过并在 stderr 警告,不会让整次运行失败;展示与安装顺序统一按包名字典序(LC_ALL=C),稳定可复现。 - 目录映射:列表名未必等于目录名(例:列表/
pkgname是fwaifu_alvin,目录是fwaifu)。先找同名目录,找不到就扫描各目录PKGBUILD的pkgname(只做文本解析,绝不 source),仍找不到则标[缺目录],选中时明确报错并计入失败。 - 已安装标记:一次
pacman -Qq批量查询,同时按条目名、包目录名、目录内pkgname三者判定;已安装的包仍可选中重装(默认不预选)。 - 版本口径:列表版本只用于展示,实际安装版本以
PKGBUILD为准;两者不一致时打印一行提示,不打断流程。 - 构建:按顺序逐个
cd到包目录执行makepkg -si(不加--noconfirm,保留 pacman 的交互确认);单个包失败不中断后续包,最后打印成功 X / 失败 Y / 跳过 Z与日志路径。 - 缓存仓库:
clone/pull全程flock串行化;pull只用--ff-only,遇到本地改动或分叉时给出路径后退出,绝不reset --hard;缓存目录不是合法 git 仓库时先打印将删除的路径再重建。
不做的事:不解析依赖树、不处理 AUR 依赖(失败时提示用 paru 自行解决)、不做版本升级、不卸载、
不清理缓存包与构建产物、不做 GUI 与多仓库管理、不 source 远端仓库里的任何文件。