Skip to content

Commit 38fdad0

Browse files
Merge pull request #28 from Tinder/avoid_query
Add support for `avoid_query`
2 parents c92a544 + e736e3f commit 38fdad0

File tree

10 files changed

+58
-65
lines changed

10 files changed

+58
-65
lines changed

integration/integration_test.sh

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ bazel_path=$(which bazelisk)
55

66
previous_revision="HEAD^"
77
final_revision="HEAD"
8+
output_dir=$(mktemp -d)
89
modified_filepaths_output="$PWD/integration/modified_filepaths.txt"
9-
starting_hashes_json="/tmp/starting_hashes.json"
10-
final_hashes_json="/tmp/final_hashes_json.json"
11-
impacted_targets_path="/tmp/impacted_targets.txt"
12-
impacted_test_targets_path="/tmp/impacted_test_targets.txt"
10+
starting_hashes_json="$output_dir/starting_hashes.json"
11+
final_hashes_json="$output_dir/final_hashes_json.json"
12+
impacted_targets_path="$output_dir/impacted_targets.txt"
1313

1414
export USE_BAZEL_VERSION=last_downstream_green
1515

@@ -26,31 +26,26 @@ $bazel_path run :bazel-diff -- generate-hashes -w $workspace_path -b $bazel_path
2626

2727
ruby ./integration/update_final_hashes.rb
2828

29-
$bazel_path run :bazel-diff -- -sh $starting_hashes_json -fh $final_hashes_json -w $workspace_path -b $bazel_path -o $impacted_targets_path
30-
31-
$bazel_path run :bazel-diff -- -sh $starting_hashes_json -fh $final_hashes_json -w $workspace_path -b $bazel_path -o $impacted_test_targets_path -t
29+
$bazel_path run :bazel-diff -- -sh $starting_hashes_json -fh $final_hashes_json -w $workspace_path -b $bazel_path -o $impacted_targets_path -aq "attr('tags', 'manual', //...)"
3230

3331
IFS=$'\n' read -d '' -r -a impacted_targets < $impacted_targets_path
3432
target1="//test/java/com/integration:bazel-diff-integration-test-lib"
3533
target2="//src/main/java/com/integration:bazel-diff-integration-lib"
3634
target3="//test/java/com/integration:bazel-diff-integration-tests"
35+
target4="//src/main/java/com/integration/submodule:Submodule"
3736
if containsElement $target1 "${impacted_targets[@]}" && \
3837
containsElement $target2 "${impacted_targets[@]}" && \
3938
containsElement $target3 "${impacted_targets[@]}"
4039
then
41-
echo "Correct impacted targets"
40+
if containsElement $target4 "${impacted_targets[@]}"
41+
then
42+
echo "Incorrect impacted targets: ${impacted_targets[@]}"
43+
exit 1
44+
else
45+
echo "Correct impacted targets: ${impacted_targets[@]}"
46+
exit 0
47+
fi
4248
else
4349
echo "Incorrect impacted targets: ${impacted_targets[@]}"
4450
exit 1
4551
fi
46-
47-
IFS=$'\n' read -d '' -r -a impacted_test_targets < $impacted_test_targets_path
48-
target="//test/java/com/integration:bazel-diff-integration-tests"
49-
if containsElement $target "${impacted_test_targets[@]}";
50-
then
51-
echo "Correct first impacted test target"
52-
else
53-
echo "Impacted test targets: ${impacted_test_targets[@]}"
54-
echo "Incorrect first impacted test target: ${target}"
55-
exit 1
56-
fi

integration/modified_filepaths.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
README.md
22
src/main/java/com/integration/StringGenerator.java
3+
src/main/java/com/integration/submodule/Submodule.java

integration/src/main/java/com/integration/BUILD

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,8 @@ load("@rules_java//java:defs.bzl", "java_library")
33
java_library(
44
name = "bazel-diff-integration-lib",
55
srcs = glob(["*.java"]),
6+
deps = [
7+
"//src/main/java/com/integration/submodule:Submodule"
8+
],
69
visibility = ["//visibility:public"]
710
)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
load("@rules_java//java:defs.bzl", "java_library")
2+
3+
java_library(
4+
name = "Submodule",
5+
srcs = glob(["*.java"]),
6+
tags = [
7+
"manual"
8+
],
9+
visibility = ["//visibility:public"]
10+
)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
public class Submodule {
2+
3+
}

src/main/java/com/bazel_diff/BazelClient.java

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@
2020

