From b67727e01a1532edc5885c908b5da438b188e34a Mon Sep 17 00:00:00 2001 From: Stephen Edwards Date: Fri, 27 Mar 2026 16:29:56 -0400 Subject: [PATCH] Add opt-out for aggregate stats SARIF Amp-Thread-ID: https://ampcode.com/threads/T-019d30eb-44de-7138-b4e3-bff8deec485a Co-authored-by: Amp --- README.md | 3 +++ .../com/squareup/invert/InvertExtension.kt | 12 +++++++++ .../internal/report/InvertReportWriter.kt | 15 +++++++---- .../invert/internal/tasks/InvertTask.kt | 5 ++++ .../internal/report/InvertReportWriterTest.kt | 27 ++++++++++++++++++- 5 files changed, 56 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 1d218ce..b1d6a70 100644 --- a/README.md +++ b/README.md @@ -127,6 +127,9 @@ invert { configurationNames } ownershipCollector(<>) + // Optional: disable only the aggregate `sarif/stats.sarif` artifact for very large repos. + // Per-stat `sarif/code_references_*.sarif` artifacts are still generated. + aggregateStatsSarifReport(false) } ``` diff --git a/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/InvertExtension.kt b/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/InvertExtension.kt index 657bb09..4c007f7 100644 --- a/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/InvertExtension.kt +++ b/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/InvertExtension.kt @@ -57,6 +57,10 @@ open class InvertExtension(project: Project) { @get:Input internal val historicalDataFileProperty = objects.property(String::class.java) + @get:Input + internal val aggregateStatsSarifReportEnabledProperty = + objects.property(Boolean::class.java).convention(true) + fun ownershipCollector(ownershipCollector: InvertOwnershipCollector) { ownershipCollectorProperty.set(ownershipCollector) } @@ -65,6 +69,10 @@ open class InvertExtension(project: Project) { this.historicalDataFileProperty.set(historicalDataFile) } + fun aggregateStatsSarifReport(enabled: Boolean) { + aggregateStatsSarifReportEnabledProperty.set(enabled) + } + fun includeSubproject(invertShouldIncludeSubProject: (subproject: Project) -> Boolean) { includeSubProjectCalculatorProperty.set(object : InvertIncludeSubProjectCalculator { override fun invoke( @@ -103,6 +111,10 @@ open class InvertExtension(project: Project) { return historicalDataFileProperty.orNull } + internal fun isAggregateStatsSarifReportEnabled(): Boolean { + return aggregateStatsSarifReportEnabledProperty.getOrElse(true) + } + internal fun getStatCollectors(): Collection { return statCollectors } diff --git a/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/internal/report/InvertReportWriter.kt b/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/internal/report/InvertReportWriter.kt index d4064ad..e555c30 100644 --- a/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/internal/report/InvertReportWriter.kt +++ b/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/internal/report/InvertReportWriter.kt @@ -37,7 +37,8 @@ class InvertReportWriter( reportMetadata: MetadataJsReportModel, collectedData: InvertCombinedCollectedData, historicalData: Set, - techDebtInitiatives: List + techDebtInitiatives: List, + aggregateStatsSarifReportEnabled: Boolean = true, ) { val collectedOwners: Set = collectedData.collectedOwners val collectedStats: Set = collectedData.collectedStats @@ -78,10 +79,14 @@ class InvertReportWriter( historicalData = historicalDataWithCurrent, ) - // Include all stats into one SARIF report. - InvertSarifReportWriter(invertLogger, rootBuildReportsDir).createInvertSarifReport( - allProjectsStatsData = allProjectsStatsData - ) + if (aggregateStatsSarifReportEnabled) { + // Include all stats into one SARIF report. + InvertSarifReportWriter(invertLogger, rootBuildReportsDir).createInvertSarifReport( + allProjectsStatsData = allProjectsStatsData + ) + } else { + invertLogger.info("Skipping aggregate stats.sarif generation.") + } // HTML/JS Report InvertJsReportWriter(invertLogger, rootBuildReportsDir).createInvertHtmlReport( diff --git a/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/internal/tasks/InvertTask.kt b/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/internal/tasks/InvertTask.kt index 9663842..526b120 100644 --- a/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/internal/tasks/InvertTask.kt +++ b/invert-gradle-plugin/src/main/kotlin/com/squareup/invert/internal/tasks/InvertTask.kt @@ -85,6 +85,9 @@ abstract class InvertTask : DefaultTask() { @get:Input abstract val mavenRepoUrls: ListProperty + @get:Input + abstract val aggregateStatsSarifReportEnabled: Property + @get:OutputDirectory abstract val rootBuildReportsDir: DirectoryProperty @@ -151,6 +154,7 @@ abstract class InvertTask : DefaultTask() { collectedData = allCollectedData, historicalData = historicalData, techDebtInitiatives = techDebtInitiatives ?: emptyList(), + aggregateStatsSarifReportEnabled = aggregateStatsSarifReportEnabled.get(), ) } } @@ -179,6 +183,7 @@ abstract class InvertTask : DefaultTask() { this.statCollectors = extension.getStatCollectors().toList() this.techDebtInitiatives = extension.getTechDebtInitiatives().toList() this.ownershipCollector = extension.getOwnershipCollector() + this.aggregateStatsSarifReportEnabled.set(extension.isAggregateStatsSarifReportEnabled()) this.mavenRepoUrls.set( project.rootProject.buildscript.repositories diff --git a/invert-gradle-plugin/src/test/kotlin/com/squareup/invert/internal/report/InvertReportWriterTest.kt b/invert-gradle-plugin/src/test/kotlin/com/squareup/invert/internal/report/InvertReportWriterTest.kt index ca9991a..dc8e840 100644 --- a/invert-gradle-plugin/src/test/kotlin/com/squareup/invert/internal/report/InvertReportWriterTest.kt +++ b/invert-gradle-plugin/src/test/kotlin/com/squareup/invert/internal/report/InvertReportWriterTest.kt @@ -101,6 +101,31 @@ class InvertReportWriterTest { assertTrue(content.contains("\"text\":\"test code\""), "Should contain code snippet") } + @Test + fun `test writeProjectData can skip aggregate stats sarif while preserving code reference sarif`() { + // Given + val writer = InvertReportWriter(logger, testDir) + val testMetadata = createTestMetadata() + val testCollectedData = createCollectedDataWithCodeReferences() + + // When + writer.writeProjectData( + reportMetadata = testMetadata, + collectedData = testCollectedData, + historicalData = emptySet(), + techDebtInitiatives = emptyList(), + aggregateStatsSarifReportEnabled = false, + ) + + // Then + val sarifDir = File(testDir, "sarif") + assertFalse(File(sarifDir, "stats.sarif").exists(), "Aggregate stats SARIF file should not be created") + assertTrue( + File(sarifDir, "code_references_test_code_ref_stat.sarif").exists(), + "Code references SARIF file should still be created" + ) + } + @Test fun `test writeProjectData includes module and owner in code reference extras`() { // Given @@ -626,4 +651,4 @@ class InvertReportWriterTest { ) ) } -} \ No newline at end of file +}