From dc0ef1b7e98c7f5ffd66a81f43d3333e8db6ad1b Mon Sep 17 00:00:00 2001 From: Gilles Soulier Date: Thu, 4 Jun 2026 21:03:01 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20r=C3=A9ducteur=20d=C3=A9terministe=20de?= =?UTF-8?q?=20lignes=20APT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- server/templates/aptReduce.test.ts | 29 +++++++++++++++++++++++++++++ server/templates/aptReduce.ts | 11 +++++++++++ 2 files changed, 40 insertions(+) create mode 100644 server/templates/aptReduce.test.ts create mode 100644 server/templates/aptReduce.ts diff --git a/server/templates/aptReduce.test.ts b/server/templates/aptReduce.test.ts new file mode 100644 index 0000000..759ba85 --- /dev/null +++ b/server/templates/aptReduce.test.ts @@ -0,0 +1,29 @@ +// server/templates/aptReduce.test.ts +import { describe, it, expect } from "vitest"; +import { reduceAptLines } from "./aptReduce.js"; + +describe("reduceAptLines", () => { + it("ne garde que les lignes utiles", () => { + const raw = [ + "Reading package lists...", + "Building dependency tree...", + "Inst pve-manager [8.4-1] (8.4-3 Proxmox VE:8.x [amd64])", + "blabla inutile", + "Conf pve-manager (8.4-3 Proxmox VE:8.x [amd64])", + "E: Could not get lock", + "W: Some warning", + "dpkg: warning: x", + ].join("\n"); + expect(reduceAptLines(raw)).toEqual([ + "Inst pve-manager [8.4-1] (8.4-3 Proxmox VE:8.x [amd64])", + "Conf pve-manager (8.4-3 Proxmox VE:8.x [amd64])", + "E: Could not get lock", + "W: Some warning", + "dpkg: warning: x", + ]); + }); + + it("retourne un tableau vide si rien d'utile", () => { + expect(reduceAptLines("Reading package lists...\nDone")).toEqual([]); + }); +}); diff --git a/server/templates/aptReduce.ts b/server/templates/aptReduce.ts new file mode 100644 index 0000000..544a410 --- /dev/null +++ b/server/templates/aptReduce.ts @@ -0,0 +1,11 @@ +// server/templates/aptReduce.ts +const PREFIXES = ["Inst ", "Conf ", "Remv ", "Err ", "E:", "W:", "dpkg:"]; +const CONTAINS = ["reboot-required", "REBOOT_REQUIRED"]; + +/** Garde uniquement les lignes informatives d'une sortie APT brute. */ +export function reduceAptLines(raw: string): string[] { + return raw + .split("\n") + .map((l) => l.trimEnd()) + .filter((l) => PREFIXES.some((p) => l.startsWith(p)) || CONTAINS.some((c) => l.includes(c))); +}