@@ -2,59 +2,65 @@ package com.bazel_diff.bazel
22
33import com.bazel_diff.log.Logger
44import com.google.devtools.build.lib.query2.proto.proto2api.Build
5+ import java.util.Calendar
56import org.koin.core.component.KoinComponent
67import org.koin.core.component.inject
7- import java.util.Calendar
88
99class BazelClient (
10- private val useCquery : Boolean ,
11- private val fineGrainedHashExternalRepos : Set <String >,
12- private val excludeExternalTargets : Boolean
10+ private val useCquery : Boolean ,
11+ private val fineGrainedHashExternalRepos : Set <String >,
12+ private val excludeExternalTargets : Boolean
1313) : KoinComponent {
14- private val logger: Logger by inject()
15- private val queryService: BazelQueryService by inject()
14+ private val logger: Logger by inject()
15+ private val queryService: BazelQueryService by inject()
1616
17- suspend fun queryAllTargets (): List <BazelTarget > {
18- val queryEpoch = Calendar .getInstance().getTimeInMillis()
17+ suspend fun queryAllTargets (): List <BazelTarget > {
18+ val queryEpoch = Calendar .getInstance().getTimeInMillis()
1919
20- val repoTargetsQuery = if (excludeExternalTargets) emptyList() else listOf (" //external:all-targets" )
21- val targets = if (useCquery) {
22- // Explicitly listing external repos here sometimes causes issues mentioned at
23- // https://bazel.build/query/cquery#recursive-target-patterns. Hence, we query all dependencies with `deps`
24- // instead. However, we still need to append all "//external:*" targets because fine-grained hash
25- // computation depends on hashing of source files in external repos as well, which is limited to repos
26- // explicitly mentioned in `fineGrainedHashExternalRepos` flag. Therefore, for any repos not mentioned there
27- // we are still relying on the repo-generation target under `//external` to compute the hash.
28- //
29- // In addition, we must include all source dependencies in this query in order for them to show up in
30- // `configuredRuleInput`. Hence, one must not filter them out with `kind(rule, deps(..))`. However, these
31- // source targets are omitted inside BazelQueryService with the custom starlark function used to print
32- // labels.
33- (queryService.query(" deps(//...:all-targets)" , useCquery = true ) +
34- queryService.query(repoTargetsQuery.joinToString(" + " ) { " '$it '" }))
35- .distinctBy { it.rule.name }
20+ val repoTargetsQuery =
21+ if (excludeExternalTargets) emptyList() else listOf (" //external:all-targets" )
22+ val targets =
23+ if (useCquery) {
24+ // Explicitly listing external repos here sometimes causes issues mentioned at
25+ // https://bazel.build/query/cquery#recursive-target-patterns. Hence, we query all
26+ // dependencies with `deps`
27+ // instead. However, we still need to append all "//external:*" targets because
28+ // fine-grained hash
29+ // computation depends on hashing of source files in external repos as well, which is
30+ // limited to repos
31+ // explicitly mentioned in `fineGrainedHashExternalRepos` flag. Therefore, for any repos
32+ // not mentioned there
33+ // we are still relying on the repo-generation target under `//external` to compute the
34+ // hash.
35+ //
36+ // In addition, we must include all source dependencies in this query in order for them to
37+ // show up in
38+ // `configuredRuleInput`. Hence, one must not filter them out with `kind(rule, deps(..))`.
39+ // However, these
40+ // source targets are omitted inside BazelQueryService with the custom starlark function
41+ // used to print
42+ // labels.
43+ (queryService.query(" deps(//...:all-targets)" , useCquery = true ) +
44+ queryService.query(repoTargetsQuery.joinToString(" + " ) { " '$it '" }))
45+ .distinctBy { it.rule.name }
3646 } else {
37- val buildTargetsQuery = listOf (" //...:all-targets" ) + fineGrainedHashExternalRepos.map { " @$it //...:all-targets" }
38- queryService.query((repoTargetsQuery + buildTargetsQuery).joinToString(" + " ) { " '$it '" })
47+ val buildTargetsQuery =
48+ listOf (" //...:all-targets" ) +
49+ fineGrainedHashExternalRepos.map { " @$it //...:all-targets" }
50+ queryService.query((repoTargetsQuery + buildTargetsQuery).joinToString(" + " ) { " '$it '" })
3951 }
40- val queryDuration = Calendar .getInstance().getTimeInMillis() - queryEpoch
41- logger.i { " All targets queried in $queryDuration " }
42- return targets.mapNotNull { target: Build .Target ->
43- when (target.type) {
44- Build .Target .Discriminator .RULE -> BazelTarget .Rule (target)
45- Build .Target .Discriminator .SOURCE_FILE -> BazelTarget .SourceFile (
46- target
47- )
48-
49- Build .Target .Discriminator .GENERATED_FILE -> BazelTarget .GeneratedFile (
50- target
51- )
52-
53- else -> {
54- logger.w { " Unsupported target type in the build graph: ${target.type.name} " }
55- null
56- }
57- }
52+ val queryDuration = Calendar .getInstance().getTimeInMillis() - queryEpoch
53+ logger.i { " All targets queried in $queryDuration " }
54+ return targets.mapNotNull { target: Build .Target ->
55+ when (target.type) {
56+ Build .Target .Discriminator .RULE -> BazelTarget .Rule (target)
57+ Build .Target .Discriminator .SOURCE_FILE -> BazelTarget .SourceFile (target)
58+ Build .Target .Discriminator .GENERATED_FILE -> BazelTarget .GeneratedFile (target)
59+ else -> {
60+ logger.w { " Unsupported target type in the build graph: ${target.type.name} " }
61+ null
5862 }
63+ }
5964 }
65+ }
6066}
0 commit comments