@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.
- package/.smartconfig.json +65 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/alpine/apkindex.d.ts +39 -0
- package/dist_ts/alpine/apkindex.js +211 -0
- package/dist_ts/alpine/pkginfo.d.ts +45 -0
- package/dist_ts/alpine/pkginfo.js +159 -0
- package/dist_ts/alpine/reader.d.ts +20 -0
- package/dist_ts/alpine/reader.js +89 -0
- package/dist_ts/arch/builder.d.ts +41 -0
- package/dist_ts/arch/builder.js +234 -0
- package/dist_ts/arch/reader.d.ts +16 -0
- package/dist_ts/arch/reader.js +271 -0
- package/dist_ts/arch/signer.d.ts +21 -0
- package/dist_ts/arch/signer.js +66 -0
- package/dist_ts/arch/vercmp.d.ts +12 -0
- package/dist_ts/arch/vercmp.js +170 -0
- package/dist_ts/debian/control.d.ts +22 -0
- package/dist_ts/debian/control.js +137 -0
- package/dist_ts/debian/gostring.d.ts +26 -0
- package/dist_ts/debian/gostring.js +145 -0
- package/dist_ts/debian/indexbuilder.d.ts +47 -0
- package/dist_ts/debian/indexbuilder.js +299 -0
- package/dist_ts/debian/mailaddress.d.ts +12 -0
- package/dist_ts/debian/mailaddress.js +736 -0
- package/dist_ts/debian/reader.d.ts +30 -0
- package/dist_ts/debian/reader.js +110 -0
- package/dist_ts/index.d.ts +23 -0
- package/dist_ts/index.js +18 -0
- package/dist_ts/plugins.d.ts +8 -0
- package/dist_ts/plugins.js +11 -0
- package/dist_ts/readers/ar.d.ts +31 -0
- package/dist_ts/readers/ar.js +87 -0
- package/dist_ts/readers/bytes.d.ts +58 -0
- package/dist_ts/readers/bytes.js +147 -0
- package/dist_ts/readers/bytesource.d.ts +40 -0
- package/dist_ts/readers/bytesource.js +154 -0
- package/dist_ts/readers/decompress.d.ts +43 -0
- package/dist_ts/readers/decompress.js +269 -0
- package/dist_ts/readers/gzipmember.d.ts +32 -0
- package/dist_ts/readers/gzipmember.js +176 -0
- package/dist_ts/readers/tar.d.ts +85 -0
- package/dist_ts/readers/tar.js +731 -0
- package/dist_ts/readers/text.d.ts +16 -0
- package/dist_ts/readers/text.js +96 -0
- package/dist_ts/rpm/builder.d.ts +28 -0
- package/dist_ts/rpm/builder.js +208 -0
- package/dist_ts/rpm/header.d.ts +138 -0
- package/dist_ts/rpm/header.js +546 -0
- package/dist_ts/rpm/reader.d.ts +20 -0
- package/dist_ts/rpm/reader.js +306 -0
- package/dist_ts/rpm/repoconfig.d.ts +15 -0
- package/dist_ts/rpm/repoconfig.js +38 -0
- package/dist_ts/rpm/repodata.d.ts +44 -0
- package/dist_ts/rpm/repodata.js +148 -0
- package/dist_ts/rpm/sign.d.ts +30 -0
- package/dist_ts/rpm/sign.js +183 -0
- package/dist_ts/rpm/updates.d.ts +38 -0
- package/dist_ts/rpm/updates.js +265 -0
- package/dist_ts/rpm/xml.d.ts +18 -0
- package/dist_ts/rpm/xml.js +90 -0
- package/dist_ts/shared/architecture.d.ts +8 -0
- package/dist_ts/shared/architecture.js +17 -0
- package/dist_ts/shared/errors.d.ts +38 -0
- package/dist_ts/shared/errors.js +22 -0
- package/dist_ts/shared/gopath.d.ts +13 -0
- package/dist_ts/shared/gopath.js +53 -0
- package/dist_ts/shared/gostrings.d.ts +14 -0
- package/dist_ts/shared/gostrings.js +29 -0
- package/dist_ts/shared/limits.d.ts +47 -0
- package/dist_ts/shared/limits.js +57 -0
- package/dist_ts/shared/types.d.ts +213 -0
- package/dist_ts/shared/types.js +13 -0
- package/dist_ts/shared/url.d.ts +18 -0
- package/dist_ts/shared/url.js +371 -0
- package/dist_ts/shared/validation.d.ts +21 -0
- package/dist_ts/shared/validation.js +58 -0
- package/dist_ts/signing/keys.d.ts +36 -0
- package/dist_ts/signing/keys.js +89 -0
- package/dist_ts/signing/openpgpframing.d.ts +33 -0
- package/dist_ts/signing/openpgpframing.js +93 -0
- package/dist_ts/signing/signers.d.ts +63 -0
- package/dist_ts/signing/signers.js +248 -0
- package/dist_ts/writers/gotar.d.ts +43 -0
- package/dist_ts/writers/gotar.js +218 -0
- package/license.md +19 -0
- package/package.json +56 -3
- package/readme.md +176 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/alpine/apkindex.ts +241 -0
- package/ts/alpine/pkginfo.ts +183 -0
- package/ts/alpine/reader.ts +96 -0
- package/ts/arch/builder.ts +283 -0
- package/ts/arch/reader.ts +307 -0
- package/ts/arch/signer.ts +70 -0
- package/ts/arch/vercmp.ts +188 -0
- package/ts/debian/control.ts +150 -0
- package/ts/debian/gostring.ts +150 -0
- package/ts/debian/indexbuilder.ts +355 -0
- package/ts/debian/mailaddress.ts +754 -0
- package/ts/debian/reader.ts +126 -0
- package/ts/index.ts +46 -0
- package/ts/plugins.ts +13 -0
- package/ts/readers/ar.ts +102 -0
- package/ts/readers/bytes.ts +182 -0
- package/ts/readers/bytesource.ts +164 -0
- package/ts/readers/decompress.ts +332 -0
- package/ts/readers/gzipmember.ts +209 -0
- package/ts/readers/tar.ts +835 -0
- package/ts/readers/text.ts +91 -0
- package/ts/rpm/builder.ts +253 -0
- package/ts/rpm/header.ts +628 -0
- package/ts/rpm/reader.ts +317 -0
- package/ts/rpm/repoconfig.ts +45 -0
- package/ts/rpm/repodata.ts +219 -0
- package/ts/rpm/sign.ts +200 -0
- package/ts/rpm/updates.ts +314 -0
- package/ts/rpm/xml.ts +101 -0
- package/ts/shared/architecture.ts +16 -0
- package/ts/shared/errors.ts +78 -0
- package/ts/shared/gopath.ts +54 -0
- package/ts/shared/gostrings.ts +31 -0
- package/ts/shared/limits.ts +93 -0
- package/ts/shared/types.ts +251 -0
- package/ts/shared/url.ts +387 -0
- package/ts/shared/validation.ts +71 -0
- package/ts/signing/keys.ts +110 -0
- package/ts/signing/openpgpframing.ts +115 -0
- package/ts/signing/signers.ts +315 -0
- package/ts/writers/gotar.ts +256 -0
- package/README.md +0 -3
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import { isIndexableArchitecture } from '../shared/architecture.js';
|
|
3
|
+
import { LinuxRepoError } from '../shared/errors.js';
|
|
4
|
+
import { assertSegmentName, assertString, assertTimestamp, hasControlCharacter } from '../shared/validation.js';
|
|
5
|
+
import { createCleartextSignedMessage, createDetachedArmoredSignature } from '../signing/openpgpframing.js';
|
|
6
|
+
import { DEBIAN_SYMBOL_PATTERN } from './control.js';
|
|
7
|
+
import { compareUtf8, goTrimSpace, utf8ByteString } from './gostring.js';
|
|
8
|
+
/** The fields the `Packages` stanza writes itself; a control file's own copies are dropped. */
|
|
9
|
+
const INDEX_OWNED_FIELDS = new Set(['filename', 'size', 'md5sum', 'sha1', 'sha256', 'sha512']);
|
|
10
|
+
const PACKAGES_FILES = ['Packages', 'Packages.gz', 'Packages.xz'];
|
|
11
|
+
const MEDIA_TYPES = {
|
|
12
|
+
Packages: 'text/plain; charset=utf-8',
|
|
13
|
+
'Packages.gz': 'application/gzip',
|
|
14
|
+
'Packages.xz': 'application/x-xz',
|
|
15
|
+
Release: 'text/plain; charset=utf-8',
|
|
16
|
+
'Release.gpg': 'application/pgp-signature',
|
|
17
|
+
InRelease: 'text/plain; charset=utf-8',
|
|
18
|
+
};
|
|
19
|
+
const HASH_PATTERNS = {
|
|
20
|
+
md5: /^[0-9a-f]{32}$/,
|
|
21
|
+
sha1: /^[0-9a-f]{40}$/,
|
|
22
|
+
sha256: /^[0-9a-f]{64}$/,
|
|
23
|
+
sha512: /^[0-9a-f]{128}$/,
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Builds the index files of one Debian distribution as Gitea 28.2.0 does
|
|
27
|
+
* (`services/packages/debian/repository.go:147-397`):
|
|
28
|
+
*
|
|
29
|
+
* - per component and architecture with packages:
|
|
30
|
+
* `dists/<dist>/<component>/binary-<arch>/Packages`, `.gz` and `.xz`,
|
|
31
|
+
* each with `by-hash/{MD5Sum,SHA1,SHA256,SHA512}/<hex>` aliases;
|
|
32
|
+
* - `dists/<dist>/Release`, `Release.gpg` (armored detached signature) and
|
|
33
|
+
* `InRelease` (cleartext-signed `Release`), all signed at `timestamp`.
|
|
34
|
+
*
|
|
35
|
+
* An `all` package is listed only under `binary-all`, as in Gitea. Stanzas are
|
|
36
|
+
* sorted by name, version, architecture and file name (bytewise; Gitea uses
|
|
37
|
+
* database order), and the Release file lists follow component, architecture
|
|
38
|
+
* and file order. The output is the complete set of files for the
|
|
39
|
+
* distribution; an empty entry set returns `[]`.
|
|
40
|
+
*/
|
|
41
|
+
export async function buildDebianIndex(input) {
|
|
42
|
+
if (input === null || typeof input !== 'object') {
|
|
43
|
+
throw new LinuxRepoError('invalid-input', 'input must be an object', { field: 'input' });
|
|
44
|
+
}
|
|
45
|
+
assertSymbol(input.distribution, 'distribution');
|
|
46
|
+
assertReleaseValue(input.origin, 'origin');
|
|
47
|
+
assertReleaseValue(input.label, 'label');
|
|
48
|
+
assertTimestamp(input.timestamp);
|
|
49
|
+
if (input.signer === null || typeof input.signer !== 'object') {
|
|
50
|
+
throw new LinuxRepoError('invalid-input', 'signer must be an IOpenPgpSigner', { field: 'signer' });
|
|
51
|
+
}
|
|
52
|
+
if (!Array.isArray(input.entries)) {
|
|
53
|
+
throw new LinuxRepoError('invalid-input', 'entries must be an array', { field: 'entries' });
|
|
54
|
+
}
|
|
55
|
+
if (input.entries.length === 0) {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
const groups = new Map();
|
|
59
|
+
const poolPaths = new Set();
|
|
60
|
+
for (const entry of input.entries) {
|
|
61
|
+
if (entry === null || typeof entry !== 'object') {
|
|
62
|
+
throw new LinuxRepoError('invalid-input', 'each entry must be an object', { field: 'entries' });
|
|
63
|
+
}
|
|
64
|
+
assertSymbol(entry.component, 'component');
|
|
65
|
+
assertRecord(entry.record);
|
|
66
|
+
const poolPath = `${entry.component}/${entry.record.fileName}`;
|
|
67
|
+
if (poolPaths.has(poolPath)) {
|
|
68
|
+
throw new LinuxRepoError('invalid-input', `duplicate package file pool/${input.distribution}/${poolPath}`, {
|
|
69
|
+
field: 'entries',
|
|
70
|
+
value: entry.record.fileName,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
poolPaths.add(poolPath);
|
|
74
|
+
const groupKey = `${entry.component}\n${entry.record.architecture}`;
|
|
75
|
+
let group = groups.get(groupKey);
|
|
76
|
+
if (group === undefined) {
|
|
77
|
+
group = { component: entry.component, architecture: entry.record.architecture, entries: [] };
|
|
78
|
+
groups.set(groupKey, group);
|
|
79
|
+
}
|
|
80
|
+
group.entries.push(entry);
|
|
81
|
+
}
|
|
82
|
+
const sortedGroups = [...groups.values()].sort((a, b) => compareUtf8(a.component, b.component) || compareUtf8(a.architecture, b.architecture));
|
|
83
|
+
const contentFiles = [];
|
|
84
|
+
const releaseLines = { md5: [], sha1: [], sha256: [], sha512: [] };
|
|
85
|
+
for (const group of sortedGroups) {
|
|
86
|
+
const stanzas = group.entries
|
|
87
|
+
.slice()
|
|
88
|
+
.sort((a, b) => compareRecords(a.record, b.record))
|
|
89
|
+
.map((entry) => renderDebianPackagesStanza({ distribution: input.distribution, component: entry.component, record: entry.record }));
|
|
90
|
+
// one blank line between stanzas (repository.go:197-199)
|
|
91
|
+
const packages = new TextEncoder().encode(stanzas.join('\n'));
|
|
92
|
+
const directory = `dists/${input.distribution}/${group.component}/binary-${group.architecture}`;
|
|
93
|
+
const encoded = {
|
|
94
|
+
Packages: packages,
|
|
95
|
+
'Packages.gz': await gzip(packages),
|
|
96
|
+
'Packages.xz': new Uint8Array(await plugins.lzma.xz.compress(packages)),
|
|
97
|
+
};
|
|
98
|
+
for (const fileName of PACKAGES_FILES) {
|
|
99
|
+
const bytes = encoded[fileName];
|
|
100
|
+
const hashes = digestsOf(bytes);
|
|
101
|
+
const releasePath = `${group.component}/binary-${group.architecture}/${fileName}`;
|
|
102
|
+
for (const algorithm of ['md5', 'sha1', 'sha256', 'sha512']) {
|
|
103
|
+
releaseLines[algorithm].push(` ${hashes[algorithm]} ${bytes.length} ${releasePath}`);
|
|
104
|
+
}
|
|
105
|
+
contentFiles.push({
|
|
106
|
+
path: `${directory}/${fileName}`,
|
|
107
|
+
bytes,
|
|
108
|
+
sha256: hashes.sha256,
|
|
109
|
+
mediaType: MEDIA_TYPES[fileName],
|
|
110
|
+
stage: 'content',
|
|
111
|
+
aliases: [
|
|
112
|
+
`${directory}/by-hash/MD5Sum/${hashes.md5}`,
|
|
113
|
+
`${directory}/by-hash/SHA1/${hashes.sha1}`,
|
|
114
|
+
`${directory}/by-hash/SHA256/${hashes.sha256}`,
|
|
115
|
+
`${directory}/by-hash/SHA512/${hashes.sha512}`,
|
|
116
|
+
],
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const components = distinctSorted(sortedGroups.map((group) => group.component));
|
|
121
|
+
const architectures = distinctSorted(sortedGroups.map((group) => group.architecture));
|
|
122
|
+
// repository.go:322-352
|
|
123
|
+
const release = `Origin: ${input.origin}\n` +
|
|
124
|
+
`Label: ${input.label}\n` +
|
|
125
|
+
`Suite: ${input.distribution}\n` +
|
|
126
|
+
`Codename: ${input.distribution}\n` +
|
|
127
|
+
`Components: ${components.join(' ')}\n` +
|
|
128
|
+
`Architectures: ${architectures.join(' ')}\n` +
|
|
129
|
+
`Date: ${formatRfc1123Utc(input.timestamp)}\n` +
|
|
130
|
+
'Acquire-By-Hash: yes\n' +
|
|
131
|
+
`MD5Sum:\n${releaseLines.md5.map((line) => `${line}\n`).join('')}` +
|
|
132
|
+
`SHA1:\n${releaseLines.sha1.map((line) => `${line}\n`).join('')}` +
|
|
133
|
+
`SHA256:\n${releaseLines.sha256.map((line) => `${line}\n`).join('')}` +
|
|
134
|
+
`SHA512:\n${releaseLines.sha512.map((line) => `${line}\n`).join('')}`;
|
|
135
|
+
const releaseBytes = new TextEncoder().encode(release);
|
|
136
|
+
const releaseGpg = new TextEncoder().encode(await createDetachedArmoredSignature({ data: releaseBytes, signer: input.signer, timestamp: input.timestamp }));
|
|
137
|
+
const inRelease = new TextEncoder().encode(await createCleartextSignedMessage({ text: release, signer: input.signer, timestamp: input.timestamp }));
|
|
138
|
+
const pointerFiles = [
|
|
139
|
+
['Release', releaseBytes],
|
|
140
|
+
['Release.gpg', releaseGpg],
|
|
141
|
+
['InRelease', inRelease],
|
|
142
|
+
].map(([fileName, bytes]) => ({
|
|
143
|
+
path: `dists/${input.distribution}/${fileName}`,
|
|
144
|
+
bytes: bytes,
|
|
145
|
+
sha256: plugins.crypto.createHash('sha256').update(bytes).digest('hex'),
|
|
146
|
+
mediaType: MEDIA_TYPES[fileName],
|
|
147
|
+
stage: 'pointer',
|
|
148
|
+
aliases: [],
|
|
149
|
+
}));
|
|
150
|
+
return [...contentFiles, ...pointerFiles];
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* One `Packages` stanza, without the separating blank line: Gitea's trimmed
|
|
154
|
+
* control stanza without the six index-owned fields (`Filename`, `Size`,
|
|
155
|
+
* `MD5sum`, `SHA1`, `SHA256`, `SHA512`, matched case-insensitively, with their
|
|
156
|
+
* continuation lines), then those fields from the record
|
|
157
|
+
* (`repository.go:202-209`). A control file that sets them would point apt at
|
|
158
|
+
* other bytes; Gitea would write them twice. Internal: 1.0.0 exports no
|
|
159
|
+
* per-entry renderer.
|
|
160
|
+
*/
|
|
161
|
+
export function renderDebianPackagesStanza(input) {
|
|
162
|
+
assertSymbol(input.distribution, 'distribution');
|
|
163
|
+
assertSymbol(input.component, 'component');
|
|
164
|
+
assertRecord(input.record);
|
|
165
|
+
const kept = [];
|
|
166
|
+
let dropping = false;
|
|
167
|
+
// Gitea trims the stored stanza again when it writes it (repository.go:202)
|
|
168
|
+
for (const line of goTrimSpaceText(input.record.metadata.control).split('\n')) {
|
|
169
|
+
if (line[0] === ' ' || line[0] === '\t') {
|
|
170
|
+
if (!dropping) {
|
|
171
|
+
kept.push(line);
|
|
172
|
+
}
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
const colon = line.indexOf(':');
|
|
176
|
+
const field = colon < 0 ? null : goTrimSpaceText(line.slice(0, colon)).toLowerCase();
|
|
177
|
+
dropping = field !== null && INDEX_OWNED_FIELDS.has(field);
|
|
178
|
+
if (!dropping) {
|
|
179
|
+
kept.push(line);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
const control = kept.join('\n');
|
|
183
|
+
if (control === '') {
|
|
184
|
+
throw new LinuxRepoError('invalid-input', 'the record control stanza has no fields besides the index-owned ones', {
|
|
185
|
+
field: 'record.metadata.control',
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
const { digests } = input.record;
|
|
189
|
+
return (`${control}\n` +
|
|
190
|
+
`Filename: pool/${input.distribution}/${input.component}/${input.record.fileName}\n` +
|
|
191
|
+
`Size: ${digests.size}\n` +
|
|
192
|
+
`MD5sum: ${digests.md5}\n` +
|
|
193
|
+
`SHA1: ${digests.sha1}\n` +
|
|
194
|
+
`SHA256: ${digests.sha256}\n` +
|
|
195
|
+
`SHA512: ${digests.sha512}\n`);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Refuses a record the index cannot list: wrong format, an architecture that
|
|
199
|
+
* is not a path segment, a file name that is not one, digests that are not
|
|
200
|
+
* hex of the right length, or a control text that is not one stanza (empty,
|
|
201
|
+
* or holding a blank line that would start another stanza).
|
|
202
|
+
*/
|
|
203
|
+
function assertRecord(recordArg) {
|
|
204
|
+
if (recordArg === null || typeof recordArg !== 'object' || recordArg.format !== 'debian') {
|
|
205
|
+
throw new LinuxRepoError('invalid-input', 'record must be a Debian package record', { field: 'record' });
|
|
206
|
+
}
|
|
207
|
+
if (!isIndexableArchitecture(recordArg.architecture)) {
|
|
208
|
+
throw new LinuxRepoError('invalid-input', `${String(recordArg.fileName)}: architecture "${String(recordArg.architecture)}" cannot name an index path`, { field: 'record.architecture', value: String(recordArg.fileName) });
|
|
209
|
+
}
|
|
210
|
+
assertSegmentName(recordArg.fileName, 'record.fileName');
|
|
211
|
+
if (/\s/.test(recordArg.fileName)) {
|
|
212
|
+
throw new LinuxRepoError('invalid-input', 'record.fileName must not contain whitespace', {
|
|
213
|
+
field: 'record.fileName',
|
|
214
|
+
value: recordArg.fileName,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
const digests = recordArg.digests;
|
|
218
|
+
if (digests === null || typeof digests !== 'object' || !Number.isSafeInteger(digests.size) || digests.size < 0) {
|
|
219
|
+
throw new LinuxRepoError('invalid-input', 'record.digests.size must be a non-negative safe integer', {
|
|
220
|
+
field: 'record.digests',
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
for (const algorithm of ['md5', 'sha1', 'sha256', 'sha512']) {
|
|
224
|
+
if (typeof digests[algorithm] !== 'string' || !HASH_PATTERNS[algorithm].test(digests[algorithm])) {
|
|
225
|
+
throw new LinuxRepoError('invalid-input', `record.digests.${algorithm} must be lowercase hex`, {
|
|
226
|
+
field: `record.digests.${algorithm}`,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
const metadata = recordArg.metadata;
|
|
231
|
+
if (metadata === null || typeof metadata !== 'object') {
|
|
232
|
+
throw new LinuxRepoError('invalid-input', 'record.metadata must be an object', { field: 'record.metadata' });
|
|
233
|
+
}
|
|
234
|
+
assertString(metadata.control, 'record.metadata.control');
|
|
235
|
+
if (goTrimSpaceText(metadata.control).split('\n').some((line) => goTrimSpaceText(line) === '')) {
|
|
236
|
+
throw new LinuxRepoError('invalid-input', 'record.metadata.control must be one stanza without blank lines', {
|
|
237
|
+
field: 'record.metadata.control',
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
function assertSymbol(valueArg, fieldArg) {
|
|
242
|
+
assertString(valueArg, fieldArg);
|
|
243
|
+
if (!DEBIAN_SYMBOL_PATTERN.test(valueArg)) {
|
|
244
|
+
throw new LinuxRepoError('invalid-input', `${fieldArg} must match ${DEBIAN_SYMBOL_PATTERN.source}`, {
|
|
245
|
+
field: fieldArg,
|
|
246
|
+
value: valueArg,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/** A Release header value: one line, non-empty, no leading or trailing whitespace (canonical cleartext). */
|
|
251
|
+
function assertReleaseValue(valueArg, fieldArg) {
|
|
252
|
+
assertString(valueArg, fieldArg);
|
|
253
|
+
if (valueArg === '' || hasControlCharacter(valueArg) || valueArg !== valueArg.trim()) {
|
|
254
|
+
throw new LinuxRepoError('invalid-input', `${fieldArg} must be non-empty, without control characters or surrounding whitespace`, { field: fieldArg });
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/** Go `strings.TrimSpace` on a Unicode string. */
|
|
258
|
+
function goTrimSpaceText(valueArg) {
|
|
259
|
+
return Buffer.from(goTrimSpace(utf8ByteString(valueArg)), 'latin1').toString('utf8');
|
|
260
|
+
}
|
|
261
|
+
function compareRecords(aArg, bArg) {
|
|
262
|
+
return (compareUtf8(aArg.name, bArg.name) ||
|
|
263
|
+
compareUtf8(aArg.version, bArg.version) ||
|
|
264
|
+
compareUtf8(aArg.architecture, bArg.architecture) ||
|
|
265
|
+
compareUtf8(aArg.fileName, bArg.fileName));
|
|
266
|
+
}
|
|
267
|
+
function distinctSorted(valuesArg) {
|
|
268
|
+
return [...new Set(valuesArg)].sort(compareUtf8);
|
|
269
|
+
}
|
|
270
|
+
function digestsOf(bytesArg) {
|
|
271
|
+
return {
|
|
272
|
+
md5: plugins.crypto.createHash('md5').update(bytesArg).digest('hex'),
|
|
273
|
+
sha1: plugins.crypto.createHash('sha1').update(bytesArg).digest('hex'),
|
|
274
|
+
sha256: plugins.crypto.createHash('sha256').update(bytesArg).digest('hex'),
|
|
275
|
+
sha512: plugins.crypto.createHash('sha512').update(bytesArg).digest('hex'),
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
function gzip(bytesArg) {
|
|
279
|
+
return new Promise((resolve, reject) => {
|
|
280
|
+
plugins.zlib.gzip(bytesArg, (error, result) => {
|
|
281
|
+
if (error !== null) {
|
|
282
|
+
reject(error);
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
resolve(new Uint8Array(result.buffer, result.byteOffset, result.byteLength));
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
const WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
|
|
291
|
+
const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
|
292
|
+
/** Go `time.Time.UTC().Format(time.RFC1123)`: `Mon, 02 Jan 2006 15:04:05 UTC`. */
|
|
293
|
+
function formatRfc1123Utc(timestampArg) {
|
|
294
|
+
const pad = (valueArg) => String(valueArg).padStart(2, '0');
|
|
295
|
+
return (`${WEEKDAYS[timestampArg.getUTCDay()]}, ${pad(timestampArg.getUTCDate())} ${MONTHS[timestampArg.getUTCMonth()]} ` +
|
|
296
|
+
`${timestampArg.getUTCFullYear()} ${pad(timestampArg.getUTCHours())}:${pad(timestampArg.getUTCMinutes())}:` +
|
|
297
|
+
`${pad(timestampArg.getUTCSeconds())} UTC`);
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhidWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGViaWFuL2luZGV4YnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVoSCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsOEJBQThCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpFLCtGQUErRjtBQUMvRixNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBRS9GLE1BQU0sY0FBYyxHQUFHLENBQUMsVUFBVSxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQVUsQ0FBQztBQUUzRSxNQUFNLFdBQVcsR0FBMkI7SUFDMUMsUUFBUSxFQUFFLDJCQUEyQjtJQUNyQyxhQUFhLEVBQUUsa0JBQWtCO0lBQ2pDLGFBQWEsRUFBRSxrQkFBa0I7SUFDakMsT0FBTyxFQUFFLDJCQUEyQjtJQUNwQyxhQUFhLEVBQUUsMkJBQTJCO0lBQzFDLFNBQVMsRUFBRSwyQkFBMkI7Q0FDdkMsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFHO0lBQ3BCLEdBQUcsRUFBRSxnQkFBZ0I7SUFDckIsSUFBSSxFQUFF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
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A port of Go 1.27.2 `net/mail.ParseAddress` (Gitea 28.2.0's toolchain,
|
|
3
|
+
* `go.mod`), used for the Debian `Maintainer` name. Inputs and outputs are
|
|
4
|
+
* byte strings (see `gostring.ts`). Only success and the parsed name matter
|
|
5
|
+
* to the caller, so error texts are not ported.
|
|
6
|
+
*/
|
|
7
|
+
export interface IMailAddress {
|
|
8
|
+
name: string;
|
|
9
|
+
address: string;
|
|
10
|
+
}
|
|
11
|
+
/** Go `mail.ParseAddress`; `null` where Go returns an error. */
|
|
12
|
+
export declare function parseMailAddress(addressArg: string): IMailAddress | null;
|