install: self-extract deb (ar->data.tar.gz->/) and rpm (rpm2cpio->cpio->/) payload, no format conversion; alien only as last resort

这个提交包含在:
JGZYES
2026-09-03 13:09:41 +08:00
父节点 6b4b37d94a
当前提交 19a8f7ccc9
+10 -6
查看文件
@@ -237,19 +237,23 @@ static int install_path(const char *path, const char *name) {
}
if (has_suffix(bname, ".deb") && os == OS_LINUX) {
/* Debian native dpkg; elsewhere (e.g. CentOS) convert via alien */
/* Self-extract: dpkg native, else pull data.tar.gz via ar and unpack to /,
* else convert via alien. No format-conversion bloat required. */
snprintf(cmd, sizeof(cmd),
"if command -v dpkg >/dev/null 2>&1; then sudo dpkg -i \"%s\"; "
"elif command -v ar >/dev/null 2>&1; then T=$(mktemp -d); "
"(cd \"$T\" && ar p \"%s\" data.tar.gz | tar -xzf -); sudo cp -a \"$T\"/. /; rm -rf \"$T\"; "
"elif command -v alien >/dev/null 2>&1; then sudo alien -i \"%s\"; "
"else echo 'pmm: need alien to install .deb here (sudo apt-get install alien | sudo yum install alien)' 1>&2; exit 1; fi",
path, path);
"else echo 'pmm: need dpkg, ar+tar or alien for .deb' 1>&2; exit 1; fi",
path, path, path);
} else if (has_suffix(bname, ".rpm") && os == OS_LINUX) {
/* RPM-based native rpm; elsewhere (e.g. Debian) convert via alien */
/* Self-extract: rpm native, else rpm2cpio+cpio the payload into /, else alien. */
snprintf(cmd, sizeof(cmd),
"if command -v rpm >/dev/null 2>&1; then sudo rpm -Uvh \"%s\"; "
"elif command -v rpm2cpio >/dev/null 2>&1; then sudo rpm2cpio \"%s\" | (cd / && sudo cpio -idm --quiet); "
"elif command -v alien >/dev/null 2>&1; then sudo alien -i \"%s\"; "
"else echo 'pmm: need alien to install .rpm here (sudo apt-get install alien)' 1>&2; exit 1; fi",
path, path);
"else echo 'pmm: need rpm, rpm2cpio+cpio or alien for .rpm' 1>&2; exit 1; fi",
path, path, path);
} else if (has_suffix(bname, ".apk") && os == OS_LINUX) {
/* Alpine: apk add if available, else extract */
snprintf(cmd, sizeof(cmd),