3 Commits

Author SHA1 Message Date
4c2441b9e5 track source 2025-08-01 17:01:36 -05:00
494b4b239d allow preamble for md output 2025-08-01 16:59:29 -05:00
8c242214fb use the index to determin mirrorUrl primary key 2025-08-01 16:43:23 -05:00
4 changed files with 39 additions and 28 deletions

1
.gitignore vendored
View File

@@ -103,4 +103,5 @@ distribution/*
mirrorlist mirrorlist
mirrors*.json mirrors*.json
mirrors.md mirrors.md
head.md
.env .env

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "artix-mlg", "name": "artix-mlg",
"version": "0.2.6", "version": "0.2.7",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "artix-mlg", "name": "artix-mlg",
"version": "0.2.6", "version": "0.2.7",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"country-code-lookup": "0.1.3", "country-code-lookup": "0.1.3",

View File

@@ -1,6 +1,6 @@
{ {
"name": "artix-mlg", "name": "artix-mlg",
"version": "0.2.6", "version": "0.2.7",
"description": "mirrorlist generator for Artix Linux", "description": "mirrorlist generator for Artix Linux",
"keywords": [ "keywords": [
"artix", "artix",

View File

@@ -10,6 +10,7 @@ const inputFile = process.env['INPUT'] || path.join(process.cwd(), 'mirrors.json
const fixtureFile = process.env['FIXTURE'] || path.join(process.cwd(), 'mirrors.fixture.json'); const fixtureFile = process.env['FIXTURE'] || path.join(process.cwd(), 'mirrors.fixture.json');
const mirrorList = process.env['MIRRORLIST'] || path.join(process.cwd(), 'mirrorlist'); const mirrorList = process.env['MIRRORLIST'] || path.join(process.cwd(), 'mirrorlist');
const mirrorMd = process.env['MIRRORMD'] || path.join(process.cwd(), 'mirrors.md'); const mirrorMd = process.env['MIRRORMD'] || path.join(process.cwd(), 'mirrors.md');
const mdHeadFile = process.env['MDHEADER'] || path.join(process.cwd(), 'head.md');
const verbose = !!process.env['VERBOSE']; const verbose = !!process.env['VERBOSE'];
const protocolId: Record<Protocol, number> = { const protocolId: Record<Protocol, number> = {
@@ -69,7 +70,6 @@ interface UrlComponents {
type MirrorMap = { [name: string]: Mirror }; type MirrorMap = { [name: string]: Mirror };
let mirrorCounter = 0; let mirrorCounter = 0;
let mirrorUrlCounter = 0;
function setMirrors(fixture: FixtureObject[]) { function setMirrors(fixture: FixtureObject[]) {
const mirrors: MirrorMap = {}; const mirrors: MirrorMap = {};
@@ -130,25 +130,25 @@ function updateMirror(m: Mirror, profile: MirrorProfile, url: UrlComponents) {
} }
} }
function processMirrorProfile(m: MirrorProfile) { function processMirrorProfile(m: MirrorProfile, index: number) {
const url: UrlComponents = processUrl(m.url); const url: UrlComponents = processUrl(m.url);
const mirror: Mirror = getMirror(m.force_mirror_name || url.name); const mirror: Mirror = getMirror(m.force_mirror_name || url.name);
updateMirror(mirror, m, url); updateMirror(mirror, m, url);
const mirrorUrl: MirrorUrl = { const mirrorUrl: MirrorUrl = {
pk: ++mirrorUrlCounter, pk: index + 1,
model: 'mirrors.MirrorUrl', model: 'mirrors.MirrorUrl',
fields: { fields: {
url: url.partial, url: url.partial,
protocol: protocolId[url.protocol], protocol: protocolId[url.protocol],
mirror: mirror.pk, mirror: mirror.pk,
country: resolveCountry(m.country)?.iso2 || undefined, country: resolveCountry(m.country)?.iso2 || undefined,
// populate ip fields with `mirrorresolv` // populate ip fields with `mirrorresolv`
has_ipv4: false, has_ipv4: false,
has_ipv6: false, has_ipv6: false,
active: m.active active: m.active
} }
}; };
mirrorUrls.push(mirrorUrl); mirrorUrls.push(mirrorUrl);
pushMirrorProfile(m.force_mirror_name || url.name, m); pushMirrorProfile(m.force_mirror_name || url.name, m);
} }
@@ -183,7 +183,7 @@ function generateMirrorlist(mirrors: MirrorProfile[] = []): string {
const lines: string[] = [ const lines: string[] = [
'##', '##',
'## Artix Linux repository mirrorlist', '## Artix Linux repository mirrorlist',
`## Generated on ${getDateTime()}`, `## Generated on ${getDateTime()} by artix-mlg`,
'##', '##',
'', '',
'# Artix mirrors', '# Artix mirrors',
@@ -199,7 +199,18 @@ function generateMirrorlist(mirrors: MirrorProfile[] = []): string {
return lines.join('\n'); return lines.join('\n');
} }
function generateMirrorMd(): string { async function generateMirrorMd(): Promise<string> {
async function tryReadHeader(): Promise<string[]> {
try {
return [await fsp.readFile(mdHeadFile, 'utf-8')];
}
catch (err) {
if (verbose) {
console.error(err);
}
return [];
}
}
function pushTableRowIfTruthy(lines: string[], label: string, value: string | undefined | null | false) { function pushTableRowIfTruthy(lines: string[], label: string, value: string | undefined | null | false) {
if (value) { if (value) {
lines.push(`| ${label} | ${value} |`); lines.push(`| ${label} | ${value} |`);
@@ -208,15 +219,14 @@ function generateMirrorMd(): string {
function findFirstWithChild<T, K extends keyof T>(profiles: T[], key: K): T[K] | undefined { function findFirstWithChild<T, K extends keyof T>(profiles: T[], key: K): T[K] | undefined {
return profiles.find(p => !!p[key])?.[key]; return profiles.find(p => !!p[key])?.[key];
} }
const lines: string[] = [ const lines: string[] = await tryReadHeader();
'# Mirrors\n\nContact or other information for the mirrors of our repositories and ISOs.\n' lines.push('# Mirrors\n\nContact or other information for the mirrors of our repositories and ISOs.\n');
]
for (let mirrorName in mirrorProfilesByMirrorName) { for (let mirrorName in mirrorProfilesByMirrorName) {
const profiles: MirrorProfile[] = mirrorProfilesByMirrorName[mirrorName]; const profiles: MirrorProfile[] = mirrorProfilesByMirrorName[mirrorName];
const activeProfiles: MirrorProfile[] = profiles.filter(p => p.active); const activeProfiles: MirrorProfile[] = profiles.filter(p => p.active);
const urls: string[] = profiles.map(p => { const urls: string[] = profiles.map(p => {
const url = p.url.split('$repo')[0]; const url = p.url.split('$repo')[0];
return p.active ? url: `${url} (inactive)`; return p.active ? url : `${url} (inactive)`;
}); });
const upstream = findFirstWithChild(activeProfiles, 'upstream'); const upstream = findFirstWithChild(activeProfiles, 'upstream');
lines.push(`### ${mirrorName}`); lines.push(`### ${mirrorName}`);
@@ -265,7 +275,7 @@ async function main() {
await fsp.writeFile(fixtureFile, JSON.stringify(composeMirrorFixture(), null, 4)); await fsp.writeFile(fixtureFile, JSON.stringify(composeMirrorFixture(), null, 4));
await fsp.writeFile(mirrorList, generateMirrorlist(input.mirrors?.filter(m => m.public && m.active && !m.suppress) || [])); await fsp.writeFile(mirrorList, generateMirrorlist(input.mirrors?.filter(m => m.public && m.active && !m.suppress) || []));
await fsp.writeFile(mirrorMd, generateMirrorMd()); await fsp.writeFile(mirrorMd, await generateMirrorMd());
} }
export default main; export default main;