diff options
Diffstat (limited to 'src/main/java')
3 files changed, 145 insertions, 6 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java index 6ebdca048b..2362cbdd35 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java @@ -18,9 +18,15 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.hash.HashCode; import com.google.devtools.build.lib.actions.Root; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.skyframe.serialization.FastStringCodec; +import com.google.devtools.build.lib.skyframe.serialization.PathCodec; import com.google.devtools.build.lib.util.StringCanonicalizer; import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.Path; +import com.google.protobuf.CodedInputStream; +import com.google.protobuf.CodedOutputStream; +import java.io.IOException; +import java.util.Objects; /** * Encapsulates the directories related to a workspace. @@ -210,4 +216,40 @@ public final class BlazeDirectories { public static String getRelativeOutputPath(String productName) { return StringCanonicalizer.intern(productName + "-out"); } + + @Override + public int hashCode() { + // execRoot is derivable from other fields, but better safe than sorry. + return Objects.hash(serverDirectories, workspace, productName, execRoot); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof BlazeDirectories)) { + return false; + } + BlazeDirectories that = (BlazeDirectories) obj; + return this.serverDirectories.equals(that.serverDirectories) + && this.workspace.equals(that.workspace) + && this.productName.equals(that.productName) + // execRoot is derivable from other fields, but better safe than sorry. + && this.execRoot.equals(that.execRoot); + } + + void serialize(CodedOutputStream codedOut, PathCodec pathCodec) throws IOException { + serverDirectories.serialize(codedOut, pathCodec); + pathCodec.serialize(workspace, codedOut); + FastStringCodec.INSTANCE.serialize(productName, codedOut); + } + + static BlazeDirectories deserialize(CodedInputStream codedIn, PathCodec pathCodec) + throws IOException { + return new BlazeDirectories( + ServerDirectories.deserialize(codedIn, pathCodec), + pathCodec.deserialize(codedIn), + FastStringCodec.INSTANCE.deserialize(codedIn)); + } } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java new file mode 100644 index 0000000000..61c3ff66be --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java @@ -0,0 +1,48 @@ +// Copyright 2017 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.analysis; + +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.PathCodec; +import com.google.protobuf.CodedInputStream; +import com.google.protobuf.CodedOutputStream; +import java.io.IOException; + +/** + * {@link ObjectCodec} for {@link BlazeDirectories}. Delegates to {@link BlazeDirectories} for + * everything. + */ +public class BlazeDirectoriesCodec implements ObjectCodec<BlazeDirectories> { + private final PathCodec pathCodec; + + public BlazeDirectoriesCodec(PathCodec pathCodec) { + this.pathCodec = pathCodec; + } + + @Override + public Class<BlazeDirectories> getEncodedClass() { + return BlazeDirectories.class; + } + + @Override + public void serialize(BlazeDirectories obj, CodedOutputStream codedOut) throws IOException { + obj.serialize(codedOut, pathCodec); + } + + @Override + public BlazeDirectories deserialize(CodedInputStream codedIn) throws IOException { + return BlazeDirectories.deserialize(codedIn, pathCodec); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java b/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java index 4c57ae6496..8c75f583d8 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java @@ -18,10 +18,14 @@ import com.google.common.base.Strings; import com.google.common.hash.HashCode; import com.google.common.hash.Hashing; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.skyframe.serialization.PathCodec; import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.Path; - +import com.google.protobuf.CodedInputStream; +import com.google.protobuf.CodedOutputStream; +import java.io.IOException; +import java.util.Objects; import javax.annotation.Nullable; /** @@ -36,19 +40,25 @@ public final class ServerDirectories { /** Where Blaze gets unpacked. */ private final Path installBase; /** The content hash of everything in installBase. */ - private final HashCode installMD5; + @Nullable private final HashCode installMD5; /** The root of the temp and output trees. */ private final Path outputBase; public ServerDirectories(Path installBase, Path outputBase, @Nullable String installMD5) { + this( + installBase, + outputBase, + Strings.isNullOrEmpty(installMD5) ? null : checkMD5(HashCode.fromString(installMD5))); + } + + private ServerDirectories(Path installBase, Path outputBase, HashCode installMD5) { this.installBase = installBase; this.outputBase = outputBase; - this.installMD5 = - Strings.isNullOrEmpty(installMD5) ? null : checkMD5(HashCode.fromString(installMD5)); + this.installMD5 = installMD5; } public ServerDirectories(Path installBase, Path outputBase) { - this(installBase, outputBase, null); + this(installBase, outputBase, (HashCode) null); } private static HashCode checkMD5(HashCode hash) { @@ -95,4 +105,43 @@ public final class ServerDirectories { public HashCode getInstallMD5() { return installMD5; } -}
\ No newline at end of file + + @Override + public int hashCode() { + return Objects.hash(installBase, installMD5, outputBase); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof ServerDirectories)) { + return false; + } + ServerDirectories that = (ServerDirectories) obj; + return this.installBase.equals(that.installBase) + && Objects.equals(this.installMD5, that.installMD5) + && this.outputBase.equals(that.outputBase); + } + + void serialize(CodedOutputStream out, PathCodec pathCodec) throws IOException { + pathCodec.serialize(installBase, out); + out.writeBoolNoTag(installMD5 != null); + if (installMD5 != null) { + out.writeByteArrayNoTag(installMD5.asBytes()); + } + pathCodec.serialize(outputBase, out); + } + + static ServerDirectories deserialize(CodedInputStream in, PathCodec pathCodec) + throws IOException { + Path installBase = pathCodec.deserialize(in); + HashCode installMd5 = null; + if (in.readBool()) { + installMd5 = HashCode.fromBytes(in.readByteArray()); + } + Path outputBase = pathCodec.deserialize(in); + return new ServerDirectories(installBase, outputBase, installMd5); + } +} |