From 93fe20ce350e813caa53049a97f04014e0169df3 Mon Sep 17 00:00:00 2001 From: Klaus Aehlig Date: Thu, 14 Jun 2018 05:48:46 -0700 Subject: Support unconditional fetching of repositories Make all external repositories depend on an additional SkyValue controllable via commands, so support unconditional fetching of all external repositories, as it is needed by the the `sync` command. Improves on #5175, provides a work around for #4907. Change-Id: I30033614c1a2fad3f1363b85ff69cf92f697c255 PiperOrigin-RevId: 200543985 --- .../build/lib/bazel/BazelRepositoryModule.java | 7 ++++++- .../devtools/build/lib/bazel/commands/SyncCommand.java | 8 ++++++++ .../rules/repository/RepositoryDelegatorFunction.java | 18 +++++++++++++++--- .../lib/skyframe/packages/BazelPackageLoader.java | 5 ++++- 4 files changed, 33 insertions(+), 5 deletions(-) (limited to 'src/main/java/com/google/devtools/build/lib') diff --git a/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java b/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java index 6d486b0f65..e336b3adc9 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java @@ -293,7 +293,12 @@ public class BazelRepositoryModule extends BlazeModule { @Override public ImmutableList getPrecomputedValues() { return ImmutableList.of( - PrecomputedValue.injected(RepositoryDelegatorFunction.REPOSITORY_OVERRIDES, overrides)); + PrecomputedValue.injected(RepositoryDelegatorFunction.REPOSITORY_OVERRIDES, overrides), + // That key will be reinjected by the sync command with a universally unique identifier. + // Nevertheless, we need to provide a default value for other commands. + PrecomputedValue.injected( + RepositoryDelegatorFunction.DEPENDENCY_FOR_UNCONDITIONAL_FETCHING, + RepositoryDelegatorFunction.DONT_FETCH_UNCONDITIONALLY)); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java b/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java index c5c30852fa..e9f2183df3 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java @@ -13,12 +13,14 @@ // limitations under the License. package com.google.devtools.build.lib.bazel.commands; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.pkgcache.PackageCacheOptions; +import com.google.devtools.build.lib.rules.repository.RepositoryDelegatorFunction; import com.google.devtools.build.lib.rules.repository.RepositoryDirectoryValue; import com.google.devtools.build.lib.runtime.BlazeCommand; import com.google.devtools.build.lib.runtime.BlazeCommandResult; @@ -26,6 +28,7 @@ import com.google.devtools.build.lib.runtime.Command; import com.google.devtools.build.lib.runtime.CommandEnvironment; import com.google.devtools.build.lib.runtime.KeepGoingOption; import com.google.devtools.build.lib.skyframe.PackageLookupValue; +import com.google.devtools.build.lib.skyframe.PrecomputedValue; import com.google.devtools.build.lib.skyframe.SkyframeExecutor; import com.google.devtools.build.lib.skyframe.WorkspaceFileValue; import com.google.devtools.build.lib.util.AbruptExitException; @@ -55,6 +58,11 @@ public final class SyncCommand implements BlazeCommand { try { env.setupPackageCache(options, env.getRuntime().getDefaultsPackageContent()); SkyframeExecutor skyframeExecutor = env.getSkyframeExecutor(); + skyframeExecutor.injectExtraPrecomputedValues( + ImmutableList.of( + PrecomputedValue.injected( + RepositoryDelegatorFunction.DEPENDENCY_FOR_UNCONDITIONAL_FETCHING, + env.getCommandId().toString()))); // Obtain the key for the top-level WORKSPACE file SkyKey packageLookupKey = PackageLookupValue.key(Label.EXTERNAL_PACKAGE_IDENTIFIER); diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java index db74f31652..a590c0bfb6 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java @@ -56,6 +56,12 @@ public final class RepositoryDelegatorFunction implements SkyFunction { public static final Precomputed> REPOSITORY_OVERRIDES = new Precomputed<>(PrecomputedValue.Key.create("repository_overrides")); + public static final Precomputed DEPENDENCY_FOR_UNCONDITIONAL_FETCHING = + new Precomputed<>( + PrecomputedValue.Key.create("dependency_for_unconditional_repository_fetching")); + + public static final String DONT_FETCH_UNCONDITIONALLY = ""; + // The marker file version is inject in the rule key digest so the rule key is always different // when we decide to update the format. private static final int MARKER_FILE_VERSION = 3; @@ -107,6 +113,10 @@ public final class RepositoryDelegatorFunction implements SkyFunction { if (env.valuesMissing()) { return null; } + String fetchUnconditionally = DEPENDENCY_FOR_UNCONDITIONAL_FETCHING.get(env); + if (env.valuesMissing()) { + return null; + } Path repoRoot = RepositoryFunction.getExternalRepositoryDirectory(directories) .getRelative(repositoryName.strippedName()); @@ -170,9 +180,11 @@ public final class RepositoryDelegatorFunction implements SkyFunction { if (env.valuesMissing()) { return null; } - if (markerHash != null && repoRoot.exists()) { - // Now that we know that it exists, we can declare a Skyframe dependency on the repository - // root. + if (DONT_FETCH_UNCONDITIONALLY.equals(fetchUnconditionally) + && markerHash != null + && repoRoot.exists()) { + // Now that we know that it exists and that we should not fetch unconditionally, we can + // declare a Skyframe dependency on the repository root. RepositoryFunction.getRepositoryDirectory(repoRoot, env); if (env.valuesMissing()) { return null; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java index ac55f39897..a92d08032b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java @@ -101,7 +101,10 @@ public class BazelPackageLoader extends AbstractPackageLoader { PrecomputedValue.injected(PrecomputedValue.ACTION_ENV, ImmutableMap.of()), PrecomputedValue.injected( RepositoryDelegatorFunction.REPOSITORY_OVERRIDES, - Suppliers.ofInstance(ImmutableMap.of()))); + Suppliers.ofInstance(ImmutableMap.of())), + PrecomputedValue.injected( + RepositoryDelegatorFunction.DEPENDENCY_FOR_UNCONDITIONAL_FETCHING, + RepositoryDelegatorFunction.DONT_FETCH_UNCONDITIONALLY)); return builder; } -- cgit v1.2.3