From 82550523f8f8cbb50966269c980f9babfe3fd86c Mon Sep 17 00:00:00 2001 From: janakr Date: Wed, 23 May 2018 19:48:00 -0700 Subject: Make BuildOptions$OptionsDiffForReconstruction deterministic in its construction. Also restrict visibility of some test-only OptionsDiff methods, and remove a server-specific part of the ConfiguredTargetKey #toString representation. PiperOrigin-RevId: 197830577 --- .../build/lib/analysis/config/BuildOptions.java | 33 ++++++++++++++++------ 1 file changed, 24 insertions(+), 9 deletions(-) (limited to 'src/main/java/com/google/devtools/build/lib/analysis') diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java index a91649bf30..33cd98afc3 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java @@ -426,10 +426,19 @@ public final class BuildOptions implements Cloneable, Serializable { } LinkedHashMap, Map> differingOptions = new LinkedHashMap<>(diff.differingOptions.keySet().size()); - for (Class clazz : diff.differingOptions.keySet()) { + for (Class clazz : + diff.differingOptions + .keySet() + .stream() + .sorted(lexicalFragmentOptionsComparator) + .collect(Collectors.toList())) { Collection fields = diff.differingOptions.get(clazz); LinkedHashMap valueMap = new LinkedHashMap<>(fields.size()); - for (OptionDefinition optionDefinition : fields) { + for (OptionDefinition optionDefinition : + fields + .stream() + .sorted(Comparator.comparing(o -> o.getField().getName())) + .collect(Collectors.toList())) { Object secondValue; try { secondValue = Iterables.getOnlyElement(diff.second.get(optionDefinition)); @@ -448,8 +457,14 @@ public final class BuildOptions implements Cloneable, Serializable { first.maybeInitializeFingerprintAndHashCode(); return new OptionsDiffForReconstruction( differingOptions, - ImmutableSet.copyOf(diff.extraFirstFragments), - ImmutableList.copyOf(diff.extraSecondFragments), + diff.extraFirstFragments + .stream() + .sorted(lexicalFragmentOptionsComparator) + .collect(ImmutableSet.toImmutableSet()), + diff.extraSecondFragments + .stream() + .sorted(Comparator.comparing(o -> o.getClass().getName())) + .collect(ImmutableList.toImmutableList()), first.fingerprint, second.computeChecksum()); } @@ -480,14 +495,14 @@ public final class BuildOptions implements Cloneable, Serializable { extraSecondFragments.add(options); } - /** Return the extra fragments classes from the first configuration. */ - public Set> getExtraFirstFragmentClasses() { + @VisibleForTesting + Set> getExtraFirstFragmentClassesForTesting() { return extraFirstFragments; } - /** Return the extra fragments classes from the second configuration. */ - public Set> getExtraSecondFragmentClasses() { - return extraSecondFragments.stream().map(Object::getClass).collect(Collectors.toSet()); + @VisibleForTesting + Set getExtraSecondFragmentsForTesting() { + return extraSecondFragments; } public Map getFirst() { -- cgit v1.2.3