From 71aed29559f632f7acdfeb03621418eb16bd61c0 Mon Sep 17 00:00:00 2001 From: blockjon-dd Date: Mon, 30 Jun 2025 17:19:57 -0400 Subject: [PATCH 1/2] Allow the list of fine grained hashes to be defined by a file --- .../com/bazel_diff/cli/GenerateHashesCommand.kt | 8 ++++++++ cli/src/main/kotlin/com/bazel_diff/di/Modules.kt | 13 ++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/cli/src/main/kotlin/com/bazel_diff/cli/GenerateHashesCommand.kt b/cli/src/main/kotlin/com/bazel_diff/cli/GenerateHashesCommand.kt index 17046ae..a43a7cd 100644 --- a/cli/src/main/kotlin/com/bazel_diff/cli/GenerateHashesCommand.kt +++ b/cli/src/main/kotlin/com/bazel_diff/cli/GenerateHashesCommand.kt @@ -78,6 +78,13 @@ class GenerateHashesCommand : Callable { ) var fineGrainedHashExternalRepos: Set = emptySet() + @CommandLine.Option( + names = ["--fineGrainedHashExternalReposFile"], + description = + [ + "A text file containing a newline separated list of external repos. Similar to --fineGrainedHashExternalRepos but helps you avoid exceeding max arg length. Using this option supersedes the --fineGrainedHashExternalRepos flag."]) + var fineGrainedHashExternalReposFile: File? = null + @CommandLine.Option( names = ["--useCquery"], negatable = true, @@ -192,6 +199,7 @@ class GenerateHashesCommand : Callable { keepGoing, depsMappingJSONPath != null, fineGrainedHashExternalRepos, + fineGrainedHashExternalReposFile, excludeExternalTargets, ), loggingModule(parent.verbose), diff --git a/cli/src/main/kotlin/com/bazel_diff/di/Modules.kt b/cli/src/main/kotlin/com/bazel_diff/di/Modules.kt index 7efb826..cc5bf66 100644 --- a/cli/src/main/kotlin/com/bazel_diff/di/Modules.kt +++ b/cli/src/main/kotlin/com/bazel_diff/di/Modules.kt @@ -30,8 +30,15 @@ fun hasherModule( keepGoing: Boolean, trackDeps: Boolean, fineGrainedHashExternalRepos: Set, + fineGrainedHashExternalReposFile: File?, excludeExternalTargets: Boolean, ): Module = module { + val updatedFineGrainedHashExternalRepos = fineGrainedHashExternalReposFile?.let { file -> + file.readLines() + .filter { it.isNotBlank() } + .toSet() + } ?: fineGrainedHashExternalRepos + val cmd: MutableList = ArrayList().apply { add(bazelPath.toString()) @@ -60,11 +67,11 @@ fun hasherModule( keepGoing, debug) } - single { BazelClient(useCquery, fineGrainedHashExternalRepos, excludeExternalTargets) } + single { BazelClient(useCquery, updatedFineGrainedHashExternalRepos, excludeExternalTargets) } single { BuildGraphHasher(get()) } single { TargetHasher() } - single { RuleHasher(useCquery, trackDeps, fineGrainedHashExternalRepos) } - single { SourceFileHasherImpl(fineGrainedHashExternalRepos) } + single { RuleHasher(useCquery, trackDeps, updatedFineGrainedHashExternalRepos) } + single { SourceFileHasherImpl(updatedFineGrainedHashExternalRepos) } single { ExternalRepoResolver(workingDirectory, bazelPath, outputPath) } single(named("working-directory")) { workingDirectory } single(named("output-base")) { outputPath } From 985c36ab604a70a5322268d0925dab11a5b97549 Mon Sep 17 00:00:00 2001 From: blockjon-dd Date: Mon, 30 Jun 2025 18:33:27 -0400 Subject: [PATCH 2/2] Make the flags mutually exclusive --- .../main/kotlin/com/bazel_diff/cli/GenerateHashesCommand.kt | 2 +- cli/src/main/kotlin/com/bazel_diff/di/Modules.kt | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/cli/src/main/kotlin/com/bazel_diff/cli/GenerateHashesCommand.kt b/cli/src/main/kotlin/com/bazel_diff/cli/GenerateHashesCommand.kt index a43a7cd..f6f3e8e 100644 --- a/cli/src/main/kotlin/com/bazel_diff/cli/GenerateHashesCommand.kt +++ b/cli/src/main/kotlin/com/bazel_diff/cli/GenerateHashesCommand.kt @@ -82,7 +82,7 @@ class GenerateHashesCommand : Callable { names = ["--fineGrainedHashExternalReposFile"], description = [ - "A text file containing a newline separated list of external repos. Similar to --fineGrainedHashExternalRepos but helps you avoid exceeding max arg length. Using this option supersedes the --fineGrainedHashExternalRepos flag."]) + "A text file containing a newline separated list of external repos. Similar to --fineGrainedHashExternalRepos but helps you avoid exceeding max arg length. Mutually exclusive with --fineGrainedHashExternalRepos."]) var fineGrainedHashExternalReposFile: File? = null @CommandLine.Option( diff --git a/cli/src/main/kotlin/com/bazel_diff/di/Modules.kt b/cli/src/main/kotlin/com/bazel_diff/di/Modules.kt index cc5bf66..0ac7075 100644 --- a/cli/src/main/kotlin/com/bazel_diff/di/Modules.kt +++ b/cli/src/main/kotlin/com/bazel_diff/di/Modules.kt @@ -33,6 +33,10 @@ fun hasherModule( fineGrainedHashExternalReposFile: File?, excludeExternalTargets: Boolean, ): Module = module { + if (fineGrainedHashExternalReposFile != null && fineGrainedHashExternalRepos.isNotEmpty()) { + System.err.println("Error: fineGrainedHashExternalReposFile and fineGrainedHashExternalRepos are mutually exclusive - please provide only one of them") + System.exit(1) + } val updatedFineGrainedHashExternalRepos = fineGrainedHashExternalReposFile?.let { file -> file.readLines() .filter { it.isNotBlank() }