From 1bc0f87fcd05c655b6f1ed0ffcabad47e8026baa Mon Sep 17 00:00:00 2001 From: Salma Samy Date: Fri, 4 Aug 2023 03:17:32 +0300 Subject: [PATCH] [6.4.0] Lockfile updates & fixes (#19153) * Add 'environ' attribute to module extensions and update lockfile - Add 'environ' to module extensions - Store the variables and their values in the lockfile - Compare the variables and values with the lockfile and re-evaluate or error if they differ PiperOrigin-RevId: 548964193 Change-Id: Ic2d52fe3332e93095c414d8bca4c9b4312bca8c2 # Conflicts: # src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleExtension.java # src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java # src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryModule.java # src/main/java/com/google/devtools/build/lib/skyframe/ActionEnvironmentFunction.java # src/main/java/com/google/devtools/build/lib/skyframe/ClientEnvironmentFunction.java # src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryModuleApi.java # src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java # src/test/java/com/google/devtools/build/lib/bazel/bzlmod/StarlarkBazelModuleTest.java # src/test/py/bazel/bzlmod/bazel_lockfile_test.py * Remove extra changes * Re-run extension if its files change fixes https://github.com/bazelbuild/bazel/issues/19068 PiperOrigin-RevId: 552823534 Change-Id: I87256b2cf954b932e24c70e22386020599f21a6f * Do not fail on new fields added to lockfile data Fixes https://github.com/bazelbuild/bazel/issues/19105 PiperOrigin-RevId: 553068023 Change-Id: I877bc8ece0641c01119a9295e09175a2d0a3a0c1 --------- Co-authored-by: Ian (Hee) Cha --- .../lib/bazel/bzlmod/BazelLockFileValue.java | 31 ++- .../lib/bazel/bzlmod/GsonTypeAdapterUtil.java | 14 + .../bazel/bzlmod/LockFileModuleExtension.java | 30 ++- .../lib/bazel/bzlmod/ModuleExtension.java | 8 +- .../bzlmod/SingleExtensionEvalFunction.java | 139 ++++++++-- .../starlark/StarlarkRepositoryModule.java | 11 + .../rules/repository/RepositoryFunction.java | 52 ++-- .../skyframe/ActionEnvironmentFunction.java | 19 +- .../skyframe/ClientEnvironmentFunction.java | 3 +- .../repository/FakeRepositoryModule.java | 3 +- .../bazel/bzlmod/StarlarkBazelModuleTest.java | 2 + .../py/bazel/bzlmod/bazel_lockfile_test.py | 249 +++++++++++++----- 12 files changed, 428 insertions(+), 133 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelLockFileValue.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelLockFileValue.java index c0d0c06aed41e4..26c674fb6bc14f 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelLockFileValue.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelLockFileValue.java @@ -109,25 +109,34 @@ public ImmutableList getModuleAndFlagsDiff( return moduleDiff.build(); } + /** Returns the differences between an extension and its locked data */ public ImmutableList getModuleExtensionDiff( - LockFileModuleExtension lockedExtension, - ImmutableMap lockedExtensionUsages, ModuleExtensionId extensionId, byte[] transitiveDigest, - ImmutableMap extensionUsages) { + boolean filesChanged, + ImmutableMap envVariables, + ImmutableMap extensionUsages, + ImmutableMap lockedExtensionUsages) { + LockFileModuleExtension lockedExtension = getModuleExtensions().get(extensionId); + ImmutableList.Builder extDiff = new ImmutableList.Builder<>(); - if (lockedExtension == null) { - extDiff.add("The module extension '" + extensionId + "' does not exist in the lockfile"); - } else { - if (!Arrays.equals(transitiveDigest, lockedExtension.getBzlTransitiveDigest())) { + if (!Arrays.equals(transitiveDigest, lockedExtension.getBzlTransitiveDigest())) { extDiff.add( "The implementation of the extension '" + extensionId + "' or one of its transitive .bzl files has changed"); - } - if (!extensionUsages.equals(lockedExtensionUsages)) { - extDiff.add("The usages of the extension named '" + extensionId + "' has changed"); - } + } + if (filesChanged) { + extDiff.add("One or more files the extension '" + extensionId + "' is using have changed"); + } + if (!extensionUsages.equals(lockedExtensionUsages)) { + extDiff.add("The usages of the extension '" + extensionId + "' has changed"); + } + if (!envVariables.equals(lockedExtension.getEnvVariables())) { + extDiff.add( + "The environment variables the extension '" + + extensionId + + "' depends on (or their values) have changed"); } return extDiff.build(); } diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/GsonTypeAdapterUtil.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/GsonTypeAdapterUtil.java index f0190f4c9fb66f..334484716f8bc2 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/GsonTypeAdapterUtil.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/GsonTypeAdapterUtil.java @@ -91,6 +91,19 @@ public ModuleKey read(JsonReader jsonReader) throws IOException { } }; + public static final TypeAdapter