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.
Files changed (59) hide show
  1. package/dist/cli/archlinux-java.js +36 -12
  2. package/dist/cli/archlinux-java.js.map +1 -1
  3. package/dist/cli/paclink.js +17 -28
  4. package/dist/cli/paclink.js.map +1 -1
  5. package/dist/cli/pacman.d.ts.map +1 -1
  6. package/dist/cli/pacman.js +18 -10
  7. package/dist/cli/pacman.js.map +1 -1
  8. package/dist/core/deps.d.ts +2 -0
  9. package/dist/core/deps.d.ts.map +1 -1
  10. package/dist/core/deps.js +19 -5
  11. package/dist/core/deps.js.map +1 -1
  12. package/dist/core/options.d.ts +1 -0
  13. package/dist/core/options.d.ts.map +1 -1
  14. package/dist/core/pkgfile.d.ts +2 -0
  15. package/dist/core/pkgfile.d.ts.map +1 -1
  16. package/dist/core/pkgfile.js +6 -0
  17. package/dist/core/pkgfile.js.map +1 -1
  18. package/dist/core/tar.d.ts +1 -0
  19. package/dist/core/tar.d.ts.map +1 -1
  20. package/dist/core/tar.js +54 -7
  21. package/dist/core/tar.js.map +1 -1
  22. package/dist/core/types.d.ts +5 -0
  23. package/dist/core/types.d.ts.map +1 -1
  24. package/dist/db/dpkg-compat.d.ts +5 -2
  25. package/dist/db/dpkg-compat.d.ts.map +1 -1
  26. package/dist/db/dpkg-compat.js +124 -51
  27. package/dist/db/dpkg-compat.js.map +1 -1
  28. package/dist/db/localdb.d.ts.map +1 -1
  29. package/dist/db/localdb.js +21 -2
  30. package/dist/db/localdb.js.map +1 -1
  31. package/dist/lock/dpkg-helper +0 -0
  32. package/dist/lock/dpkg-lock.d.ts +5 -0
  33. package/dist/lock/dpkg-lock.d.ts.map +1 -0
  34. package/dist/lock/dpkg-lock.js +113 -0
  35. package/dist/lock/dpkg-lock.js.map +1 -0
  36. package/dist/ops/install.d.ts.map +1 -1
  37. package/dist/ops/install.js +227 -144
  38. package/dist/ops/install.js.map +1 -1
  39. package/dist/ops/query.js +3 -2
  40. package/dist/ops/query.js.map +1 -1
  41. package/dist/ops/remove.d.ts.map +1 -1
  42. package/dist/ops/remove.js +106 -60
  43. package/dist/ops/remove.js.map +1 -1
  44. package/dist/ops/upgrade.d.ts.map +1 -1
  45. package/dist/ops/upgrade.js +6 -5
  46. package/dist/ops/upgrade.js.map +1 -1
  47. package/dist/repo/config.d.ts.map +1 -1
  48. package/dist/repo/config.js +26 -3
  49. package/dist/repo/config.js.map +1 -1
  50. package/dist/repo/repository.d.ts +6 -0
  51. package/dist/repo/repository.d.ts.map +1 -1
  52. package/dist/repo/repository.js +199 -24
  53. package/dist/repo/repository.js.map +1 -1
  54. package/dist/scripts/setup.js +25 -76
  55. package/dist/scripts/setup.js.map +1 -1
  56. package/lib/pac4deb/include/alpm.h +2 -1
  57. package/lib/pac4deb/src/libalpm.c +76 -21
  58. package/package.json +2 -2
  59. package/resources/paclinks.conf +64 -0
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/repo/config.ts"],"names":[],"mappings":"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"}
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":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAc,MAAM,eAAe,CAAC;AA+BzD,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC;AA8WD,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;AAKD,wBAAgB,YAAY,IAAI,OAAO,EAAE,CA+BxC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAGtC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CA6BnD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CA6B/D;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,CAa9H"}
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"}
@@ -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 version = firstSpace >= 0 ? beforeProv.slice(firstSpace + 1).trim() : '';
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}`, undefined, ifModifiedSince);
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 }; // 304
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 = 0;
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
- info.sha256 = newSha256;
309
- info.total = all.length;
310
- try {
311
- fs.mkdirSync(pkgDir, { recursive: true });
312
- fs.writeFileSync(infoFile, JSON.stringify(info));
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
- catch { }
315
- return { pkgs: all, size: totalSize, notModified: !anyData && ifModifiedSince !== undefined };
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(fs.promises.writeFile(path.join(pkgDir, fname), lines + '\n'));
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 fs.promises.writeFile(path.join(pkgDir, '.info'), JSON.stringify({ total: pkgs.length, chunks, chunkSize: CHUNK }));
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 fs.promises.writeFile(path.join(pkgDir, 'packages.idx'), idxLines.join('\n') + '\n');
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 lq = query.toLowerCase();
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
- return local;
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
- const data = await downloadFile(url, onProgress, undefined, local);
876
- if (data === null)
877
- return local; // streamed to file
878
- // Fallback: write buffer (for XferCommand without dest)
879
- if (data)
880
- fs.writeFileSync(local, data);
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