commit distribution files

This commit is contained in:
2025-11-05 02:09:11 -05:00
parent 25532f16b3
commit d93a9da0f3
5 changed files with 147 additions and 4 deletions

4
.gitignore vendored
View File

@@ -99,9 +99,5 @@ public
# custom .gitignore # custom .gitignore
config/config.json5
distribution/
.env .env
test/*.js* test/*.js*
output.wav
output.mp3

View File

@@ -0,0 +1,49 @@
import fsp from 'fs/promises';
import * as YAML from 'yaml';
async function parse(previous, current) {
const prev = await tryRead(previous);
const curr = await tryRead(current);
const actions = curr?.actions;
const result = {
build: false,
move: false,
delete: [],
actions,
};
if (isDelete(actions)) {
const repo = prev.repos[actions.removeRepo];
result.delete.push(...repo.packages.map(p => `${actions.removeRepo}/${p.split(`-${repo.version}`)[0]}`));
}
else if (result.move = isMove(actions)) {
result.delete.push(...getDropped(prev.repos[actions.addRepo], curr.repos[actions.removeRepo]));
}
else if (result.build = isAdd(actions)) {
result.delete.push(...getDropped(prev.repos[actions.addRepo], curr.repos[actions.addRepo]));
}
return result;
}
function getDropped(oldRepoContents, newRepoContents) {
const oldPackages = oldRepoContents.packages.map(p => p.split(`-${oldRepoContents.version}`)[0]);
const newPackages = newRepoContents.packages.map(p => p.split(`-${newRepoContents.version}`)[0]);
return oldPackages.filter(p => newPackages.indexOf(p) === -1);
}
function isDelete(actions) {
return !!(actions.removeRepo && actions.addRepo === null);
}
function isAdd(actions) {
return !!(actions.addRepo && actions.removeRepo === null);
}
function isMove(actions) {
return !!(actions.removeRepo && actions.addRepo);
}
async function tryRead(file) {
try {
const contents = await fsp.readFile(file, { encoding: 'utf-8' });
return YAML.parse(contents);
}
catch {
return null;
}
}
export { parse };
//# sourceMappingURL=pkgbase.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,96 @@
import path from 'path';
import { describe, expect, it } from 'vitest';
import { parse } from '../src/pkgbase.js';
describe('pkgbase parser', () => {
it('can detect an add operation', async () => {
const expected = {
build: true,
move: false,
delete: [],
actions: {
addRepo: 'system-goblins',
removeRepo: null,
triggersBuild: false,
triggersRebuild: true,
triggersRepoAdd: true,
triggersRepoRemove: false,
triggersNoCheck: false
}
};
const rDir = 'add-clean';
await expect(parse(path.join('test', 'resources', rDir, 'pkgbase.old.yaml'), path.join('test', 'resources', rDir, 'pkgbase.new.yaml'))).resolves.toEqual(expected);
});
it('can remove dangling packages in an add operation', async () => {
const expected = {
build: true,
move: false,
delete: ['pidgin'],
actions: {
addRepo: 'world',
removeRepo: null,
triggersBuild: true,
triggersRebuild: false,
triggersRepoAdd: true,
triggersRepoRemove: false,
triggersNoCheck: false
}
};
const rDir = 'add-with-dropped';
await expect(parse(path.join('test', 'resources', rDir, 'pkgbase.old.yaml'), path.join('test', 'resources', rDir, 'pkgbase.new.yaml'))).resolves.toEqual(expected);
});
it('can detect a move operation', async () => {
const expected = {
build: false,
move: true,
delete: ['opencascade'],
actions: {
addRepo: 'world',
removeRepo: 'world-gremlins',
triggersBuild: false,
triggersRebuild: false,
triggersRepoAdd: true,
triggersRepoRemove: true,
triggersNoCheck: false
}
};
const rDir = 'move-clean';
await expect(parse(path.join('test', 'resources', rDir, 'pkgbase.old.yaml'), path.join('test', 'resources', rDir, 'pkgbase.new.yaml'))).resolves.toEqual(expected);
});
it('can remove dangling packages in a move operation', async () => {
const expected = {
build: false,
move: true,
delete: ['pidgin', 'libpurple', 'finch'],
actions: {
addRepo: 'world',
removeRepo: 'world-gremlins',
triggersBuild: false,
triggersRebuild: false,
triggersRepoAdd: true,
triggersRepoRemove: true,
triggersNoCheck: false
}
};
const rDir = 'move-with-dropped';
await expect(parse(path.join('test', 'resources', rDir, 'pkgbase.old.yaml'), path.join('test', 'resources', rDir, 'pkgbase.new.yaml'))).resolves.toEqual(expected);
});
it('can detect a delete operation', async () => {
const expected = {
build: false,
move: false,
delete: ['world/python-nntplib', 'world/python-cgi', 'world/python-mailcap'],
actions: {
addRepo: null,
removeRepo: 'world',
triggersBuild: false,
triggersRebuild: false,
triggersRepoAdd: false,
triggersRepoRemove: true,
triggersNoCheck: false
}
};
const rDir = 'remove';
await expect(parse(path.join('test', 'resources', rDir, 'pkgbase.old.yaml'), path.join('test', 'resources', rDir, 'pkgbase.new.yaml'))).resolves.toEqual(expected);
});
});
//# sourceMappingURL=pkgbase.test.js.map

File diff suppressed because one or more lines are too long