diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/FileStateFunction.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/FileStateFunction.java | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FileStateFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/FileStateFunction.java new file mode 100644 index 0000000000..ec2e871bbd --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/FileStateFunction.java @@ -0,0 +1,76 @@ +// Copyright 2014 Google Inc. 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.skyframe; + +import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor; +import com.google.devtools.build.lib.vfs.RootedPath; +import com.google.devtools.build.skyframe.SkyFunction; +import com.google.devtools.build.skyframe.SkyFunctionException; +import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.SkyValue; + +import java.io.IOException; + +/** + * A {@link SkyFunction} for {@link FileStateValue}s. + * + * <p>Merely calls FileStateValue#create, but also has special handling for files outside the + * package roots (see {@link ExternalFilesHelper}). + */ +public class FileStateFunction implements SkyFunction { + + private final TimestampGranularityMonitor tsgm; + private final ExternalFilesHelper externalFilesHelper; + + public FileStateFunction(TimestampGranularityMonitor tsgm, + ExternalFilesHelper externalFilesHelper) { + this.tsgm = tsgm; + this.externalFilesHelper = externalFilesHelper; + } + + @Override + public SkyValue compute(SkyKey skyKey, Environment env) throws FileStateFunctionException { + RootedPath rootedPath = (RootedPath) skyKey.argument(); + externalFilesHelper.maybeAddDepOnBuildId(rootedPath, env); + if (env.valuesMissing()) { + return null; + } + try { + return FileStateValue.create(rootedPath, tsgm); + } catch (IOException e) { + throw new FileStateFunctionException(e); + } catch (InconsistentFilesystemException e) { + throw new FileStateFunctionException(e); + } + } + + @Override + public String extractTag(SkyKey skyKey) { + return null; + } + + /** + * Used to declare all the exception types that can be wrapped in the exception thrown by + * {@link FileStateFunction#compute}. + */ + private static final class FileStateFunctionException extends SkyFunctionException { + public FileStateFunctionException(IOException e) { + super(e, Transience.TRANSIENT); + } + + public FileStateFunctionException(InconsistentFilesystemException e) { + super(e, Transience.TRANSIENT); + } + } +} |