@push.rocks/smartlinuxrepo 0.0.0-stage → 1.0.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 (131) hide show
  1. package/.smartconfig.json +65 -0
  2. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  3. package/dist_ts/00_commitinfo_data.js +9 -0
  4. package/dist_ts/alpine/apkindex.d.ts +39 -0
  5. package/dist_ts/alpine/apkindex.js +211 -0
  6. package/dist_ts/alpine/pkginfo.d.ts +45 -0
  7. package/dist_ts/alpine/pkginfo.js +159 -0
  8. package/dist_ts/alpine/reader.d.ts +20 -0
  9. package/dist_ts/alpine/reader.js +89 -0
  10. package/dist_ts/arch/builder.d.ts +41 -0
  11. package/dist_ts/arch/builder.js +234 -0
  12. package/dist_ts/arch/reader.d.ts +16 -0
  13. package/dist_ts/arch/reader.js +271 -0
  14. package/dist_ts/arch/signer.d.ts +21 -0
  15. package/dist_ts/arch/signer.js +66 -0
  16. package/dist_ts/arch/vercmp.d.ts +12 -0
  17. package/dist_ts/arch/vercmp.js +170 -0
  18. package/dist_ts/debian/control.d.ts +22 -0
  19. package/dist_ts/debian/control.js +137 -0
  20. package/dist_ts/debian/gostring.d.ts +26 -0
  21. package/dist_ts/debian/gostring.js +145 -0
  22. package/dist_ts/debian/indexbuilder.d.ts +47 -0
  23. package/dist_ts/debian/indexbuilder.js +299 -0
  24. package/dist_ts/debian/mailaddress.d.ts +12 -0
  25. package/dist_ts/debian/mailaddress.js +736 -0
  26. package/dist_ts/debian/reader.d.ts +30 -0
  27. package/dist_ts/debian/reader.js +110 -0
  28. package/dist_ts/index.d.ts +23 -0
  29. package/dist_ts/index.js +18 -0
  30. package/dist_ts/plugins.d.ts +8 -0
  31. package/dist_ts/plugins.js +11 -0
  32. package/dist_ts/readers/ar.d.ts +31 -0
  33. package/dist_ts/readers/ar.js +87 -0
  34. package/dist_ts/readers/bytes.d.ts +58 -0
  35. package/dist_ts/readers/bytes.js +147 -0
  36. package/dist_ts/readers/bytesource.d.ts +40 -0
  37. package/dist_ts/readers/bytesource.js +154 -0
  38. package/dist_ts/readers/decompress.d.ts +43 -0
  39. package/dist_ts/readers/decompress.js +269 -0
  40. package/dist_ts/readers/gzipmember.d.ts +32 -0
  41. package/dist_ts/readers/gzipmember.js +176 -0
  42. package/dist_ts/readers/tar.d.ts +85 -0
  43. package/dist_ts/readers/tar.js +731 -0
  44. package/dist_ts/readers/text.d.ts +16 -0
  45. package/dist_ts/readers/text.js +96 -0
  46. package/dist_ts/rpm/builder.d.ts +28 -0
  47. package/dist_ts/rpm/builder.js +208 -0
  48. package/dist_ts/rpm/header.d.ts +138 -0
  49. package/dist_ts/rpm/header.js +546 -0
  50. package/dist_ts/rpm/reader.d.ts +20 -0
  51. package/dist_ts/rpm/reader.js +306 -0
  52. package/dist_ts/rpm/repoconfig.d.ts +15 -0
  53. package/dist_ts/rpm/repoconfig.js +38 -0
  54. package/dist_ts/rpm/repodata.d.ts +44 -0
  55. package/dist_ts/rpm/repodata.js +148 -0
  56. package/dist_ts/rpm/sign.d.ts +30 -0
  57. package/dist_ts/rpm/sign.js +183 -0
  58. package/dist_ts/rpm/updates.d.ts +38 -0
  59. package/dist_ts/rpm/updates.js +265 -0
  60. package/dist_ts/rpm/xml.d.ts +18 -0
  61. package/dist_ts/rpm/xml.js +90 -0
  62. package/dist_ts/shared/architecture.d.ts +8 -0
  63. package/dist_ts/shared/architecture.js +17 -0
  64. package/dist_ts/shared/errors.d.ts +38 -0
  65. package/dist_ts/shared/errors.js +22 -0
  66. package/dist_ts/shared/gopath.d.ts +13 -0
  67. package/dist_ts/shared/gopath.js +53 -0
  68. package/dist_ts/shared/gostrings.d.ts +14 -0
  69. package/dist_ts/shared/gostrings.js +29 -0
  70. package/dist_ts/shared/limits.d.ts +47 -0
  71. package/dist_ts/shared/limits.js +57 -0
  72. package/dist_ts/shared/types.d.ts +213 -0
  73. package/dist_ts/shared/types.js +13 -0
  74. package/dist_ts/shared/url.d.ts +18 -0
  75. package/dist_ts/shared/url.js +371 -0
  76. package/dist_ts/shared/validation.d.ts +21 -0
  77. package/dist_ts/shared/validation.js +58 -0
  78. package/dist_ts/signing/keys.d.ts +36 -0
  79. package/dist_ts/signing/keys.js +89 -0
  80. package/dist_ts/signing/openpgpframing.d.ts +33 -0
  81. package/dist_ts/signing/openpgpframing.js +93 -0
  82. package/dist_ts/signing/signers.d.ts +63 -0
  83. package/dist_ts/signing/signers.js +248 -0
  84. package/dist_ts/writers/gotar.d.ts +43 -0
  85. package/dist_ts/writers/gotar.js +218 -0
  86. package/license.md +19 -0
  87. package/package.json +56 -3
  88. package/readme.md +176 -0
  89. package/ts/00_commitinfo_data.ts +8 -0
  90. package/ts/alpine/apkindex.ts +241 -0
  91. package/ts/alpine/pkginfo.ts +183 -0
  92. package/ts/alpine/reader.ts +96 -0
  93. package/ts/arch/builder.ts +283 -0
  94. package/ts/arch/reader.ts +307 -0
  95. package/ts/arch/signer.ts +70 -0
  96. package/ts/arch/vercmp.ts +188 -0
  97. package/ts/debian/control.ts +150 -0
  98. package/ts/debian/gostring.ts +150 -0
  99. package/ts/debian/indexbuilder.ts +355 -0
  100. package/ts/debian/mailaddress.ts +754 -0
  101. package/ts/debian/reader.ts +126 -0
  102. package/ts/index.ts +46 -0
  103. package/ts/plugins.ts +13 -0
  104. package/ts/readers/ar.ts +102 -0
  105. package/ts/readers/bytes.ts +182 -0
  106. package/ts/readers/bytesource.ts +164 -0
  107. package/ts/readers/decompress.ts +332 -0
  108. package/ts/readers/gzipmember.ts +209 -0
  109. package/ts/readers/tar.ts +835 -0
  110. package/ts/readers/text.ts +91 -0
  111. package/ts/rpm/builder.ts +253 -0
  112. package/ts/rpm/header.ts +628 -0
  113. package/ts/rpm/reader.ts +317 -0
  114. package/ts/rpm/repoconfig.ts +45 -0
  115. package/ts/rpm/repodata.ts +219 -0
  116. package/ts/rpm/sign.ts +200 -0
  117. package/ts/rpm/updates.ts +314 -0
  118. package/ts/rpm/xml.ts +101 -0
  119. package/ts/shared/architecture.ts +16 -0
  120. package/ts/shared/errors.ts +78 -0
  121. package/ts/shared/gopath.ts +54 -0
  122. package/ts/shared/gostrings.ts +31 -0
  123. package/ts/shared/limits.ts +93 -0
  124. package/ts/shared/types.ts +251 -0
  125. package/ts/shared/url.ts +387 -0
  126. package/ts/shared/validation.ts +71 -0
  127. package/ts/signing/keys.ts +110 -0
  128. package/ts/signing/openpgpframing.ts +115 -0
  129. package/ts/signing/signers.ts +315 -0
  130. package/ts/writers/gotar.ts +256 -0
  131. package/README.md +0 -3
