commit distribution files
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -99,9 +99,5 @@ public
|
|||||||
|
|
||||||
|
|
||||||
# custom .gitignore
|
# custom .gitignore
|
||||||
config/config.json5
|
|
||||||
distribution/
|
|
||||||
.env
|
.env
|
||||||
test/*.js*
|
test/*.js*
|
||||||
output.wav
|
|
||||||
output.mp3
|
|
||||||
|
|||||||
49
distribution/src/pkgbase.js
Normal file
49
distribution/src/pkgbase.js
Normal 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
|
||||||
1
distribution/src/pkgbase.js.map
Normal file
1
distribution/src/pkgbase.js.map
Normal file
File diff suppressed because one or more lines are too long
96
distribution/test/pkgbase.test.js
Normal file
96
distribution/test/pkgbase.test.js
Normal 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
|
||||||
1
distribution/test/pkgbase.test.js.map
Normal file
1
distribution/test/pkgbase.test.js.map
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user