// Copyright 2014 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.skyframe; import com.google.devtools.build.lib.vfs.ModifiedFileSet; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.common.options.OptionsClassProvider; import java.io.Closeable; import javax.annotation.Nullable; /** * Interface for computing modifications of files under a package path entry. * * <p> Skyframe has a {@link DiffAwareness} instance per package-path entry, and each instance is * responsible for all files under its path entry. At the beginning of each incremental build, * skyframe queries for changes using {@link #getDiff}. Ideally, {@link #getDiff} should be * constant-time; if it were linear in the number of files of interest, we might as well just * detect modifications manually. */ public interface DiffAwareness extends Closeable { /** Factory for creating {@link DiffAwareness} instances. */ public interface Factory { /** * Returns a {@link DiffAwareness} instance suitable for managing changes to files under the * given package path entry, or {@code null} if this factory cannot create such an instance. * * <p> Skyframe has a collection of factories, and will create a {@link DiffAwareness} instance * per package path entry using one of the factories that returns a non-null value. */ @Nullable DiffAwareness maybeCreate(Path pathEntry); } /** Opaque view of the filesystem under a package path entry at a specific point in time. */ interface View { } /** * Returns the live view of the filesystem under the package path entry. * * @throws BrokenDiffAwarenessException if something is wrong and the caller should discard this * {@link DiffAwareness} instance. The {@link DiffAwareness} is expected to close itself in * this case. */ View getCurrentView(OptionsClassProvider options) throws BrokenDiffAwarenessException; /** * Returns the set of files of interest that have been modified between the given two views. * * <p>The given views must have come from previous calls to {@link #getCurrentView} on the * {@link DiffAwareness} instance (i.e. using a {@link View} from another instance is not * supported). * * @throws IncompatibleViewException if the given views are not compatible with this * {@link DiffAwareness} instance. This probably indicates a bug. * @throws BrokenDiffAwarenessException if something is wrong and the caller should discard this * {@link DiffAwareness} instance. The {@link DiffAwareness} is expected to close itself in * this case. */ ModifiedFileSet getDiff(View oldView, View newView) throws IncompatibleViewException, BrokenDiffAwarenessException; /** @return the name of this implementation */ String name(); /** * Must be called whenever the {@link DiffAwareness} object is to be discarded. Using a * {@link DiffAwareness} instance after calling {@link #close} on it is unspecified behavior. */ @Override void close(); }