@@ -0,0 +1,137 @@
1
+ import { LinuxRepoError, limitExceeded } from '../shared/errors.js';
2
+ import { isValidUrl } from '../shared/url.js';
3
+ import { fromByteString, goTrimSpace, toByteString } from './gostring.js';
4
+ import { parseMailAddress } from './mailaddress.js';
5
+ /**
6
+ * Gitea 28.2.0 `modules/packages/debian/metadata.go` patterns. In both Go and
7
+ * JS `+-.` and `+-~` inside a class are ranges (0x2B-0x2E and 0x2B-0x7E), so
8
+ * the name accepts `,` and the revision accepts almost all printable ASCII.
9
+ */
10
+ const NAME_PATTERN = /^[a-z0-9][a-z0-9+-.]+$/;
11
+ const VERSION_PATTERN = /^(?:(0|[1-9][0-9]*):)?[a-zA-Z0-9.+~]+(?:-[a-zA-Z0-9.+-~]+)?$/;
12
+ /** Gitea's distribution and component rule (`metadata.go:67`, applied at upload). */
13
+ export const DEBIAN_SYMBOL_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9.~+_-]*$/;
14
+ /**
15
+ * A port of Gitea 28.2.0 `ParseControlFile` (`metadata.go:165-265`) over the
16
+ * bytes of the `control` entry. Lines are split as `bufio.ScanLines` does
17
+ * (`\n`, one trailing `\r` dropped); the first blank line after content ends
18
+ * the stanza. Every derived value is Gitea's: the raw stanza trimmed, the
19
+ * Maintainer name through `net/mail`, the Homepage only when Gitea's URL
20
+ * check accepts it, the Description with its continuation lines appended
21
+ * verbatim, and the Depends text split on `,` (`['']` when there is none).
22
+ *
23
+ * Gitea's scanner refuses lines over 64 KiB; the codec accepts lines up to
24
+ * `maxLineBytes` (`maxHeaderBytes`), which is at least that.
25
+ */
26
+ export function parseDebianControlFile(bytesArg, maxLineBytesArg) {
27
+ const text = toByteString(bytesArg);
28
+ let name = '';
29
+ let version = '';
30
+ let architecture = '';
31
+ let maintainer = '';
32
+ let projectUrl = '';
33
+ let key = '';
34
+ let depends = '';
35
+ let control = '';
36
+ let description = '';
37
+ let offset = 0;
38
+ while (offset < text.length) {
39
+ const newline = text.indexOf('\n', offset);
40
+ const end = newline < 0 ? text.length : newline;
41
+ let line = text.slice(offset, end);
42
+ offset = newline < 0 ? text.length : newline + 1;
43
+ if (line.endsWith('\r')) {
44
+ line = line.slice(0, -1);
45
+ }
46
+ if (line.length > maxLineBytesArg) {
47
+ throw limitExceeded('maxHeaderBytes', maxLineBytesArg, 'Debian control line');
48
+ }
49
+ const trimmed = goTrimSpace(line);
50
+ if (trimmed === '') {
51
+ // one stanza only: the blank line after content ends it (metadata.go:182-191)
52
+ if (control.length === 0) {
53
+ continue;
54
+ }
55
+ break;
56
+ }
57
+ control += `${line}\n`;
58
+ if (line[0] === ' ' || line[0] === '\t') {
59
+ // a folded continuation line of the previous field
60
+ if (key === 'Description') {
61
+ description += line;
62
+ }
63
+ else if (key === 'Depends') {
64
+ depends += trimmed;
65
+ }
66
+ continue;
67
+ }
68
+ const colon = trimmed.indexOf(':');
69
+ if (colon < 0) {
70
+ // Gitea keeps the previous key here (metadata.go:207-210)
71
+ continue;
72
+ }
73
+ key = trimmed.slice(0, colon);
74
+ const value = goTrimSpace(trimmed.slice(colon + 1));
75
+ switch (key) {
76
+ case 'Package':
77
+ name = value;
78
+ break;
79
+ case 'Version':
80
+ version = value;
81
+ break;
82
+ case 'Architecture':
83
+ architecture = value;
84
+ break;
85
+ case 'Maintainer': {
86
+ const address = parseMailAddress(value);
87
+ maintainer = address === null || address.name === '' ? value : address.name;
88
+ break;
89
+ }
90
+ case 'Description':
91
+ description = value;
92
+ break;
93
+ case 'Depends':
94
+ // appended without a separator, as Gitea does for a repeated field
95
+ depends += value;
96
+ break;
97
+ case 'Homepage':
98
+ if (isValidUrl(fromByteString(value))) {
99
+ projectUrl = value;
100
+ }
101
+ break;
102
+ }
103
+ }
104
+ if (name === '') {
105
+ throw new LinuxRepoError('missing-field', 'the control file has no Package field', { field: 'Package' });
106
+ }
107
+ if (!NAME_PATTERN.test(name)) {
108
+ throw new LinuxRepoError('invalid-field', 'the package name is invalid', { field: 'Package', value: fromByteString(name) });
109
+ }
110
+ if (version === '') {
111
+ throw new LinuxRepoError('missing-field', 'the control file has no Version field', { field: 'Version' });
112
+ }
113
+ if (!VERSION_PATTERN.test(version)) {
114
+ throw new LinuxRepoError('invalid-field', 'the package version is invalid', {
115
+ field: 'Version',
116
+ value: fromByteString(version),
117
+ });
118
+ }
119
+ if (architecture === '') {
120
+ throw new LinuxRepoError('missing-field', 'the control file has no Architecture field', {
121
+ field: 'Architecture',
122
+ });
123
+ }
124
+ return {
125
+ name,
126
+ version,
127
+ architecture: fromByteString(architecture),
128
+ metadata: {
129
+ control: fromByteString(goTrimSpace(control)),
130
+ maintainer: fromByteString(maintainer),
131
+ projectUrl: fromByteString(projectUrl),
132
+ description: fromByteString(description),
133
+ dependencies: depends.split(',').map((dependency) => fromByteString(goTrimSpace(dependency))),
134
+ },
135
+ };
136
+ }
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RlYmlhbi9jb250cm9sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVwRDs7OztHQUlHO0FBQ0gsTUFBTSxZQUFZLEdBQUcsd0JBQXdCLENBQUM7QUFDOUMsTUFBTSxlQUFlLEdBQUcsOERBQThELENBQUM7QUFDdkYscUZBQXFGO0FBQ3JGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLGdDQUFnQyxDQUFDO0FBU3RFOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLFFBQW9CLEVBQUUsZUFBdUI7SUFDbEYsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNkLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNqQixJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7SUFDdEIsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUNwQixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDYixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDakIsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUVyQixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDZixPQUFPLE1BQU0sR0FBRyxJQUFJLENBQUMs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
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Go string semantics for the Debian ports. A Go string is a byte sequence;
3
+ * here it is a "byte string": a JS string whose every code unit is one byte
4
+ * (0-255). The ported Gitea and Go code indexes, slices and compares bytes
5
+ * exactly as Go does, and only the finished values are decoded into Unicode
6
+ * with `fromByteString` (Go's JSON coercion of invalid UTF-8).
7
+ */
8
+ export declare function toByteString(bytesArg: Uint8Array): string;
9
+ export declare function byteStringToBytes(valueArg: string): Uint8Array;
10
+ /** The byte string of a JS string's UTF-8 encoding. */
11
+ export declare function utf8ByteString(valueArg: string): string;
12
+ /** Decodes a byte string into Unicode, replacing every invalid byte with U+FFFD as Go's JSON encoder does. */
13
+ export declare function fromByteString(valueArg: string): string;
14
+ export declare const RUNE_ERROR = 65533;
15
+ /**
16
+ * Go `utf8.DecodeRuneInString(s[i:])`: the rune at byte offset `i` and its
17
+ * width. The width is 0 at the end of the string; an invalid or truncated
18
+ * sequence is `RUNE_ERROR` with width 1.
19
+ */
20
+ export declare function decodeRune(valueArg: string, indexArg: number): [number, number];
21
+ /** Go `unicode.IsSpace`. */
22
+ export declare function isGoSpace(runeArg: number): boolean;
23
+ /** Go `strings.TrimSpace` on a byte string. */
24
+ export declare function goTrimSpace(valueArg: string): string;
25
+ /** Bytewise comparison of two JS strings by their UTF-8 encodings (Go `sort.Strings` order). */
26
+ export declare function compareUtf8(aArg: string, bArg: string): number;
@@ -0,0 +1,145 @@
1
+ import { decodeGoUtf8, decodeLatin1 } from '../readers/text.js';
2
+ /**
3
+ * Go string semantics for the Debian ports. A Go string is a byte sequence;
4
+ * here it is a "byte string": a JS string whose every code unit is one byte
5
+ * (0-255). The ported Gitea and Go code indexes, slices and compares bytes
6
+ * exactly as Go does, and only the finished values are decoded into Unicode
7
+ * with `fromByteString` (Go's JSON coercion of invalid UTF-8).
8
+ */
9
+ export function toByteString(bytesArg) {
10
+ return decodeLatin1(bytesArg);
11
+ }
12
+ export function byteStringToBytes(valueArg) {
13
+ return Uint8Array.from(Buffer.from(valueArg, 'latin1'));
14
+ }
15
+ /** The byte string of a JS string's UTF-8 encoding. */
16
+ export function utf8ByteString(valueArg) {
17
+ return Buffer.from(valueArg, 'utf8').toString('latin1');
18
+ }
19
+ /** Decodes a byte string into Unicode, replacing every invalid byte with U+FFFD as Go's JSON encoder does. */
20
+ export function fromByteString(valueArg) {
21
+ return decodeGoUtf8(byteStringToBytes(valueArg));
22
+ }
23
+ export const RUNE_ERROR = 0xfffd;
24
+ /**
25
+ * Go `utf8.DecodeRuneInString(s[i:])`: the rune at byte offset `i` and its
26
+ * width. The width is 0 at the end of the string; an invalid or truncated
27
+ * sequence is `RUNE_ERROR` with width 1.
28
+ */
29
+ export function decodeRune(valueArg, indexArg) {
30
+ if (indexArg >= valueArg.length) {
31
+ return [RUNE_ERROR, 0];
32
+ }
33
+ const b0 = valueArg.charCodeAt(indexArg);
34
+ if (b0 < 0x80) {
35
+ return [b0, 1];
36
+ }
37
+ let need;
38
+ let rune;
39
+ let low = 0x80;
40
+ let high = 0xbf;
41
+ if (b0 >= 0xc2 && b0 <= 0xdf) {
42
+ need = 1;
43
+ rune = b0 & 0x1f;
44
+ }
45
+ else if (b0 >= 0xe0 && b0 <= 0xef) {
46
+ need = 2;
47
+ rune = b0 & 0x0f;
48
+ if (b0 === 0xe0) {
49
+ low = 0xa0;
50
+ }
51
+ else if (b0 === 0xed) {
52
+ high = 0x9f;
53
+ }
54
+ }
55
+ else if (b0 >= 0xf0 && b0 <= 0xf4) {
56
+ need = 3;
57
+ rune = b0 & 0x07;
58
+ if (b0 === 0xf0) {
59
+ low = 0x90;
60
+ }
61
+ else if (b0 === 0xf4) {
62
+ high = 0x8f;
63
+ }
64
+ }
65
+ else {
66
+ return [RUNE_ERROR, 1];
67
+ }
68
+ if (indexArg + need >= valueArg.length) {
69
+ return [RUNE_ERROR, 1];
70
+ }
71
+ for (let k = 1; k <= need; k++) {
72
+ const b = valueArg.charCodeAt(indexArg + k);
73
+ const min = k === 1 ? low : 0x80;
74
+ const max = k === 1 ? high : 0xbf;
75
+ if (b < min || b > max) {
76
+ return [RUNE_ERROR, 1];
77
+ }
78
+ rune = (rune << 6) | (b & 0x3f);
79
+ }
80
+ return [rune, need + 1];
81
+ }
82
+ /** Go `unicode.IsSpace`. */
83
+ export function isGoSpace(runeArg) {
84
+ switch (runeArg) {
85
+ case 0x09:
86
+ case 0x0a:
87
+ case 0x0b:
88
+ case 0x0c:
89
+ case 0x0d:
90
+ case 0x20:
91
+ case 0x85:
92
+ case 0xa0:
93
+ case 0x1680:
94
+ case 0x2028:
95
+ case 0x2029:
96
+ case 0x202f:
97
+ case 0x205f:
98
+ case 0x3000:
99
+ return true;
100
+ }
101
+ return runeArg >= 0x2000 && runeArg <= 0x200a;
102
+ }
103
+ /** Go `strings.TrimSpace` on a byte string. */
104
+ export function goTrimSpace(valueArg) {
105
+ let start = 0;
106
+ while (start < valueArg.length) {
107
+ const [rune, width] = decodeRune(valueArg, start);
108
+ if (!isGoSpace(rune)) {
109
+ break;
110
+ }
111
+ start += width;
112
+ }
113
+ let end = valueArg.length;
114
+ while (end > start) {
115
+ const [rune, width] = decodeLastRune(valueArg, start, end);
116
+ if (!isGoSpace(rune)) {
117
+ break;
118
+ }
119
+ end -= width;
120
+ }
121
+ return valueArg.slice(start, end);
122
+ }
123
+ /** Go `utf8.DecodeLastRuneInString(s[start:end])`. */
124
+ function decodeLastRune(valueArg, startArg, endArg) {
125
+ const last = valueArg.charCodeAt(endArg - 1);
126
+ if (last < 0x80) {
127
+ return [last, 1];
128
+ }
129
+ // a rune is at most 4 bytes: find the start byte and check it decodes to exactly the tail
130
+ const lowest = Math.max(startArg, endArg - 4);
131
+ let begin = endArg - 1;
132
+ while (begin > lowest && (valueArg.charCodeAt(begin) & 0xc0) === 0x80) {
133
+ begin -= 1;
134
+ }
135
+ const [rune, width] = decodeRune(valueArg.slice(0, endArg), begin);
136
+ if (begin + width !== endArg) {
137
+ return [RUNE_ERROR, 1];
138
+ }
139
+ return [rune, width];
140
+ }
141
+ /** Bytewise comparison of two JS strings by their UTF-8 encodings (Go `sort.Strings` order). */
142
+ export function compareUtf8(aArg, bArg) {
143
+ return Buffer.compare(Buffer.from(aArg, 'utf8'), Buffer.from(bArg, 'utf8'));
144
+ }
145
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29zdHJpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kZWJpYW4vZ29zdHJpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVoRTs7Ozs7O0dBTUc7QUFFSCxNQUFNLFVBQVUsWUFBWSxDQUFDLFFBQW9CO0lBQy9DLE9BQU8sWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsUUFBZ0I7SUFDaEQsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELHVEQUF1RDtBQUN2RCxNQUFNLFVBQVUsY0FBYyxDQUFDLFFBQWdCO0lBQzdDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCw4R0FBOEc7QUFDOUcsTUFBTSxVQUFVLGNBQWMsQ0FBQyxRQUFnQjtJQUM3QyxPQUFPLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDO0FBRWpDOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLFFBQWdCLEVBQUUsUUFBZ0I7SUFDM0QsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUNELE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDekMsSUFBSSxFQUFFLEdBQUcs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
@@ -0,0 +1,47 @@
1
+ import type { IDebianPackageRecord, ILinuxIndexFile } from '../shared/types.js';
2
+ import type { IOpenPgpSigner } from '../signing/signers.js';
3
+ export interface IDebianIndexEntry {
4
+ component: string;
5
+ record: IDebianPackageRecord;
6
+ }
7
+ /**
8
+ * Builds the index files of one Debian distribution as Gitea 28.2.0 does
9
+ * (`services/packages/debian/repository.go:147-397`):
10
+ *
11
+ * - per component and architecture with packages:
12
+ * `dists/<dist>/<component>/binary-<arch>/Packages`, `.gz` and `.xz`,
13
+ * each with `by-hash/{MD5Sum,SHA1,SHA256,SHA512}/<hex>` aliases;
14
+ * - `dists/<dist>/Release`, `Release.gpg` (armored detached signature) and
15
+ * `InRelease` (cleartext-signed `Release`), all signed at `timestamp`.
16
+ *
17
+ * An `all` package is listed only under `binary-all`, as in Gitea. Stanzas are
18
+ * sorted by name, version, architecture and file name (bytewise; Gitea uses
19
+ * database order), and the Release file lists follow component, architecture
20
+ * and file order. The output is the complete set of files for the
21
+ * distribution; an empty entry set returns `[]`.
22
+ */
23
+ export declare function buildDebianIndex(input: {
24
+ distribution: string;
25
+ entries: Array<{
26
+ component: string;
27
+ record: IDebianPackageRecord;
28
+ }>;
29
+ origin: string;
30
+ label: string;
31
+ signer: IOpenPgpSigner;
32
+ timestamp: Date;
33
+ }): Promise<ILinuxIndexFile[]>;
34
+ /**
35
+ * One `Packages` stanza, without the separating blank line: Gitea's trimmed
36
+ * control stanza without the six index-owned fields (`Filename`, `Size`,
37
+ * `MD5sum`, `SHA1`, `SHA256`, `SHA512`, matched case-insensitively, with their
38
+ * continuation lines), then those fields from the record
39
+ * (`repository.go:202-209`). A control file that sets them would point apt at
40
+ * other bytes; Gitea would write them twice. Internal: 1.0.0 exports no
41
+ * per-entry renderer.
42
+ */
43
+ export declare function renderDebianPackagesStanza(input: {
44
+ distribution: string;
45
+ component: string;
46
+ record: IDebianPackageRecord;
47
+ }): string;