pacman-debian 7.3.34 → 7.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -0
- package/README_zh-CN.md +11 -0
- package/dist/cli/paclink.js +95 -0
- package/dist/cli/paclink.js.map +1 -1
- package/dist/cli/pacman.d.ts.map +1 -1
- package/dist/cli/pacman.js +54 -7
- package/dist/cli/pacman.js.map +1 -1
- package/dist/cli/pactree.d.ts +3 -0
- package/dist/cli/pactree.d.ts.map +1 -0
- package/dist/cli/pactree.js +216 -0
- package/dist/cli/pactree.js.map +1 -0
- package/dist/core/deps.d.ts +5 -0
- package/dist/core/deps.d.ts.map +1 -1
- package/dist/core/deps.js +85 -19
- package/dist/core/deps.js.map +1 -1
- package/dist/core/logger.d.ts +7 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +93 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/options.d.ts +1 -0
- package/dist/core/options.d.ts.map +1 -1
- package/dist/core/paclinks.d.ts +9 -0
- package/dist/core/paclinks.d.ts.map +1 -0
- package/dist/core/paclinks.js +69 -0
- package/dist/core/paclinks.js.map +1 -0
- package/dist/core/tar.d.ts +2 -1
- package/dist/core/tar.d.ts.map +1 -1
- package/dist/core/tar.js +33 -4
- package/dist/core/tar.js.map +1 -1
- package/dist/core/types.d.ts +12 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/db/dpkg-compat.js +6 -6
- package/dist/db/dpkg-compat.js.map +1 -1
- package/dist/debug-upgrade.d.ts +2 -0
- package/dist/debug-upgrade.d.ts.map +1 -0
- package/dist/debug-upgrade.js +140 -0
- package/dist/debug-upgrade.js.map +1 -0
- package/dist/i18n/en.json +2 -0
- package/dist/i18n/paclink/en.d.ts.map +1 -1
- package/dist/i18n/paclink/en.js +7 -0
- package/dist/i18n/paclink/en.js.map +1 -1
- package/dist/i18n/paclink/zh-CN.d.ts.map +1 -1
- package/dist/i18n/paclink/zh-CN.js +7 -0
- package/dist/i18n/paclink/zh-CN.js.map +1 -1
- package/dist/i18n/zh-CN.json +2 -0
- package/dist/makepkg/build.d.ts.map +1 -1
- package/dist/makepkg/build.js +3 -5
- package/dist/makepkg/build.js.map +1 -1
- package/dist/makepkg/pkgbuild.d.ts +1 -1
- package/dist/makepkg/pkgbuild.d.ts.map +1 -1
- package/dist/makepkg/pkgbuild.js +111 -59
- package/dist/makepkg/pkgbuild.js.map +1 -1
- package/dist/ops/install.d.ts +2 -1
- package/dist/ops/install.d.ts.map +1 -1
- package/dist/ops/install.js +88 -35
- package/dist/ops/install.js.map +1 -1
- package/dist/ops/query.d.ts.map +1 -1
- package/dist/ops/query.js +59 -33
- package/dist/ops/query.js.map +1 -1
- package/dist/ops/upgrade.d.ts.map +1 -1
- package/dist/ops/upgrade.js +69 -12
- package/dist/ops/upgrade.js.map +1 -1
- package/dist/repo/config.d.ts.map +1 -1
- package/dist/repo/config.js +35 -4
- package/dist/repo/config.js.map +1 -1
- package/dist/repo/repository.d.ts.map +1 -1
- package/dist/repo/repository.js +167 -43
- package/dist/repo/repository.js.map +1 -1
- package/dist/scripts/setup.js +2 -1
- package/dist/scripts/setup.js.map +1 -1
- package/docs/en/architecture.md +109 -45
- package/docs/en/pactree.md +42 -0
- package/docs/en/yay-aur.md +10 -6
- package/docs/zh-CN/pactree.md +41 -0
- package/lib/pac4deb/src/libalpm.c +40 -33
- package/lib/pac4deb/src/stubs_manual.c +11 -1
- package/package.json +3 -2
- package/resources/pacman.conf.template +16 -2
package/dist/makepkg/pkgbuild.js
CHANGED
|
@@ -39,76 +39,128 @@ exports.printSrcinfo = printSrcinfo;
|
|
|
39
39
|
const node_child_process_1 = require("node:child_process");
|
|
40
40
|
const fs = __importStar(require("node:fs"));
|
|
41
41
|
const path = __importStar(require("node:path"));
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Source the PKGBUILD ONCE in a single bash invocation and extract all
|
|
44
|
+
* variables + functions. Previously each variable/function required a
|
|
45
|
+
* separate execSync (≈35 forks), which was very slow on low-end ARM boards.
|
|
46
|
+
*/
|
|
47
|
+
function bashParsePkgbuild(absPath) {
|
|
48
|
+
const script = [
|
|
49
|
+
`source "${absPath}" 2>/dev/null`,
|
|
50
|
+
'echo "S pkgbase=${pkgbase-unset}"',
|
|
51
|
+
'echo "S pkgname=${pkgname-unset}"',
|
|
52
|
+
'echo "S pkgver=${pkgver-unset}"',
|
|
53
|
+
'echo "S pkgrel=${pkgrel-unset}"',
|
|
54
|
+
'echo "S epoch=${epoch-unset}"',
|
|
55
|
+
'echo "S pkgdesc=${pkgdesc-unset}"',
|
|
56
|
+
'echo "S url=${url-unset}"',
|
|
57
|
+
'echo "S install=${install-unset}"',
|
|
58
|
+
'for i in "${arch[@]+"${arch[@]}"}"; do printf "A arch=%s\\n" "$i"; done',
|
|
59
|
+
'for i in "${license[@]+"${license[@]}"}"; do printf "A license=%s\\n" "$i"; done',
|
|
60
|
+
'for i in "${groups[@]+"${groups[@]}"}"; do printf "A groups=%s\\n" "$i"; done',
|
|
61
|
+
'for i in "${depends[@]+"${depends[@]}"}"; do printf "A depends=%s\\n" "$i"; done',
|
|
62
|
+
'for i in "${makedepends[@]+"${makedepends[@]}"}"; do printf "A makedepends=%s\\n" "$i"; done',
|
|
63
|
+
'for i in "${optdepends[@]+"${optdepends[@]}"}"; do printf "A optdepends=%s\\n" "$i"; done',
|
|
64
|
+
'for i in "${checkdepends[@]+"${checkdepends[@]}"}"; do printf "A checkdepends=%s\\n" "$i"; done',
|
|
65
|
+
'for i in "${provides[@]+"${provides[@]}"}"; do printf "A provides=%s\\n" "$i"; done',
|
|
66
|
+
'for i in "${conflicts[@]+"${conflicts[@]}"}"; do printf "A conflicts=%s\\n" "$i"; done',
|
|
67
|
+
'for i in "${replaces[@]+"${replaces[@]}"}"; do printf "A replaces=%s\\n" "$i"; done',
|
|
68
|
+
'for i in "${source[@]+"${source[@]}"}"; do printf "A source=%s\\n" "$i"; done',
|
|
69
|
+
'for i in "${noextract[@]+"${noextract[@]}"}"; do printf "A noextract=%s\\n" "$i"; done',
|
|
70
|
+
'for i in "${sha256sums[@]+"${sha256sums[@]}"}"; do printf "A sha256sums=%s\\n" "$i"; done',
|
|
71
|
+
'for i in "${md5sums[@]+"${md5sums[@]}"}"; do printf "A md5sums=%s\\n" "$i"; done',
|
|
72
|
+
'for i in "${validpgpkeys[@]+"${validpgpkeys[@]}"}"; do printf "A validpgpkeys=%s\\n" "$i"; done',
|
|
73
|
+
'for i in "${options[@]+"${options[@]}"}"; do printf "A options=%s\\n" "$i"; done',
|
|
74
|
+
'for i in "${backup[@]+"${backup[@]}"}"; do printf "A backup=%s\\n" "$i"; done',
|
|
75
|
+
'for f in build package prepare check; do',
|
|
76
|
+
' echo "F $f"',
|
|
77
|
+
' declare -f "$f" 2>/dev/null || true',
|
|
78
|
+
' echo "E $f"',
|
|
79
|
+
'done',
|
|
80
|
+
].join('\n');
|
|
81
|
+
const out = (0, node_child_process_1.execSync)('bash -s', { input: script, encoding: 'utf8', timeout: 10000 }).trim();
|
|
82
|
+
const lines = out.split('\n');
|
|
83
|
+
const scalars = {};
|
|
84
|
+
const arrays = {};
|
|
85
|
+
const funcs = {};
|
|
86
|
+
let currentFunc = null;
|
|
87
|
+
let funcBuffer = [];
|
|
88
|
+
for (const line of lines) {
|
|
89
|
+
if (line.startsWith('S ')) {
|
|
90
|
+
const val = line.substring(2);
|
|
91
|
+
const eqIdx = val.indexOf('=');
|
|
92
|
+
if (eqIdx > 0) {
|
|
93
|
+
const value = val.substring(eqIdx + 1);
|
|
94
|
+
if (value !== 'unset')
|
|
95
|
+
scalars[val.substring(0, eqIdx)] = value;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else if (line.startsWith('A ')) {
|
|
99
|
+
const val = line.substring(2);
|
|
100
|
+
const eqIdx = val.indexOf('=');
|
|
101
|
+
if (eqIdx > 0) {
|
|
102
|
+
const key = val.substring(0, eqIdx);
|
|
103
|
+
const value = val.substring(eqIdx + 1);
|
|
104
|
+
(arrays[key] || (arrays[key] = [])).push(value);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else if (line.startsWith('F ')) {
|
|
108
|
+
currentFunc = line.substring(2);
|
|
109
|
+
funcBuffer = [];
|
|
110
|
+
}
|
|
111
|
+
else if (line.startsWith('E ') && currentFunc !== null && line.substring(2) === currentFunc) {
|
|
112
|
+
if (funcBuffer.length > 0)
|
|
113
|
+
funcs[currentFunc] = funcBuffer.join('\n');
|
|
114
|
+
currentFunc = null;
|
|
115
|
+
funcBuffer = [];
|
|
116
|
+
}
|
|
117
|
+
else if (currentFunc !== null) {
|
|
118
|
+
funcBuffer.push(line);
|
|
119
|
+
}
|
|
65
120
|
}
|
|
121
|
+
return { scalars, arrays, funcs };
|
|
66
122
|
}
|
|
67
|
-
function parsePkgbuild(pkgbuildPath,
|
|
123
|
+
function parsePkgbuild(pkgbuildPath, _ignoreArch = false) {
|
|
68
124
|
if (!fs.existsSync(pkgbuildPath))
|
|
69
125
|
throw new Error(`PKGBUILD not found: ${pkgbuildPath}`);
|
|
70
126
|
const absPath = path.resolve(pkgbuildPath);
|
|
71
|
-
const
|
|
72
|
-
const systemArch = process.arch === 'arm64' ? 'aarch64' : process.arch;
|
|
73
|
-
const validArch = ignoreArch || arch.length === 0 || arch.includes('any') || arch.includes(systemArch);
|
|
127
|
+
const { scalars, arrays, funcs } = bashParsePkgbuild(absPath);
|
|
74
128
|
const info = {
|
|
75
|
-
pkgbase:
|
|
76
|
-
pkgname:
|
|
77
|
-
pkgver:
|
|
78
|
-
pkgrel:
|
|
79
|
-
epoch:
|
|
80
|
-
pkgdesc:
|
|
81
|
-
arch,
|
|
82
|
-
url:
|
|
83
|
-
license:
|
|
84
|
-
groups:
|
|
85
|
-
depends:
|
|
86
|
-
makedepends:
|
|
87
|
-
optdepends:
|
|
88
|
-
checkdepends:
|
|
89
|
-
provides:
|
|
90
|
-
conflicts:
|
|
91
|
-
replaces:
|
|
92
|
-
source:
|
|
93
|
-
noextract:
|
|
94
|
-
sha256sums:
|
|
95
|
-
md5sums:
|
|
96
|
-
validpgpkeys:
|
|
97
|
-
install:
|
|
98
|
-
options:
|
|
99
|
-
backup:
|
|
100
|
-
buildFn:
|
|
101
|
-
packageFn:
|
|
102
|
-
prepareFn:
|
|
103
|
-
checkFn:
|
|
104
|
-
validArch,
|
|
129
|
+
pkgbase: scalars['pkgbase'] || undefined,
|
|
130
|
+
pkgname: scalars['pkgname'] || '',
|
|
131
|
+
pkgver: scalars['pkgver'] || '',
|
|
132
|
+
pkgrel: scalars['pkgrel'] || '',
|
|
133
|
+
epoch: scalars['epoch'] || undefined,
|
|
134
|
+
pkgdesc: scalars['pkgdesc'] || '',
|
|
135
|
+
arch: arrays['arch'] || [],
|
|
136
|
+
url: scalars['url'] || undefined,
|
|
137
|
+
license: arrays['license'] || [],
|
|
138
|
+
groups: arrays['groups'] || [],
|
|
139
|
+
depends: arrays['depends'] || [],
|
|
140
|
+
makedepends: arrays['makedepends'] || [],
|
|
141
|
+
optdepends: arrays['optdepends'] || [],
|
|
142
|
+
checkdepends: arrays['checkdepends'] || [],
|
|
143
|
+
provides: arrays['provides'] || [],
|
|
144
|
+
conflicts: arrays['conflicts'] || [],
|
|
145
|
+
replaces: arrays['replaces'] || [],
|
|
146
|
+
source: arrays['source'] || [],
|
|
147
|
+
noextract: arrays['noextract'] || [],
|
|
148
|
+
sha256sums: arrays['sha256sums'] || [],
|
|
149
|
+
md5sums: arrays['md5sums'] || [],
|
|
150
|
+
validpgpkeys: arrays['validpgpkeys'] || [],
|
|
151
|
+
install: scalars['install'] || undefined,
|
|
152
|
+
options: arrays['options'] || [],
|
|
153
|
+
backup: arrays['backup'] || [],
|
|
154
|
+
buildFn: funcs['build'] || '',
|
|
155
|
+
packageFn: funcs['package'] || '',
|
|
156
|
+
prepareFn: funcs['prepare'] || '',
|
|
157
|
+
checkFn: funcs['check'] || '',
|
|
158
|
+
validArch: true,
|
|
105
159
|
};
|
|
106
160
|
if (!info.pkgname)
|
|
107
161
|
throw new Error('PKGBUILD missing pkgname');
|
|
108
162
|
if (!info.pkgver)
|
|
109
163
|
throw new Error('PKGBUILD missing pkgver');
|
|
110
|
-
if (!info.validArch)
|
|
111
|
-
throw new Error(`PKGBUILD does not support architecture: ${systemArch} (${arch.join(', ')})`);
|
|
112
164
|
return info;
|
|
113
165
|
}
|
|
114
166
|
function pkgFilename(info, archOverride) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pkgbuild.js","sourceRoot":"","sources":["../../src/makepkg/pkgbuild.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"pkgbuild.js","sourceRoot":"","sources":["../../src/makepkg/pkgbuild.ts"],"names":[],"mappings":"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"}
|
package/dist/ops/install.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import type { ProgressCallback } from '../core/tar';
|
|
1
2
|
import type { InstallOptions } from '../core/options';
|
|
2
|
-
export declare function installPkgFile(filePath: string, reason: 'explicit' | 'dependency', opts?: InstallOptions): Promise<boolean>;
|
|
3
|
+
export declare function installPkgFile(filePath: string, reason: 'explicit' | 'dependency', opts?: InstallOptions, onProgress?: ProgressCallback): Promise<boolean>;
|
|
3
4
|
export declare function installPkg(target: string, opts?: InstallOptions): Promise<boolean>;
|
|
4
5
|
export declare function installPackages(targets: string[], opts?: InstallOptions): Promise<number>;
|
|
5
6
|
//# sourceMappingURL=install.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/ops/install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/ops/install.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAiBpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAwJtD,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,YAAY,EAAE,IAAI,GAAE,cAAmB,EAAE,UAAU,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAMpK;AA8GD,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAmD5F;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqQnG"}
|
package/dist/ops/install.js
CHANGED
|
@@ -55,13 +55,14 @@ const format_1 = require("../ui/format");
|
|
|
55
55
|
const progress_1 = require("../ui/progress");
|
|
56
56
|
const prompt_1 = require("../ui/prompt");
|
|
57
57
|
const i18n_1 = require("../i18n");
|
|
58
|
-
async function installDeb(filePath, reason, opts = {}) {
|
|
58
|
+
async function installDeb(filePath, reason, opts = {}, onProgress) {
|
|
59
59
|
(0, database_1.initDb)();
|
|
60
60
|
const pkg = (0, deb_1.parseDeb)(filePath);
|
|
61
61
|
const db = (0, database_1.loadDatabase)();
|
|
62
62
|
removeLinkIfPresent(pkg.control.package);
|
|
63
63
|
const { control } = pkg;
|
|
64
64
|
const existing = (0, database_1.getPackage)(db, control.package);
|
|
65
|
+
const _cfg = (0, config_1.loadConfig)();
|
|
65
66
|
if (opts.needed && existing && existing.version === control.version) {
|
|
66
67
|
return false;
|
|
67
68
|
}
|
|
@@ -82,7 +83,7 @@ async function installDeb(filePath, reason, opts = {}) {
|
|
|
82
83
|
(0, database_1.saveScript)(control.package, 'preinst', preinst);
|
|
83
84
|
(0, database_1.runScript)(control.package, 'preinst', ['install']);
|
|
84
85
|
}
|
|
85
|
-
const files = (0, tar_1.extractTar)(pkg.dataTar, '/');
|
|
86
|
+
const files = (0, tar_1.extractTar)(pkg.dataTar, '/', onProgress, _cfg.noExtract, _cfg.noUpgrade);
|
|
86
87
|
if (!opts.noscriptlet) {
|
|
87
88
|
const postinst = (0, deb_1.readScript)(pkg, 'postinst');
|
|
88
89
|
if (postinst)
|
|
@@ -128,7 +129,7 @@ function removeLinkIfPresent(pkgName) {
|
|
|
128
129
|
(0, localdb_1.removePackage)(pkgName, existing.version);
|
|
129
130
|
}
|
|
130
131
|
}
|
|
131
|
-
async function installArch(filePath, reason, opts = {}) {
|
|
132
|
+
async function installArch(filePath, reason, opts = {}, onProgress) {
|
|
132
133
|
(0, database_1.initDb)();
|
|
133
134
|
const data = fs.readFileSync(filePath);
|
|
134
135
|
const { info, install, files: pkgFiles, dataBlocks } = (0, pkgfile_1.parsePkgTarZst)(data);
|
|
@@ -161,15 +162,28 @@ async function installArch(filePath, reason, opts = {}) {
|
|
|
161
162
|
}
|
|
162
163
|
}
|
|
163
164
|
const files = [];
|
|
164
|
-
|
|
165
|
+
const total = dataBlocks.length;
|
|
166
|
+
const _archCfg = (0, config_1.loadConfig)();
|
|
167
|
+
const matchArch = (p, name) => p === name || p === '/' + name || (p.endsWith('/*') && name.startsWith(p.slice(0, -1)));
|
|
168
|
+
for (let i = 0; i < total; i++) {
|
|
169
|
+
const entry = dataBlocks[i];
|
|
165
170
|
const targetPath = path.resolve('/', entry.name);
|
|
166
171
|
if (!targetPath.startsWith('/'))
|
|
167
172
|
continue;
|
|
168
173
|
files.push('/' + entry.name);
|
|
174
|
+
if (_archCfg.noExtract.some(p => matchArch(p, entry.name)))
|
|
175
|
+
continue;
|
|
169
176
|
if (entry.data) {
|
|
170
177
|
fs.mkdirSync(path.dirname(targetPath), { recursive: true });
|
|
171
|
-
|
|
178
|
+
if (_archCfg.noUpgrade.some(p => matchArch(p, entry.name)) && fs.existsSync(targetPath)) {
|
|
179
|
+
const bak = targetPath + '.pacnew';
|
|
180
|
+
fs.writeFileSync(bak, entry.data, { mode: 0o755 });
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
fs.writeFileSync(targetPath, entry.data, { mode: 0o755 });
|
|
184
|
+
}
|
|
172
185
|
}
|
|
186
|
+
onProgress?.(i + 1, total, entry.name);
|
|
173
187
|
}
|
|
174
188
|
if (!opts.noscriptlet && install?.post_install) {
|
|
175
189
|
const tmpScript = `/var/lib/pacman-debian/info/${info.name}/.INSTALL`;
|
|
@@ -212,15 +226,15 @@ async function installArch(filePath, reason, opts = {}) {
|
|
|
212
226
|
(0, database_1.completeTransaction)(tx.id);
|
|
213
227
|
return true;
|
|
214
228
|
}
|
|
215
|
-
async function installPkgFile(filePath, reason, opts = {}) {
|
|
229
|
+
async function installPkgFile(filePath, reason, opts = {}, onProgress) {
|
|
216
230
|
if (opts.print) {
|
|
217
231
|
console.log((0, i18n_1.t)('would_install', path.basename(filePath)));
|
|
218
232
|
return true;
|
|
219
233
|
}
|
|
220
234
|
if (filePath.endsWith('.pkg.tar.zst') || filePath.endsWith('.pkg.tar.xz') || filePath.endsWith('.pkg.tar.gz')) {
|
|
221
|
-
return installArch(filePath, reason, opts);
|
|
235
|
+
return installArch(filePath, reason, opts, onProgress);
|
|
222
236
|
}
|
|
223
|
-
return installDeb(filePath, reason, opts);
|
|
237
|
+
return installDeb(filePath, reason, opts, onProgress);
|
|
224
238
|
}
|
|
225
239
|
function parseFtpUrl(url) {
|
|
226
240
|
const rest = url.slice(6);
|
|
@@ -383,8 +397,11 @@ async function installPkg(target, opts = {}) {
|
|
|
383
397
|
return false;
|
|
384
398
|
}
|
|
385
399
|
const cols = process.stdout.columns || 80;
|
|
386
|
-
const barLen = Math.max(
|
|
387
|
-
const
|
|
400
|
+
const barLen = Math.max(cols - 50, 8);
|
|
401
|
+
const drawBar = (pct) => {
|
|
402
|
+
const filled = Math.round((pct / 100) * barLen);
|
|
403
|
+
return `[${'#'.repeat(filled)}${'-'.repeat(barLen - filled)}] ${String(pct).padStart(3)}%`;
|
|
404
|
+
};
|
|
388
405
|
console.log((0, i18n_1.t)('packages_single', fname) + '\n');
|
|
389
406
|
if (!await (0, prompt_1.confirm)((0, i18n_1.t)('confirm_proceed')))
|
|
390
407
|
return false;
|
|
@@ -392,9 +409,9 @@ async function installPkg(target, opts = {}) {
|
|
|
392
409
|
console.log((0, i18n_1.t)('would_install', fname));
|
|
393
410
|
return true;
|
|
394
411
|
}
|
|
395
|
-
|
|
396
|
-
process.stdout.write((0, i18n_1.t)('progress_installing_single', '1', '1', fname, barDone) + '\n');
|
|
412
|
+
console.log(`(1/1) ${(0, i18n_1.t)('progress_loading_files_msg')} ${drawBar(0)}`);
|
|
397
413
|
const result = await installPkgFile(localPath, 'explicit', opts);
|
|
414
|
+
console.log(`(1/1) installing ${fname} ${drawBar(100)}`);
|
|
398
415
|
if (isUrl)
|
|
399
416
|
try {
|
|
400
417
|
fs.unlinkSync(localPath);
|
|
@@ -460,7 +477,25 @@ async function installPackages(targets, opts = {}) {
|
|
|
460
477
|
}
|
|
461
478
|
const totalSize = allPkgs.reduce((s, p) => s + (p.size || 0), 0);
|
|
462
479
|
const totalInst = allPkgs.reduce((s, p) => s + ((p.installedSize || 0) * 1024), 0);
|
|
463
|
-
|
|
480
|
+
const _cfg = (0, config_1.loadConfig)();
|
|
481
|
+
if (_cfg.verbosePkgLists) {
|
|
482
|
+
const cols = process.stdout.columns || 80;
|
|
483
|
+
const nameW = Math.max(20, Math.floor(cols * 0.3));
|
|
484
|
+
const verW = Math.max(16, Math.floor(cols * 0.2));
|
|
485
|
+
const repoW = Math.max(10, Math.floor(cols * 0.15));
|
|
486
|
+
console.log((0, i18n_1.t)('packages_multi', String(allPkgs.length), ''));
|
|
487
|
+
console.log(` ${'Name'.padEnd(nameW)} ${'Version'.padEnd(verW)} ${'Repo'.padEnd(repoW)} Size`);
|
|
488
|
+
console.log(` ${'─'.repeat(nameW)} ${'─'.repeat(verW)} ${'─'.repeat(repoW)} ${'─'.repeat(8)}`);
|
|
489
|
+
for (const p of allPkgs) {
|
|
490
|
+
const name = p.package.length > nameW ? p.package.slice(0, nameW - 3) + '...' : p.package;
|
|
491
|
+
const ver = (p.version || '').length > verW ? (p.version || '').slice(0, verW - 3) + '...' : (p.version || '');
|
|
492
|
+
console.log(` ${name.padEnd(nameW)} ${ver.padEnd(verW)} ${p.repo.padEnd(repoW)} ${(0, format_1.formatBytes)(p.size || 0).padStart(8)}`);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
else {
|
|
496
|
+
console.log((0, i18n_1.t)('packages_multi', String(allPkgs.length), allPkgs.map(p => p.package).join(' ')));
|
|
497
|
+
}
|
|
498
|
+
console.log('');
|
|
464
499
|
console.log((0, i18n_1.t)('total_download_size', (0, format_1.formatBytes)(totalSize).padStart(9)));
|
|
465
500
|
console.log((0, i18n_1.t)('total_installed_size', (0, format_1.formatBytes)(totalInst).padStart(9)));
|
|
466
501
|
console.log('');
|
|
@@ -471,20 +506,29 @@ async function installPackages(targets, opts = {}) {
|
|
|
471
506
|
console.log((0, i18n_1.t)('would_install', `${p.package}-${p.version}`));
|
|
472
507
|
return allPkgs.length;
|
|
473
508
|
}
|
|
509
|
+
// ---- Transaction start ----
|
|
510
|
+
console.log((0, i18n_1.t)('processing_changes'));
|
|
474
511
|
// ---- Download phase ----
|
|
475
512
|
const total = allPkgs.length;
|
|
476
513
|
const cols = process.stdout.columns || 80;
|
|
477
514
|
const parallelN = (0, config_1.loadConfig)().parallelDownloads || 1;
|
|
478
|
-
console.log((0, i18n_1.t)('
|
|
515
|
+
console.log((0, i18n_1.t)('retrieving_packages'));
|
|
479
516
|
const downloaded = [];
|
|
480
517
|
const startTime = Date.now();
|
|
481
518
|
/** Render a right-aligned progress bar line. leftText precedes `[`, rightText follows `]`. */
|
|
482
519
|
const barLine = (leftText, rightText, pct) => {
|
|
483
520
|
const barLen = Math.max(cols - (0, progress_1.terminalWidth)(leftText) - (0, progress_1.terminalWidth)(rightText), 5);
|
|
484
|
-
|
|
521
|
+
const line = `${leftText}${(0, progress_1.drawProgressBar)(pct, barLen)}${rightText}`;
|
|
522
|
+
if ((0, progress_1.terminalWidth)(line) < cols)
|
|
523
|
+
return line + ' '.repeat(cols - (0, progress_1.terminalWidth)(line));
|
|
524
|
+
return line;
|
|
485
525
|
};
|
|
486
526
|
const nameWidth = Math.max(25, Math.floor(cols * 0.35));
|
|
527
|
+
let dlIdx = 0;
|
|
487
528
|
const downloadOne = async (p) => {
|
|
529
|
+
const idx = ++dlIdx;
|
|
530
|
+
const digits = String(total).length;
|
|
531
|
+
const prefix = `(${String(idx).padStart(digits)}/${String(total).padEnd(digits)})`;
|
|
488
532
|
const pkgLabel = `${p.package}-${p.version}-${p.architecture || 'any'}`;
|
|
489
533
|
const displayName = pkgLabel.length > nameWidth ? pkgLabel.slice(0, nameWidth - 3) + '...' : pkgLabel;
|
|
490
534
|
let finalRate = 0, prevTime = Date.now(), prevBytes = 0, smoothRate = 0;
|
|
@@ -501,12 +545,12 @@ async function installPackages(targets, opts = {}) {
|
|
|
501
545
|
const eta = smoothRate > 0 && tot > 0 ? (tot - rec) / smoothRate : 0;
|
|
502
546
|
const etaS = (0, progress_1.formatETA)(eta);
|
|
503
547
|
const pct = tot > 0 ? Math.round(rec / tot * 100) : 0;
|
|
504
|
-
const line = barLine(
|
|
505
|
-
process.stdout.write(line);
|
|
548
|
+
const line = barLine(` ${prefix} ${displayName.padEnd(nameWidth)} ${dl.val.padStart(6)} ${dl.unit.padEnd(3)} ${rateStr} ${etaS} [`, `] ${String(pct).padStart(3)}%`, pct);
|
|
549
|
+
process.stdout.write(`\r${line}`);
|
|
506
550
|
});
|
|
507
551
|
const finalSize = (0, progress_1.humanSize)(p.size || 0, 1);
|
|
508
|
-
const compLine = barLine(
|
|
509
|
-
process.stdout.write(compLine
|
|
552
|
+
const compLine = barLine(` ${prefix} ${displayName.padEnd(nameWidth)} ${finalSize.val.padStart(6)} ${finalSize.unit.padEnd(3)} ${(0, progress_1.formatRate)(finalRate)} ${'00:00'} [`, `] 100%`, 100);
|
|
553
|
+
process.stdout.write(`\r${compLine}\n`);
|
|
510
554
|
return { pkg: p, path: localPath, rate: finalRate };
|
|
511
555
|
};
|
|
512
556
|
// Parallel download
|
|
@@ -530,7 +574,10 @@ async function installPackages(targets, opts = {}) {
|
|
|
530
574
|
const totalLine = barLine(` ${totalLabel.padEnd(nameWidth)} ${totalSizeStr.val.padStart(6)} ${totalSizeStr.unit.padEnd(3)} ${totalRateStr} ${'00:00'} [`, `] 100%`, 100);
|
|
531
575
|
process.stdout.write(totalLine + '\n');
|
|
532
576
|
// ---- Pre-install checks (after download, matching real pacman order) ----
|
|
533
|
-
const
|
|
577
|
+
const totalChk = downloaded.length;
|
|
578
|
+
const digitsChk = String(totalChk).length;
|
|
579
|
+
let chkIdx = 0;
|
|
580
|
+
const prefixChk = () => `(${String(++chkIdx).padStart(digitsChk)}/${String(totalChk).padEnd(digitsChk)})`;
|
|
534
581
|
const checkMessages = [
|
|
535
582
|
(0, i18n_1.t)('progress_checking_keys_msg'),
|
|
536
583
|
(0, i18n_1.t)('progress_checking_integrity_msg'),
|
|
@@ -538,10 +585,11 @@ async function installPackages(targets, opts = {}) {
|
|
|
538
585
|
(0, i18n_1.t)('progress_checking_conflicts_msg'),
|
|
539
586
|
(0, i18n_1.t)('progress_checking_space_msg'),
|
|
540
587
|
];
|
|
541
|
-
const
|
|
588
|
+
const maxChkMsgTw = Math.max(...checkMessages.map(m => (0, progress_1.terminalWidth)(m)));
|
|
542
589
|
const fmtCheck = (msg) => {
|
|
543
|
-
const
|
|
544
|
-
const
|
|
590
|
+
const p = prefixChk();
|
|
591
|
+
const pad = maxChkMsgTw - (0, progress_1.terminalWidth)(msg);
|
|
592
|
+
const line = barLine(` ${p} ${msg}${' '.repeat(pad)} [`, `] 100%`, 100);
|
|
545
593
|
process.stdout.write(line + '\n');
|
|
546
594
|
};
|
|
547
595
|
// 1. Keys check
|
|
@@ -561,8 +609,9 @@ async function installPackages(targets, opts = {}) {
|
|
|
561
609
|
// 3. Load files — validate package archive format
|
|
562
610
|
for (const { pkg: p, path: fp } of downloaded) {
|
|
563
611
|
try {
|
|
564
|
-
if (fp.endsWith('.deb'))
|
|
565
|
-
(0,
|
|
612
|
+
if (fp.endsWith('.deb')) {
|
|
613
|
+
(0, deb_1.parseDeb)(fp);
|
|
614
|
+
}
|
|
566
615
|
else
|
|
567
616
|
(0, node_child_process_1.execSync)(`tar -t --zstd -f "${fp}" 2>/dev/null | head -1`, { encoding: 'utf8', timeout: 5000 });
|
|
568
617
|
}
|
|
@@ -575,19 +624,23 @@ async function installPackages(targets, opts = {}) {
|
|
|
575
624
|
// 4. File conflict check
|
|
576
625
|
fmtCheck((0, i18n_1.t)('progress_checking_conflicts_msg'));
|
|
577
626
|
// 5. Available space check
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
const
|
|
583
|
-
const
|
|
584
|
-
if (
|
|
585
|
-
|
|
586
|
-
|
|
627
|
+
const cfg = (0, config_1.loadConfig)();
|
|
628
|
+
if (cfg.checkSpace) {
|
|
629
|
+
try {
|
|
630
|
+
const dfPath = cfg.rootDir === '/' ? '/' : cfg.rootDir;
|
|
631
|
+
const df = (0, node_child_process_1.execSync)(`df -k "${dfPath}"`, { encoding: 'utf8', timeout: 5000 });
|
|
632
|
+
const match = df.trim().split('\n').pop()?.match(/\s(\d+)\s+(\d+)\s+(\d+)/);
|
|
633
|
+
if (match) {
|
|
634
|
+
const availKb = parseInt(match[3], 10);
|
|
635
|
+
const needKb = allPkgs.reduce((s, p) => s + ((p.installedSize || 0)), 0);
|
|
636
|
+
if (availKb < needKb) {
|
|
637
|
+
console.error(`\n error: not enough disk space (need ${(needKb / 1024).toFixed(1)} MiB, have ${(availKb / 1024).toFixed(1)} MiB)`);
|
|
638
|
+
return 0;
|
|
639
|
+
}
|
|
587
640
|
}
|
|
588
641
|
}
|
|
642
|
+
catch { }
|
|
589
643
|
}
|
|
590
|
-
catch { }
|
|
591
644
|
fmtCheck((0, i18n_1.t)('progress_checking_space_msg'));
|
|
592
645
|
// Install phase (serial for safety)
|
|
593
646
|
for (const { pkg: p, path: localPath } of downloaded) {
|