2121
interface BazelClient {
2222
List<BazelTarget> queryAllTargets() throws IOException;
23-
Set<String> queryForImpactedTargets(Set<String> impactedTargets) throws IOException;
24-
Set<String> queryForTestTargets(Set<String> targets) throws IOException;
23+
Set<String> queryForImpactedTargets(Set<String> impactedTargets, String avoidQuery) throws IOException;
2524
Set<BazelSourceFileTarget> convertFilepathsToSourceTargets(Set<Path> filepaths) throws IOException, NoSuchAlgorithmException;
2625
}
2726

@@ -45,24 +44,15 @@ public List<BazelTarget> queryAllTargets() throws IOException {
4544
}
4645

4746
@Override
48-
public Set<String> queryForImpactedTargets(Set<String> impactedTargets) throws IOException {
47+
public Set<String> queryForImpactedTargets(Set<String> impactedTargets, String avoidQuery) throws IOException {
4948
Set<String> impactedTestTargets = new HashSet<>();
5049
String targetQuery = impactedTargets.stream().collect(Collectors.joining(" + "));
51-
List<Build.Target> targets = performBazelQuery(String.format("rdeps(//..., %s)", targetQuery));
52-
for (Build.Target target : targets) {
53-
if (target.hasRule()) {
54-
impactedTestTargets.add(target.getRule().getName());
55-
}
50+
String query = String.format("rdeps(//..., %s)", targetQuery);
51+
if (avoidQuery != null) {
52+
query = String.format("(%s) except %s", query, avoidQuery);
5653
}
57-
return impactedTestTargets;
58-
}
59-
60-
@Override
61-
public Set<String> queryForTestTargets(Set<String> targets) throws IOException {
62-
Set<String> impactedTestTargets = new HashSet<>();
63-
String targetQuery = targets.stream().collect(Collectors.joining(" + "));
64-
List<Build.Target> testTargets = performBazelQuery(String.format("kind(test, %s)", targetQuery));
65-
for (Build.Target target : testTargets) {
54+
List<Build.Target> targets = performBazelQuery(query);
55+
for (Build.Target target : targets) {
6656
if (target.hasRule()) {
6757
impactedTestTargets.add(target.getRule().getName());
6858
}

src/main/java/com/bazel_diff/TargetHashingClient.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
import java.security.MessageDigest;
66
import java.security.NoSuchAlgorithmException;
77
import java.util.*;
8+
import java.util.stream.Collectors;
89

910
interface TargetHashingClient {
1011
Map<String, String> hashAllBazelTargets(Set<Path> modifiedFilepaths) throws IOException, NoSuchAlgorithmException;
11-
Set<String> getImpactedTargets(Map<String, String> startHashes, Map<String, String> endHashes) throws IOException;
12-
Set<String> getImpactedTestTargets(Map<String, String> startHashes, Map<String, String> endHashes) throws IOException;
12+
Set<String> getImpactedTargets(Map<String, String> startHashes, Map<String, String> endHashes, String avoidQuery) throws IOException;
1313
}
1414

1515
class TargetHashingClientImpl implements TargetHashingClient {
@@ -52,21 +52,19 @@ public Map<String, String> hashAllBazelTargets(Set<Path> modifiedFilepaths) thro
5252
}
5353

5454
@Override
55-
public Set<String> getImpactedTargets(Map<String, String> startHashes, Map<String, String> endHashes) throws IOException {
55+
public Set<String> getImpactedTargets(
56+
Map<String, String> startHashes,
57+
Map<String, String> endHashes,
58+
String avoidQuery)
59+
throws IOException {
5660
Set<String> impactedTargets = new HashSet<>();
5761
for ( Map.Entry<String,String> entry : endHashes.entrySet()) {
5862
String startHashValue = startHashes.get(entry.getKey());
5963
if (startHashValue == null || !startHashValue.equals(entry.getValue())) {
6064
impactedTargets.add(entry.getKey());
6165
}
6266
}
63-
return bazelClient.queryForImpactedTargets(impactedTargets);
64-
}
65-
66-
@Override
67-
public Set<String> getImpactedTestTargets(Map<String, String> startHashes, Map<String, String> endHashes) throws IOException {
68-
Set<String> impactedTargets = getImpactedTargets(startHashes, endHashes);
69-
return bazelClient.queryForTestTargets(impactedTargets);
67+
return bazelClient.queryForImpactedTargets(impactedTargets, avoidQuery);
7068
}
7169

7270
private MessageDigest createDigestForTarget(

src/main/java/com/bazel_diff/VersionProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
class VersionProvider implements IVersionProvider {
66
public String[] getVersion() throws Exception {
77
return new String[] {
8-
"1.2.1"
8+
"2.0.0"
99
};
1010
}
1111
}

src/main/java/com/bazel_diff/main.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,8 @@ class BazelDiff implements Callable<Integer> {
141141
@Option(names = {"-o", "--output"}, scope = ScopeType.LOCAL, description = "Filepath to write the impacted Bazel targets to, newline separated")
142142
File outputPath;
143143

144-
@Option(names = {"-t", "--tests"}, scope = ScopeType.LOCAL, description = "Return only targets of kind 'test'")
145-
boolean testTargets;
144+
@Option(names = {"-aq", "--avoid-query"}, scope = ScopeType.LOCAL, description = "A Bazel query string, any targets that pass this query will be removed from the returned set of targets")
145+
String avoidQuery;
146146

147147
@Option(names = {"-so", "--bazelStartupOptions"}, description = "Additional space separated Bazel client startup options used when invoking Bazel", scope = ScopeType.INHERIT)
148148
String bazelStartupOptions;
@@ -190,12 +190,7 @@ public Integer call() throws IOException {
190190
Map<String, String > gsonHash = new HashMap<>();
191191
Map<String, String> startingHashes = gson.fromJson(startingFileReader, gsonHash.getClass());
192192
Map<String, String> finalHashes = gson.fromJson(finalFileReader, gsonHash.getClass());
193-
Set<String> impactedTargets;
194-
if (testTargets) {
195-
impactedTargets = hashingClient.getImpactedTestTargets(startingHashes, finalHashes);
196-
} else {
197-
impactedTargets = hashingClient.getImpactedTargets(startingHashes, finalHashes);
198-
}
193+
Set<String> impactedTargets = hashingClient.getImpactedTargets(startingHashes, finalHashes, avoidQuery);
199194
try {
200195
FileWriter myWriter = new FileWriter(outputPath);
201196
myWriter.write(impactedTargets.stream().collect(Collectors.joining(System.lineSeparator())));

test/java/com/bazel_diff/TargetHashingClientImplTests.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ public void hashAllBazelTargets_sourceTargets_modifiedSources() throws IOExcepti
115115

116116
@Test
117117
public void getImpactedTargets() throws IOException {
118-
when(bazelClientMock.queryForImpactedTargets(anySet())).thenReturn(
118+
when(bazelClientMock.queryForImpactedTargets(anySet(), anyObject())).thenReturn(
119119
new HashSet<>(Arrays.asList("rule1", "rule3"))
120120
);
121121
TargetHashingClientImpl client = new TargetHashingClientImpl(bazelClientMock);
@@ -126,17 +126,17 @@ public void getImpactedTargets() throws IOException {
126126
hash2.put("rule1", "differentrule1hash");
127127
hash2.put("rule2", "rule2hash");
128128
hash2.put("rule3", "rule3hash");
129-
Set<String> impactedTargets = client.getImpactedTargets(hash1, hash2);
129+
Set<String> impactedTargets = client.getImpactedTargets(hash1, hash2, null);
130130
Set<String> expectedSet = new HashSet<>();
131131
expectedSet.add("rule1");
132132
expectedSet.add("rule3");
133133
assertEquals(expectedSet, impactedTargets);
134134
}
135135

136136
@Test
137-
public void getImpactedTestTargets() throws IOException {
138-
when(bazelClientMock.queryForTestTargets(anySet())).thenReturn(
139-
new HashSet<>(Arrays.asList("rule1test", "rule3test", "someothertest"))
137+
public void getImpactedTargets_withAvoidQuery() throws IOException {
138+
when(bazelClientMock.queryForImpactedTargets(anySet(), eq("some_query"))).thenReturn(
139+
new HashSet<>(Arrays.asList("rule1"))
140140
);
141141
TargetHashingClientImpl client = new TargetHashingClientImpl(bazelClientMock);
142142
Map<String, String> hash1 = new HashMap<>();
@@ -146,12 +146,10 @@ public void getImpactedTestTargets() throws IOException {
146146
hash2.put("rule1", "differentrule1hash");
147147
hash2.put("rule2", "rule2hash");
148148
hash2.put("rule3", "rule3hash");
149-
Set <String> impactedTestTargets = client.getImpactedTestTargets(hash1, hash2);
149+
Set<String> impactedTargets = client.getImpactedTargets(hash1, hash2, "some_query");
150150
Set<String> expectedSet = new HashSet<>();
151-
expectedSet.add("rule1test");
152-
expectedSet.add("someothertest");
153-
expectedSet.add("rule3test");
154-
assertEquals(expectedSet, impactedTestTargets);
151+
expectedSet.add("rule1");
152+
assertEquals(expectedSet, impactedTargets);
155153
}
156154

157155
private BazelTarget createRuleTarget(String ruleName, List<String> ruleInputs, String ruleDigest) throws NoSuchAlgorithmException {

0 commit comments

Comments
 (0)