pacman-debian 7.4.0 → 7.5.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/dist/cli/archlinux-java.js +36 -12
- package/dist/cli/archlinux-java.js.map +1 -1
- package/dist/cli/paclink.js +17 -28
- package/dist/cli/paclink.js.map +1 -1
- package/dist/cli/pacman.d.ts.map +1 -1
- package/dist/cli/pacman.js +18 -10
- package/dist/cli/pacman.js.map +1 -1
- package/dist/core/deps.d.ts +2 -0
- package/dist/core/deps.d.ts.map +1 -1
- package/dist/core/deps.js +19 -5
- package/dist/core/deps.js.map +1 -1
- package/dist/core/options.d.ts +1 -0
- package/dist/core/options.d.ts.map +1 -1
- package/dist/core/pkgfile.d.ts +2 -0
- package/dist/core/pkgfile.d.ts.map +1 -1
- package/dist/core/pkgfile.js +6 -0
- package/dist/core/pkgfile.js.map +1 -1
- package/dist/core/tar.d.ts +1 -0
- package/dist/core/tar.d.ts.map +1 -1
- package/dist/core/tar.js +54 -7
- package/dist/core/tar.js.map +1 -1
- package/dist/core/types.d.ts +5 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/db/dpkg-compat.d.ts +5 -2
- package/dist/db/dpkg-compat.d.ts.map +1 -1
- package/dist/db/dpkg-compat.js +124 -51
- package/dist/db/dpkg-compat.js.map +1 -1
- package/dist/db/localdb.d.ts.map +1 -1
- package/dist/db/localdb.js +21 -2
- package/dist/db/localdb.js.map +1 -1
- package/dist/lock/dpkg-helper +0 -0
- package/dist/lock/dpkg-lock.d.ts +5 -0
- package/dist/lock/dpkg-lock.d.ts.map +1 -0
- package/dist/lock/dpkg-lock.js +113 -0
- package/dist/lock/dpkg-lock.js.map +1 -0
- package/dist/ops/install.d.ts.map +1 -1
- package/dist/ops/install.js +227 -144
- package/dist/ops/install.js.map +1 -1
- package/dist/ops/query.js +3 -2
- package/dist/ops/query.js.map +1 -1
- package/dist/ops/remove.d.ts.map +1 -1
- package/dist/ops/remove.js +106 -60
- package/dist/ops/remove.js.map +1 -1
- package/dist/ops/upgrade.d.ts.map +1 -1
- package/dist/ops/upgrade.js +6 -5
- package/dist/ops/upgrade.js.map +1 -1
- package/dist/repo/config.d.ts.map +1 -1
- package/dist/repo/config.js +26 -3
- package/dist/repo/config.js.map +1 -1
- package/dist/repo/repository.d.ts +6 -0
- package/dist/repo/repository.d.ts.map +1 -1
- package/dist/repo/repository.js +199 -24
- package/dist/repo/repository.js.map +1 -1
- package/dist/scripts/setup.js +25 -76
- package/dist/scripts/setup.js.map +1 -1
- package/lib/pac4deb/include/alpm.h +2 -1
- package/lib/pac4deb/src/libalpm.c +76 -21
- package/package.json +2 -2
- package/resources/paclinks.conf +64 -0
package/dist/repo/config.js
CHANGED
|
@@ -38,6 +38,7 @@ const fs = __importStar(require("node:fs"));
|
|
|
38
38
|
const path = __importStar(require("node:path"));
|
|
39
39
|
const CONFIG_PATHS = ['/etc/pacman-debian/pacman.conf', '/etc/pacman/pacman.conf', '/etc/pacman.conf'];
|
|
40
40
|
const INCLUDE_DIR = '/etc/pacman-debian';
|
|
41
|
+
const ADVANCED_CONFIG = '/etc/pacman-debian/pacman-advanced.conf';
|
|
41
42
|
function findConfig() {
|
|
42
43
|
for (const p of CONFIG_PATHS) {
|
|
43
44
|
if (fs.existsSync(p))
|
|
@@ -89,12 +90,12 @@ function loadConfig() {
|
|
|
89
90
|
checkSpace: false, ignorePkg: [], ignoreGroup: [], noUpgrade: [], noExtract: [],
|
|
90
91
|
verbosePkgLists: false, cleanMethod: 'KeepInstalled',
|
|
91
92
|
dbPath: '/var/lib/pacman-debian', cacheDir: '/var/cache/pacman-debian',
|
|
92
|
-
logFile: '', rootDir: '/', repos: [],
|
|
93
|
+
logFile: '', rootDir: '/', repos: [], notFindDepsFromCurrentRepo: false,
|
|
93
94
|
};
|
|
94
95
|
const configPath = findConfig();
|
|
95
96
|
if (!fs.existsSync(configPath)) {
|
|
96
97
|
cfg.repos.push({ name: 'ubuntu', type: 'debian', server: 'http://ports.ubuntu.com/ubuntu-ports', dist: 'noble', components: ['main', 'universe'] });
|
|
97
|
-
return cfg;
|
|
98
|
+
return applyAdvancedConfig(cfg);
|
|
98
99
|
}
|
|
99
100
|
const content = fs.readFileSync(configPath, 'utf8');
|
|
100
101
|
let cur = null;
|
|
@@ -125,12 +126,14 @@ function loadConfig() {
|
|
|
125
126
|
const flag = t.trim().toLowerCase();
|
|
126
127
|
if (flag === 'color' && (inOptions || !cur))
|
|
127
128
|
cfg.color = true;
|
|
129
|
+
else if (flag === 'verbosepkglists' && (inOptions || !cur))
|
|
130
|
+
cfg.verbosePkgLists = true;
|
|
128
131
|
continue;
|
|
129
132
|
}
|
|
130
133
|
const [k, v] = kv;
|
|
131
134
|
if (inOptions || !cur) {
|
|
132
135
|
if (k === 'architecture')
|
|
133
|
-
cfg.architecture = v;
|
|
136
|
+
cfg.architecture = v === 'auto' ? nativeArch : v;
|
|
134
137
|
else if (k === 'paralleldownloads') {
|
|
135
138
|
const n = parseInt(v, 10);
|
|
136
139
|
if (!isNaN(n) && n > 0)
|
|
@@ -177,6 +180,26 @@ function loadConfig() {
|
|
|
177
180
|
cur.type = 'debian';
|
|
178
181
|
cfg.repos.push(cur);
|
|
179
182
|
}
|
|
183
|
+
return applyAdvancedConfig(cfg);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Parse pacman-debian-only options from the optional advanced config.
|
|
187
|
+
* The option is presence-based: a bare name means true, while an explicit
|
|
188
|
+
* false value disables it. No template is created for this file.
|
|
189
|
+
*/
|
|
190
|
+
function applyAdvancedConfig(cfg) {
|
|
191
|
+
if (!fs.existsSync(ADVANCED_CONFIG))
|
|
192
|
+
return cfg;
|
|
193
|
+
for (const line of fs.readFileSync(ADVANCED_CONFIG, 'utf8').split('\n')) {
|
|
194
|
+
const text = line.replace(/#.*/, '').trim();
|
|
195
|
+
if (!text)
|
|
196
|
+
continue;
|
|
197
|
+
const match = text.match(/^([^=\s]+)(?:\s*=\s*(.*))?$/);
|
|
198
|
+
if (!match || match[1].toLowerCase() !== 'notfinddepsfromcurrentrepo')
|
|
199
|
+
continue;
|
|
200
|
+
const value = match[2]?.trim().toLowerCase();
|
|
201
|
+
cfg.notFindDepsFromCurrentRepo = value === undefined || !['false', 'no', '0', 'off'].includes(value);
|
|
202
|
+
}
|
|
180
203
|
return cfg;
|
|
181
204
|
}
|
|
182
205
|
//# sourceMappingURL=config.js.map
|
package/dist/repo/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/repo/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/repo/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,10 +10,16 @@ export declare function readPkgAt(pkgDir: string, chunkFile: string, byteOff: nu
|
|
|
10
10
|
export declare function batchFindInRepo(names: string[]): Map<string, RepoPkg>;
|
|
11
11
|
/** Look up a package by its Provides: virtual name via inverted index */
|
|
12
12
|
export declare function findProvides(name: string): RepoPkg | undefined;
|
|
13
|
+
/** Look up a virtual provider in one repository only. */
|
|
14
|
+
export declare function findProvidesScoped(repoName: string, name: string): RepoPkg | undefined;
|
|
13
15
|
export declare function getRepoCache(): RepoPkg[];
|
|
14
16
|
export declare function invalidateCache(): void;
|
|
15
17
|
export declare function searchRepo(query: string): RepoPkg[];
|
|
16
18
|
export declare function findInRepo(pkgName: string): RepoPkg | undefined;
|
|
19
|
+
/** Search only in a specific repo by name (e.g. "extra", "trixie"). */
|
|
20
|
+
export declare function findInRepoScoped(repoName: string, pkgName: string): RepoPkg | undefined;
|
|
21
|
+
/** Find an exact package version, respecting repository order or a scope. */
|
|
22
|
+
export declare function findInRepoVersioned(pkgName: string, version: string, repoName?: string): RepoPkg | undefined;
|
|
17
23
|
/** Resolve the download URL for a package. */
|
|
18
24
|
export declare function getPkgUrl(rp: RepoPkg): string;
|
|
19
25
|
export declare function downloadPkg(rp: RepoPkg, dest?: string, onProgress?: (rec: number, tot: number) => void): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/repo/repository.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/repo/repository.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,OAAO,EAAc,MAAM,eAAe,CAAC;AAuDzD,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC;AAsYD,wBAAsB,SAAS,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAyIrE;AAED,2DAA2D;AAC3D,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAQjG;AAuBD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAmErE;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAe9D;AAED,yDAAyD;AACzD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CActF;AAKD,wBAAgB,YAAY,IAAI,OAAO,EAAE,CA+BxC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAGtC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CA8BnD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CA+B/D;AAED,uEAAuE;AACvE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CA4BvF;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAoB5G;AAED,8CAA8C;AAC9C,wBAAgB,SAAS,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,CAW7C;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CA+B9H"}
|
package/dist/repo/repository.js
CHANGED
|
@@ -38,16 +38,20 @@ exports.syncRepos = syncRepos;
|
|
|
38
38
|
exports.readPkgAt = readPkgAt;
|
|
39
39
|
exports.batchFindInRepo = batchFindInRepo;
|
|
40
40
|
exports.findProvides = findProvides;
|
|
41
|
+
exports.findProvidesScoped = findProvidesScoped;
|
|
41
42
|
exports.getRepoCache = getRepoCache;
|
|
42
43
|
exports.invalidateCache = invalidateCache;
|
|
43
44
|
exports.searchRepo = searchRepo;
|
|
44
45
|
exports.findInRepo = findInRepo;
|
|
46
|
+
exports.findInRepoScoped = findInRepoScoped;
|
|
47
|
+
exports.findInRepoVersioned = findInRepoVersioned;
|
|
45
48
|
exports.getPkgUrl = getPkgUrl;
|
|
46
49
|
exports.downloadPkg = downloadPkg;
|
|
47
50
|
const fs = __importStar(require("node:fs"));
|
|
48
51
|
const path = __importStar(require("node:path"));
|
|
49
52
|
const https = __importStar(require("node:https"));
|
|
50
53
|
const http = __importStar(require("node:http"));
|
|
54
|
+
const crypto = __importStar(require("node:crypto"));
|
|
51
55
|
const node_child_process_1 = require("node:child_process");
|
|
52
56
|
const config_1 = require("./config");
|
|
53
57
|
const control_1 = require("../core/control");
|
|
@@ -61,6 +65,36 @@ const logger_1 = require("../core/logger");
|
|
|
61
65
|
const CACHE_DIR = '/var/cache/pacman-debian';
|
|
62
66
|
const PKG_CACHE = path.join(CACHE_DIR, 'packages');
|
|
63
67
|
const DEB_CACHE = path.join(CACHE_DIR, 'pkg');
|
|
68
|
+
const activePartials = new Set();
|
|
69
|
+
let partialCleanupInstalled = false;
|
|
70
|
+
function installPartialCleanup() {
|
|
71
|
+
if (partialCleanupInstalled)
|
|
72
|
+
return;
|
|
73
|
+
partialCleanupInstalled = true;
|
|
74
|
+
process.once('SIGINT', () => {
|
|
75
|
+
for (const file of activePartials) {
|
|
76
|
+
try {
|
|
77
|
+
fs.unlinkSync(file);
|
|
78
|
+
}
|
|
79
|
+
catch { }
|
|
80
|
+
}
|
|
81
|
+
process.exit(130);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
async function atomicWrite(filePath, content) {
|
|
85
|
+
const tmp = `${filePath}.tmp-${process.pid}`;
|
|
86
|
+
try {
|
|
87
|
+
await fs.promises.writeFile(tmp, content, 'utf8');
|
|
88
|
+
await fs.promises.rename(tmp, filePath);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
try {
|
|
92
|
+
await fs.promises.unlink(tmp);
|
|
93
|
+
}
|
|
94
|
+
catch { }
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
64
98
|
/* ---- Shared keep-alive HTTP agents ---- */
|
|
65
99
|
const httpAgent = new http.Agent({ keepAlive: true, maxSockets: 8 });
|
|
66
100
|
const httpsAgent = new https.Agent({ keepAlive: true, maxSockets: 8 });
|
|
@@ -90,7 +124,9 @@ function parseIdxLine(line) {
|
|
|
90
124
|
const beforeProv = thirdLastTab >= 0 ? rest.slice(0, thirdLastTab) : rest;
|
|
91
125
|
const firstSpace = beforeProv.indexOf(' ');
|
|
92
126
|
const pkgName = beforeProv.slice(0, firstSpace);
|
|
93
|
-
const
|
|
127
|
+
const versionText = firstSpace >= 0 ? beforeProv.slice(firstSpace + 1) : '';
|
|
128
|
+
const firstTab = versionText.indexOf('\t');
|
|
129
|
+
const version = (firstTab >= 0 ? versionText.slice(0, firstTab) : versionText).trim();
|
|
94
130
|
return { pkgName, version, provides, chunkFile, offset };
|
|
95
131
|
}
|
|
96
132
|
function getIdx(repoName) {
|
|
@@ -240,7 +276,12 @@ function parseReleaseSha256(text) {
|
|
|
240
276
|
}
|
|
241
277
|
return map;
|
|
242
278
|
}
|
|
279
|
+
function debArch(arch) {
|
|
280
|
+
const map = { aarch64: 'arm64', x86_64: 'amd64', x64: 'amd64', i686: 'i386' };
|
|
281
|
+
return map[arch] || arch;
|
|
282
|
+
}
|
|
243
283
|
async function syncDebian(repo, arch, ifModifiedSince, onProgress) {
|
|
284
|
+
arch = debArch(arch);
|
|
244
285
|
const comps = repo.components || ['main'];
|
|
245
286
|
const pkgDir = path.join(PKG_CACHE, repo.name);
|
|
246
287
|
let info = {};
|
|
@@ -257,12 +298,17 @@ async function syncDebian(repo, arch, ifModifiedSince, onProgress) {
|
|
|
257
298
|
// Download Release file first (like apt does)
|
|
258
299
|
const releaseBase = `${repo.server}/dists/${repo.dist}`;
|
|
259
300
|
let releaseText = null;
|
|
301
|
+
let releaseSize = 0;
|
|
260
302
|
for (const rfile of ['InRelease', 'Release']) {
|
|
261
303
|
try {
|
|
262
|
-
const releaseBuf = await downloadFile(`${releaseBase}/${rfile}`,
|
|
304
|
+
const releaseBuf = await downloadFile(`${releaseBase}/${rfile}`, (rec, tot) => {
|
|
305
|
+
if (onProgress)
|
|
306
|
+
onProgress(rec, tot);
|
|
307
|
+
}, ifModifiedSince);
|
|
263
308
|
if (releaseBuf === null)
|
|
264
|
-
return { pkgs: [], size: 0, notModified: true };
|
|
309
|
+
return { pkgs: [], size: 0, notModified: true };
|
|
265
310
|
releaseText = releaseBuf.toString('utf8');
|
|
311
|
+
releaseSize = releaseBuf.length;
|
|
266
312
|
break;
|
|
267
313
|
}
|
|
268
314
|
catch { }
|
|
@@ -271,7 +317,7 @@ async function syncDebian(repo, arch, ifModifiedSince, onProgress) {
|
|
|
271
317
|
return { pkgs: [], size: 0, notModified: true };
|
|
272
318
|
const sha256Map = parseReleaseSha256(releaseText);
|
|
273
319
|
const all = [];
|
|
274
|
-
let totalSize =
|
|
320
|
+
let totalSize = releaseSize;
|
|
275
321
|
let anyData = false;
|
|
276
322
|
const newSha256 = {};
|
|
277
323
|
for (const comp of comps) {
|
|
@@ -304,15 +350,29 @@ async function syncDebian(repo, arch, ifModifiedSince, onProgress) {
|
|
|
304
350
|
}
|
|
305
351
|
ifModifiedSince = undefined;
|
|
306
352
|
}
|
|
307
|
-
// Save SHA256 info
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
353
|
+
// Save SHA256 info only if anything was downloaded
|
|
354
|
+
if (anyData) {
|
|
355
|
+
info.sha256 = newSha256;
|
|
356
|
+
info.total = all.length;
|
|
357
|
+
try {
|
|
358
|
+
fs.mkdirSync(pkgDir, { recursive: true });
|
|
359
|
+
fs.writeFileSync(infoFile, JSON.stringify(info));
|
|
360
|
+
}
|
|
361
|
+
catch { }
|
|
313
362
|
}
|
|
314
|
-
|
|
315
|
-
|
|
363
|
+
// If idx is empty but Release was fresh → force re-download next time
|
|
364
|
+
if (!anyData && all.length === 0) {
|
|
365
|
+
const idxPath = path.join(pkgDir, 'packages.idx');
|
|
366
|
+
if (!fs.existsSync(idxPath) || fs.statSync(idxPath).size < 10) {
|
|
367
|
+
// Clear cached SHA256 so next sync forces Packages download
|
|
368
|
+
delete info.sha256;
|
|
369
|
+
try {
|
|
370
|
+
fs.writeFileSync(infoFile, JSON.stringify(info));
|
|
371
|
+
}
|
|
372
|
+
catch { }
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
return { pkgs: all, size: totalSize, notModified: !anyData };
|
|
316
376
|
}
|
|
317
377
|
function parseArchDb(dbTar, repo) {
|
|
318
378
|
const pkgs = [];
|
|
@@ -567,7 +627,7 @@ async function syncRepos(force = false) {
|
|
|
567
627
|
const chunk = pkgs.slice(c * CHUNK, (c + 1) * CHUNK);
|
|
568
628
|
const lines = chunk.map(p => JSON.stringify(p)).join('\n');
|
|
569
629
|
const fname = `${String(c).padStart(5, '0')}.jsonl`;
|
|
570
|
-
writeTasks.push(
|
|
630
|
+
writeTasks.push(atomicWrite(path.join(pkgDir, fname), lines + '\n'));
|
|
571
631
|
// Build index with byte offsets (computed from previous chunk lengths)
|
|
572
632
|
let offset = 0;
|
|
573
633
|
for (let pi = 0; pi < chunk.length; pi++) {
|
|
@@ -581,14 +641,14 @@ async function syncRepos(force = false) {
|
|
|
581
641
|
}
|
|
582
642
|
}
|
|
583
643
|
await Promise.all(writeTasks);
|
|
584
|
-
await
|
|
644
|
+
await atomicWrite(path.join(pkgDir, '.info'), JSON.stringify({ total: pkgs.length, chunks, chunkSize: CHUNK }));
|
|
585
645
|
// Remove legacy all.json
|
|
586
646
|
try {
|
|
587
647
|
fs.unlinkSync(path.join(pkgDir, 'all.json'));
|
|
588
648
|
}
|
|
589
649
|
catch { }
|
|
590
650
|
idxLines.sort(); // global sort so binary search works
|
|
591
|
-
await
|
|
651
|
+
await atomicWrite(path.join(pkgDir, 'packages.idx'), idxLines.join('\n') + '\n');
|
|
592
652
|
// Final line
|
|
593
653
|
const elapsed = (Date.now() - startTime) / 1000;
|
|
594
654
|
const totalSec = Math.round(elapsed);
|
|
@@ -743,6 +803,26 @@ function findProvides(name) {
|
|
|
743
803
|
}
|
|
744
804
|
return undefined;
|
|
745
805
|
}
|
|
806
|
+
/** Look up a virtual provider in one repository only. */
|
|
807
|
+
function findProvidesScoped(repoName, name) {
|
|
808
|
+
const cfg = (0, config_1.loadConfig)();
|
|
809
|
+
const repo = cfg.repos.find(r => r.name === repoName);
|
|
810
|
+
if (!repo)
|
|
811
|
+
return undefined;
|
|
812
|
+
const idxEntry = getIdx(repo.name);
|
|
813
|
+
if (!idxEntry)
|
|
814
|
+
return undefined;
|
|
815
|
+
const entries = idxEntry.providesIndex.get(name);
|
|
816
|
+
if (!entries)
|
|
817
|
+
return undefined;
|
|
818
|
+
const pkgDir = path.join(PKG_CACHE, repo.name);
|
|
819
|
+
for (const e of entries) {
|
|
820
|
+
const p = readPkgAt(pkgDir, e.chunkFile, e.offset);
|
|
821
|
+
if (p)
|
|
822
|
+
return p;
|
|
823
|
+
}
|
|
824
|
+
return undefined;
|
|
825
|
+
}
|
|
746
826
|
// ---- Cache ----
|
|
747
827
|
let _cache = null;
|
|
748
828
|
function getRepoCache() {
|
|
@@ -783,7 +863,8 @@ function invalidateCache() {
|
|
|
783
863
|
invalidateIdxCache();
|
|
784
864
|
}
|
|
785
865
|
function searchRepo(query) {
|
|
786
|
-
const
|
|
866
|
+
const sl = query.indexOf('/');
|
|
867
|
+
const lq = (sl > 0 ? query.slice(sl + 1) : query).toLowerCase();
|
|
787
868
|
const results = [];
|
|
788
869
|
const cfg = (0, config_1.loadConfig)();
|
|
789
870
|
const seen = new Set();
|
|
@@ -815,6 +896,9 @@ function searchRepo(query) {
|
|
|
815
896
|
return results;
|
|
816
897
|
}
|
|
817
898
|
function findInRepo(pkgName) {
|
|
899
|
+
const sl = pkgName.indexOf('/');
|
|
900
|
+
if (sl > 0)
|
|
901
|
+
return findInRepoScoped(pkgName.slice(0, sl), pkgName.slice(sl + 1));
|
|
818
902
|
const cfg = (0, config_1.loadConfig)();
|
|
819
903
|
for (const repo of cfg.repos) {
|
|
820
904
|
const idxEntry = getIdx(repo.name);
|
|
@@ -848,6 +932,68 @@ function findInRepo(pkgName) {
|
|
|
848
932
|
}
|
|
849
933
|
return undefined;
|
|
850
934
|
}
|
|
935
|
+
/** Search only in a specific repo by name (e.g. "extra", "trixie"). */
|
|
936
|
+
function findInRepoScoped(repoName, pkgName) {
|
|
937
|
+
const cfg = (0, config_1.loadConfig)();
|
|
938
|
+
const repo = cfg.repos.find(r => r.name === repoName);
|
|
939
|
+
if (!repo)
|
|
940
|
+
return undefined;
|
|
941
|
+
const idxEntry = getIdx(repo.name);
|
|
942
|
+
if (!idxEntry)
|
|
943
|
+
return undefined;
|
|
944
|
+
const { lines } = idxEntry;
|
|
945
|
+
const pkgDir = path.join(PKG_CACHE, repo.name);
|
|
946
|
+
let lo = 0, hi = lines.length - 1;
|
|
947
|
+
while (lo <= hi) {
|
|
948
|
+
const mid = (lo + hi) >>> 1;
|
|
949
|
+
const line = lines[mid];
|
|
950
|
+
const pname = line.slice(0, line.indexOf(' '));
|
|
951
|
+
if (pkgName < pname)
|
|
952
|
+
hi = mid - 1;
|
|
953
|
+
else if (pkgName > pname)
|
|
954
|
+
lo = mid + 1;
|
|
955
|
+
else {
|
|
956
|
+
const info = parseIdxLine(line);
|
|
957
|
+
if (!info)
|
|
958
|
+
return undefined;
|
|
959
|
+
const cacheKey = `${info.chunkFile}:${info.offset}`;
|
|
960
|
+
let p = _pkgCache.get(cacheKey);
|
|
961
|
+
if (!p) {
|
|
962
|
+
p = readPkgAt(pkgDir, info.chunkFile, info.offset);
|
|
963
|
+
if (p)
|
|
964
|
+
_pkgCache.set(cacheKey, p);
|
|
965
|
+
}
|
|
966
|
+
return p;
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
return undefined;
|
|
970
|
+
}
|
|
971
|
+
/** Find an exact package version, respecting repository order or a scope. */
|
|
972
|
+
function findInRepoVersioned(pkgName, version, repoName) {
|
|
973
|
+
const cfg = (0, config_1.loadConfig)();
|
|
974
|
+
const repos = repoName ? cfg.repos.filter(r => r.name === repoName) : cfg.repos;
|
|
975
|
+
for (const repo of repos) {
|
|
976
|
+
const idxEntry = getIdx(repo.name);
|
|
977
|
+
if (!idxEntry)
|
|
978
|
+
continue;
|
|
979
|
+
const pkgDir = path.join(PKG_CACHE, repo.name);
|
|
980
|
+
for (const line of idxEntry.lines) {
|
|
981
|
+
const info = parseIdxLine(line);
|
|
982
|
+
if (!info || info.pkgName !== pkgName)
|
|
983
|
+
continue;
|
|
984
|
+
const cacheKey = `${info.chunkFile}:${info.offset}`;
|
|
985
|
+
let p = _pkgCache.get(cacheKey);
|
|
986
|
+
if (!p) {
|
|
987
|
+
p = readPkgAt(pkgDir, info.chunkFile, info.offset);
|
|
988
|
+
if (p)
|
|
989
|
+
_pkgCache.set(cacheKey, p);
|
|
990
|
+
}
|
|
991
|
+
if (p && p.package === pkgName && p.version === version)
|
|
992
|
+
return p;
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
return undefined;
|
|
996
|
+
}
|
|
851
997
|
/** Resolve the download URL for a package. */
|
|
852
998
|
function getPkgUrl(rp) {
|
|
853
999
|
const cfg = (0, config_1.loadConfig)();
|
|
@@ -868,16 +1014,45 @@ async function downloadPkg(rp, dest, onProgress) {
|
|
|
868
1014
|
fs.mkdirSync(DEB_CACHE, { recursive: true });
|
|
869
1015
|
const fn = path.basename(rp.filename);
|
|
870
1016
|
const local = path.join(dest || DEB_CACHE, fn);
|
|
871
|
-
if (fs.existsSync(local))
|
|
872
|
-
|
|
1017
|
+
if (fs.existsSync(local)) {
|
|
1018
|
+
if (!rp.sha256)
|
|
1019
|
+
return local;
|
|
1020
|
+
try {
|
|
1021
|
+
const hash = crypto.createHash('sha256').update(fs.readFileSync(local)).digest('hex');
|
|
1022
|
+
if (hash === rp.sha256)
|
|
1023
|
+
return local;
|
|
1024
|
+
fs.unlinkSync(local);
|
|
1025
|
+
}
|
|
1026
|
+
catch { }
|
|
1027
|
+
}
|
|
873
1028
|
const url = getPkgUrl(rp);
|
|
1029
|
+
const partial = `${local}.part`;
|
|
1030
|
+
try {
|
|
1031
|
+
fs.unlinkSync(partial);
|
|
1032
|
+
}
|
|
1033
|
+
catch { }
|
|
1034
|
+
installPartialCleanup();
|
|
1035
|
+
activePartials.add(partial);
|
|
874
1036
|
// Stream directly to file instead of buffering in memory
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
1037
|
+
try {
|
|
1038
|
+
const data = await downloadFile(url, onProgress, undefined, partial);
|
|
1039
|
+
if (data === null)
|
|
1040
|
+
fs.renameSync(partial, local);
|
|
1041
|
+
else if (data)
|
|
1042
|
+
fs.writeFileSync(partial, data);
|
|
1043
|
+
if (data)
|
|
1044
|
+
fs.renameSync(partial, local);
|
|
1045
|
+
}
|
|
1046
|
+
catch (error) {
|
|
1047
|
+
try {
|
|
1048
|
+
fs.unlinkSync(partial);
|
|
1049
|
+
}
|
|
1050
|
+
catch { }
|
|
1051
|
+
throw error;
|
|
1052
|
+
}
|
|
1053
|
+
finally {
|
|
1054
|
+
activePartials.delete(partial);
|
|
1055
|
+
}
|
|
881
1056
|
return local;
|
|
882
1057
|
}
|
|
883
1058
|
//# sourceMappingURL=repository.js.map
|