Skip to content

Commit b0aa9c4

Browse files
Merge pull request #37 from Tinder/issue_34
Fix digest reset issues when using rule inputs
2 parents 0f9f17d + 07949cb commit b0aa9c4

File tree

3 files changed

+27
-23
lines changed

3 files changed

+27
-23
lines changed

integration/integration_test.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ bazel_path=$(which bazelisk)
55

66
previous_revision="HEAD^"
77
final_revision="HEAD"
8-
output_dir=$(mktemp -d)
8+
output_dir="/tmp"
99
modified_filepaths_output="$PWD/integration/modified_filepaths.txt"
1010
starting_hashes_json="$output_dir/starting_hashes.json"
1111
final_hashes_json="$output_dir/final_hashes_json.json"

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

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public Map<String, String> hashAllBazelTargets(Set<Path> modifiedFilepaths) thro
2424
Set<BazelSourceFileTarget> bazelSourcefileTargets = bazelClient.convertFilepathsToSourceTargets(modifiedFilepaths);
2525
List<BazelTarget> allTargets = bazelClient.queryAllTargets();
2626
Map<String, String> targetHashes = new HashMap<>();
27-
Map<String, MessageDigest> ruleHashes = new HashMap<>();
27+
Map<String, byte[]> ruleHashes = new HashMap<>();
2828
Map<String, BazelRule> allRulesMap = new HashMap<>();
2929
for (BazelTarget target : allTargets) {
3030
String targetName = getNameForTarget(target);
@@ -38,14 +38,14 @@ public Map<String, String> hashAllBazelTargets(Set<Path> modifiedFilepaths) thro
3838
if (targetName == null) {
3939
continue;
4040
}
41-
MessageDigest targetDigest = createDigestForTarget(
41+
byte[] targetDigest = createDigestForTarget(
4242
target,
4343
allRulesMap,
4444
bazelSourcefileTargets,
4545
ruleHashes
4646
);
4747
if (targetDigest != null) {
48-
targetHashes.put(targetName, digestToString(targetDigest));
48+
targetHashes.put(targetName, convertByteArrayToString(targetDigest));
4949
}
5050
}
5151
return targetHashes;
@@ -67,11 +67,11 @@ public Set<String> getImpactedTargets(
6767
return bazelClient.queryForImpactedTargets(impactedTargets, avoidQuery);
6868
}
6969

70-
private MessageDigest createDigestForTarget(
70+
private byte[] createDigestForTarget(
7171
BazelTarget target,
7272
Map<String, BazelRule> allRulesMap,
7373
Set<BazelSourceFileTarget> bazelSourcefileTargets,
74-
Map<String, MessageDigest> ruleHashes
74+
Map<String, byte[]> ruleHashes
7575
) throws NoSuchAlgorithmException {
7676
BazelRule targetRule = target.getRule();
7777
if (target.hasSourceFile()) {
@@ -80,23 +80,23 @@ private MessageDigest createDigestForTarget(
8080
MessageDigest digest = MessageDigest.getInstance("SHA-256");
8181
byte[] sourceTargetDigestBytes = getDigestForSourceTargetName(sourceFileName, bazelSourcefileTargets);
8282
if (sourceTargetDigestBytes != null) {
83-
digest.update(getDigestForSourceTargetName(sourceFileName, bazelSourcefileTargets));
83+
digest.update(sourceTargetDigestBytes);
8484
}
85-
return digest;
85+
return digest.digest().clone();
8686
}
8787
}
88-
return createHashForRule(targetRule, allRulesMap, ruleHashes, bazelSourcefileTargets);
88+
return createDigestForRule(targetRule, allRulesMap, ruleHashes, bazelSourcefileTargets);
8989
}
9090

91-
private MessageDigest createHashForRule(
91+
private byte[] createDigestForRule(
9292
BazelRule rule,
9393
Map<String, BazelRule> allRulesMap,
94-
Map<String, MessageDigest> ruleHashes,
94+
Map<String, byte[]> ruleHashes,
9595
Set<BazelSourceFileTarget> bazelSourcefileTargets
9696
) throws NoSuchAlgorithmException {
97-
MessageDigest existingMessage = ruleHashes.get(rule.getName());
98-
if (existingMessage != null) {
99-
return existingMessage;
97+
byte[] existingByteArray = ruleHashes.get(rule.getName());
98+
if (existingByteArray != null) {
99+
return existingByteArray;
100100
}
101101
MessageDigest digest = MessageDigest.getInstance("SHA-256");
102102
digest.update(rule.getDigest());
@@ -105,21 +105,22 @@ private MessageDigest createHashForRule(
105105
BazelRule inputRule = allRulesMap.get(ruleInput);
106106
byte[] sourceFileDigest = getDigestForSourceTargetName(ruleInput, bazelSourcefileTargets);
107107
if (inputRule != null) {
108-
MessageDigest ruleInputDigest = createHashForRule(
108+
byte[] ruleInputHash = createDigestForRule(
109109
inputRule,
110110
allRulesMap,
111111
ruleHashes,
112112
bazelSourcefileTargets
113113
);
114-
if (ruleInputDigest != null) {
115-
digest.update(ruleInputDigest.digest());
114+
if (ruleInputHash != null) {
115+
digest.update(ruleInputHash);
116116
}
117117
} else if (sourceFileDigest != null) {
118118
digest.update(sourceFileDigest);
119119
}
120120
}
121-
ruleHashes.put(rule.getName(), digest);
122-
return digest;
121+
byte[] finalHashValue = digest.digest().clone();
122+
ruleHashes.put(rule.getName(), finalHashValue);
123+
return finalHashValue;
123124
}
124125

125126
private byte[] getDigestForSourceTargetName(
@@ -134,9 +135,9 @@ private byte[] getDigestForSourceTargetName(
134135
return null;
135136
}
136137

137-
private String digestToString(MessageDigest digest) {
138+
private String convertByteArrayToString(byte[] bytes) {
138139
StringBuilder result = new StringBuilder();
139-
for (byte aByte : digest.digest()) {
140+
for (byte aByte : bytes) {
140141
result.append(String.format("%02x", aByte));
141142
}
142143
return result.toString();

test/java/com/bazel_diff/TargetHashingClientImplTests.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,17 @@ public void hashAllBazelTargets_ruleTargets_ruleInputs() throws IOException, NoS
6464
ruleInputs.add("rule1");
6565
BazelTarget rule3 = createRuleTarget("rule3", ruleInputs, "digest");
6666
defaultTargets.add(rule3);
67+
BazelTarget rule4 = createRuleTarget("rule4", ruleInputs, "digest2");
68+
defaultTargets.add(rule4);
6769
when(bazelClientMock.queryAllTargets()).thenReturn(defaultTargets);
6870
TargetHashingClientImpl client = new TargetHashingClientImpl(bazelClientMock);
6971
try {
7072
Map<String, String> hash = client.hashAllBazelTargets(new HashSet<>());
71-
assertEquals(3, hash.size());
73+
assertEquals(4, hash.size());
7274
assertEquals("2c963f7c06bc1cead7e3b4759e1472383d4469fc3238dc42f8848190887b4775", hash.get("rule1"));
7375
assertEquals("bdc1abd0a07103cea34199a9c0d1020619136ff90fb88dcc3a8f873c811c1fe9", hash.get("rule2"));
74-
assertEquals("0f34d9fff9902c8e5915d82ded7a42f714c80bc55dfc1558f743fe01c5821923", hash.get("rule3"));
76+
assertEquals("87dd050f1ca0f684f37970092ff6a02677d995718b5a05461706c0f41ffd4915", hash.get("rule3"));
77+
assertEquals("a7bc5d23cd98c4942dc879c649eb9646e38eddd773f9c7996fa0d96048cf63dc", hash.get("rule4"));
7578
} catch (IOException | NoSuchAlgorithmException e) {
7679
fail(e.getMessage());
7780
}

0 commit comments

Comments
 (0)