more verbose delete details, fix logic
All checks were successful
Distribution check / Generated files check (push) Successful in -2m2s
NPM Audit Check / Check NPM audit (push) Successful in -2m10s
Unit tests / Unit tests (latest) (push) Successful in -2m2s
Unit tests / Unit tests (lts/*) (push) Successful in -2m2s
Unit tests / Unit tests (lts/hydrogen) (push) Successful in -2m1s

This commit is contained in:
2025-11-05 13:18:04 -05:00
parent de32e6f5f4
commit dd8bb6db4f
6 changed files with 158 additions and 30 deletions

View File

@@ -12,20 +12,30 @@ async function parse(previous, current) {
};
if (isDelete(actions)) {
const repo = prev.repos[actions.removeRepo];
result.delete.push(...repo.packages.map(p => `${actions.removeRepo}/${p.split(`-${repo.version}`)[0]}`));
result.delete.push(...parseRepoContents(repo, actions.removeRepo));
}
else if (result.move = isMove(actions)) {
result.delete.push(...getDropped(prev.repos[actions.addRepo], curr.repos[actions.removeRepo]));
else if (prev && (result.move = isMove(actions))) {
const moving = parseRepoContents(curr.repos[actions.addRepo], actions.removeRepo);
result.delete.push(...getDropped(parseRepoContents(prev.repos[actions.addRepo], actions.addRepo), moving));
result.delete.push(...moving);
}
else if (result.build = isAdd(actions)) {
result.delete.push(...getDropped(prev.repos[actions.addRepo], curr.repos[actions.addRepo]));
else if ((result.build = isAdd(actions)) && prev) {
result.delete.push(...getDropped(parseRepoContents(prev.repos[actions.addRepo], actions.addRepo), parseRepoContents(curr.repos[actions.addRepo], 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 parseRepoContents(repoContents, repository) {
return repoContents.packages.map(p => {
return {
version: repoContents.version,
repository,
package: p.split(`-${repoContents.version}`)[0],
architecture: p.split(`${repoContents.version}-`)[1].split('.')[0]
};
});
}
function getDropped(oldPackages, newPackages) {
return oldPackages.filter(p => newPackages.filter(np => np.package === p.package).length === 0);
}
function isDelete(actions) {
return !!(actions.removeRepo && actions.addRepo === null);

File diff suppressed because one or more lines are too long

View File

@@ -24,7 +24,14 @@ describe('pkgbase parser', () => {
const expected = {
build: true,
move: false,
delete: ['pidgin'],
delete: [
{
architecture: "x86_64",
package: "pidgin",
repository: "world",
version: "2.14.14-3",
}
],
actions: {
addRepo: 'world',
removeRepo: null,
@@ -42,7 +49,12 @@ describe('pkgbase parser', () => {
const expected = {
build: false,
move: true,
delete: ['opencascade'],
delete: [{
architecture: "x86_64",
package: "opencascade",
repository: "world-gremlins",
version: "1:7.9.2-1",
}],
actions: {
addRepo: 'world',
removeRepo: 'world-gremlins',
@@ -60,7 +72,26 @@ describe('pkgbase parser', () => {
const expected = {
build: false,
move: true,
delete: ['pidgin', 'libpurple', 'finch'],
delete: [
{
architecture: "x86_64",
package: "pidgin",
repository: "world",
version: "2.14.14-3",
},
{
architecture: "x86_64",
package: "libpurple",
repository: "world-gremlins",
version: "2.14.14-4",
},
{
architecture: "x86_64",
package: "finch",
repository: "world-gremlins",
version: "2.14.14-4",
}
],
actions: {
addRepo: 'world',
removeRepo: 'world-gremlins',
@@ -78,7 +109,26 @@ describe('pkgbase parser', () => {
const expected = {
build: false,
move: false,
delete: ['world/python-nntplib', 'world/python-cgi', 'world/python-mailcap'],
delete: [
{
architecture: "any",
package: "python-nntplib",
repository: "world",
version: "3.13.0-2",
},
{
architecture: "any",
package: "python-cgi",
repository: "world",
version: "3.13.0-2",
},
{
architecture: "any",
package: "python-mailcap",
repository: "world",
version: "3.13.0-2",
}
],
actions: {
addRepo: null,
removeRepo: 'world',

File diff suppressed because one or more lines are too long

View File

@@ -2,6 +2,13 @@ import { type PathLike } from 'fs';
import fsp from 'fs/promises';
import * as YAML from 'yaml';
interface PackageInfo {
package: string;
repository: string;
version: string;
architecture: string;
}
interface Actions {
addRepo: string | null;
removeRepo: string | null;
@@ -15,7 +22,7 @@ interface Actions {
interface Result {
build: boolean;
move: boolean;
delete: string[];
delete: PackageInfo[];
actions: Actions;
}
@@ -57,22 +64,33 @@ async function parse(previous: PathLike, current: PathLike): Promise<Result> {
if (isDelete(actions)) {
const repo: RepoContents = prev.repos[actions.removeRepo];
result.delete.push(...repo.packages.map(p => `${actions.removeRepo}/${p.split(`-${repo.version}`)[0]}`));
result.delete.push(...parseRepoContents(repo, actions.removeRepo));
}
else if (result.move = isMove(actions)) {
result.delete.push(...getDropped(prev.repos[actions.addRepo], curr.repos[actions.removeRepo]));
else if (prev && (result.move = isMove(actions))) {
const moving = parseRepoContents(curr.repos[actions.addRepo], actions.removeRepo);
result.delete.push(...getDropped(parseRepoContents(prev.repos[actions.addRepo], actions.addRepo), moving));
result.delete.push(...moving);
}
else if (result.build = isAdd(actions)) {
result.delete.push(...getDropped(prev.repos[actions.addRepo], curr.repos[actions.addRepo]));
else if ((result.build = isAdd(actions)) && prev) {
result.delete.push(...getDropped(parseRepoContents(prev.repos[actions.addRepo], actions.addRepo), parseRepoContents(curr.repos[actions.addRepo], actions.addRepo)));
}
return result;
}
function getDropped(oldRepoContents: RepoContents, newRepoContents: RepoContents): string[] {
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 parseRepoContents(repoContents: RepoContents, repository: string): PackageInfo[] {
return repoContents.packages.map(p => {
return {
version: repoContents.version,
repository,
package: p.split(`-${repoContents.version}`)[0],
architecture: p.split(`${repoContents.version}-`)[1].split('.')[0]
}
});
}
function getDropped(oldPackages: PackageInfo[], newPackages: PackageInfo[]): PackageInfo[] {
return oldPackages.filter(p => newPackages.filter(np => np.package === p.package).length === 0);
}
function isDelete(actions: Actions): boolean {
@@ -98,4 +116,4 @@ async function tryRead(file: PathLike): Promise<PkgBase | null> {
}
export { parse };
export type { Actions, Result, RepoContents, PkgBase };
export type { Actions, Result, RepoContents, PkgBase, PackageInfo };

View File

@@ -26,7 +26,14 @@ describe('pkgbase parser', () => {
const expected: Result = {
build: true,
move: false,
delete: ['pidgin'],
delete: [
{
architecture: "x86_64",
package: "pidgin",
repository: "world",
version: "2.14.14-3",
}
],
actions: {
addRepo: 'world',
removeRepo: null,
@@ -45,7 +52,12 @@ describe('pkgbase parser', () => {
const expected: Result = {
build: false,
move: true,
delete: ['opencascade'],
delete: [{
architecture: "x86_64",
package: "opencascade",
repository: "world-gremlins",
version: "1:7.9.2-1",
}],
actions: {
addRepo: 'world',
removeRepo: 'world-gremlins',
@@ -64,7 +76,26 @@ describe('pkgbase parser', () => {
const expected: Result = {
build: false,
move: true,
delete: ['pidgin', 'libpurple', 'finch'],
delete: [
{
architecture: "x86_64",
package: "pidgin",
repository: "world",
version: "2.14.14-3",
},
{
architecture: "x86_64",
package: "libpurple",
repository: "world-gremlins",
version: "2.14.14-4",
},
{
architecture: "x86_64",
package: "finch",
repository: "world-gremlins",
version: "2.14.14-4",
}
],
actions: {
addRepo: 'world',
removeRepo: 'world-gremlins',
@@ -83,7 +114,26 @@ describe('pkgbase parser', () => {
const expected: Result = {
build: false,
move: false,
delete: ['world/python-nntplib', 'world/python-cgi', 'world/python-mailcap'],
delete: [
{
architecture: "any",
package: "python-nntplib",
repository: "world",
version: "3.13.0-2",
},
{
architecture: "any",
package: "python-cgi",
repository: "world",
version: "3.13.0-2",
},
{
architecture: "any",
package: "python-mailcap",
repository: "world",
version: "3.13.0-2",
}
],
actions: {
addRepo: null,
removeRepo: 'world',