From f28ae29755c34b72a5479615de5b46ed5d678848 Mon Sep 17 00:00:00 2001 From: Ian Leitch Date: Sun, 9 Jun 2024 11:36:28 +0200 Subject: [PATCH] Carry over previous baseline when reading and writing --- Sources/Frontend/Commands/ScanBehavior.swift | 15 ++++++++++++--- Sources/PeripheryKit/Results/Baseline.swift | 2 +- .../Results/OutputDeclarationFilter.swift | 6 ++---- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Sources/Frontend/Commands/ScanBehavior.swift b/Sources/Frontend/Commands/ScanBehavior.swift index 37d19e123..d1c0b2524 100644 --- a/Sources/Frontend/Commands/ScanBehavior.swift +++ b/Sources/Frontend/Commands/ScanBehavior.swift @@ -63,14 +63,23 @@ final class ScanBehavior { results = try block(project) let interval = logger.beginInterval("result:output") - let filteredResults = try OutputDeclarationFilter().filter(results) + var baseline: Baseline? + + if let baselinePath = configuration.baseline { + let data = try Data(contentsOf: baselinePath.url) + baseline = try JSONDecoder().decode(Baseline.self, from: data) + } + + let filteredResults = try OutputDeclarationFilter().filter(results, with: baseline) if configuration.autoRemove { try ScanResultRemover().remove(results: filteredResults) } - if !filteredResults.isEmpty, let baselinePath = configuration.writeBaseline { - let usrs = filteredResults.flatMapSet { $0.usrs } + if let baselinePath = configuration.writeBaseline { + let usrs = filteredResults + .flatMapSet { $0.usrs } + .union(baseline?.usrs ?? []) let baseline = Baseline.v1(usrs: usrs.sorted()) let data = try JSONEncoder().encode(baseline) try data.write(to: baselinePath.url) diff --git a/Sources/PeripheryKit/Results/Baseline.swift b/Sources/PeripheryKit/Results/Baseline.swift index ca764091d..8a6fb5ae8 100644 --- a/Sources/PeripheryKit/Results/Baseline.swift +++ b/Sources/PeripheryKit/Results/Baseline.swift @@ -4,7 +4,7 @@ import Foundation public enum Baseline: Codable { case v1(usrs: [String]) - var usrs: Set { + public var usrs: Set { switch self { case .v1(let usrs): return Set(usrs) diff --git a/Sources/PeripheryKit/Results/OutputDeclarationFilter.swift b/Sources/PeripheryKit/Results/OutputDeclarationFilter.swift index 8997fecd4..745a24ff7 100644 --- a/Sources/PeripheryKit/Results/OutputDeclarationFilter.swift +++ b/Sources/PeripheryKit/Results/OutputDeclarationFilter.swift @@ -14,12 +14,10 @@ public final class OutputDeclarationFilter { self.contextualLogger = logger.contextualized(with: "report:filter") } - public func filter(_ declarations: [ScanResult]) throws -> [ScanResult] { + public func filter(_ declarations: [ScanResult], with baseline: Baseline?) throws -> [ScanResult] { var declarations = declarations - if let baselinePath = configuration.baseline { - let data = try Data(contentsOf: baselinePath.url) - let baseline = try JSONDecoder().decode(Baseline.self, from: data) + if let baseline { var didFilterDeclaration = false declarations = declarations.filter { let isDisjoint = $0.usrs.isDisjoint(with: baseline.usrs)