From aecda429ac6e8b4c71b6695d9d7dbaeb7df49dc7 Mon Sep 17 00:00:00 2001 From: Cedric Champeau Date: Wed, 22 Jan 2020 18:02:35 +0100 Subject: [PATCH] Fix incorrect Gradle root build directory location This would cause a couple of bugs: - a `gradle` directory would be created for each build even if they didn't have one - a `gradle` directory would be created for subprojects if the gradle command was executed from this directory (#11971) In addition, this would cause the verification metadata file to be ignored if running from a subproject directory. --- ...dScriptExecutionFromSubDirIntegTest.groovy | 44 +++++++++++++++++++ ...ependencyManagementBuildScopeServices.java | 13 ++++-- .../StartParameterResolutionOverride.java | 11 ++--- .../DependencyVerificationOverride.java | 13 +----- .../WriteDependencyVerificationFile.java | 10 +++-- .../RepositoryTransportFactoryTest.groovy | 2 +- 6 files changed, 68 insertions(+), 25 deletions(-) create mode 100644 subprojects/core/src/integTest/groovy/org/gradle/api/GradleBuildScriptExecutionFromSubDirIntegTest.groovy diff --git a/subprojects/core/src/integTest/groovy/org/gradle/api/GradleBuildScriptExecutionFromSubDirIntegTest.groovy b/subprojects/core/src/integTest/groovy/org/gradle/api/GradleBuildScriptExecutionFromSubDirIntegTest.groovy new file mode 100644 index 000000000000..a909d3ebd6b6 --- /dev/null +++ b/subprojects/core/src/integTest/groovy/org/gradle/api/GradleBuildScriptExecutionFromSubDirIntegTest.groovy @@ -0,0 +1,44 @@ +/* + * Copyright 2020 the original author or authors. + * + * 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 org.gradle.api + +import org.gradle.integtests.fixtures.AbstractIntegrationSpec +import org.gradle.integtests.fixtures.ToBeFixedForInstantExecution + +class GradleBuildScriptExecutionFromSubDirIntegTest extends AbstractIntegrationSpec { + + @ToBeFixedForInstantExecution + def "shouldn't create a gradle directory within the invocation directory"() { + buildFile << """ + tasks.register("checkDir") { + doLast { + println file("tmp/gradle") + } + } + """ + settingsFile << "include 'tmp'" + + when: + def subdir = file("tmp") + subdir.mkdirs() + executer.inDirectory(subdir) + succeeds ':checkDir' + + then: + subdir.listFiles().length == 0 + } +} diff --git a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/DependencyManagementBuildScopeServices.java b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/DependencyManagementBuildScopeServices.java index 8f3284491377..22fb7fec85b3 100644 --- a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/DependencyManagementBuildScopeServices.java +++ b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/DependencyManagementBuildScopeServices.java @@ -102,6 +102,8 @@ import org.gradle.cache.internal.InMemoryCacheDecoratorFactory; import org.gradle.cache.internal.ProducerGuard; import org.gradle.initialization.ProjectAccessListener; +import org.gradle.initialization.layout.BuildLayoutConfiguration; +import org.gradle.initialization.layout.BuildLayoutFactory; import org.gradle.internal.build.BuildState; import org.gradle.internal.build.BuildStateRegistry; import org.gradle.internal.component.external.model.ModuleComponentArtifactMetadata; @@ -134,6 +136,7 @@ import org.gradle.util.BuildCommencedTimeProvider; import org.gradle.util.internal.SimpleMapInterner; +import java.io.File; import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -314,8 +317,8 @@ RepositoryTransportFactory createRepositoryTransportFactory(StartParameter start BuildOperationExecutor buildOperationExecutor, ProducerGuard producerGuard, FileResourceRepository fileResourceRepository, - ChecksumService checksumService) { - StartParameterResolutionOverride startParameterResolutionOverride = new StartParameterResolutionOverride(startParameter); + ChecksumService checksumService, + StartParameterResolutionOverride startParameterResolutionOverride) { return new RepositoryTransportFactory( resourceConnectorFactories, progressLoggerFactory, @@ -334,8 +337,10 @@ RepositoryBlacklister createRepositoryBlacklister() { return new ConnectionFailureRepositoryBlacklister(); } - StartParameterResolutionOverride createStartParameterResolutionOverride(StartParameter startParameter) { - return new StartParameterResolutionOverride(startParameter); + StartParameterResolutionOverride createStartParameterResolutionOverride(StartParameter startParameter, BuildLayoutFactory buildLayoutFactory) { + File rootDirectory = buildLayoutFactory.getLayoutFor(new BuildLayoutConfiguration(startParameter)).getRootDirectory(); + File gradleDir = new File(rootDirectory, "gradle"); + return new StartParameterResolutionOverride(startParameter, gradleDir); } DependencyVerificationOverride createDependencyVerificationOverride(StartParameterResolutionOverride startParameterResolutionOverride, BuildOperationExecutor buildOperationExecutor, ChecksumService checksumService) { diff --git a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/ivyresolve/StartParameterResolutionOverride.java b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/ivyresolve/StartParameterResolutionOverride.java index 70e1b24b5421..d1667bdd65ae 100644 --- a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/ivyresolve/StartParameterResolutionOverride.java +++ b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/ivyresolve/StartParameterResolutionOverride.java @@ -18,7 +18,6 @@ import org.gradle.StartParameter; import org.gradle.api.artifacts.component.ModuleComponentIdentifier; import org.gradle.api.internal.artifacts.configurations.dynamicversion.CachePolicy; -import org.gradle.internal.hash.ChecksumService; import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.verification.ChecksumVerificationOverride; import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.verification.DependencyVerificationOverride; import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.verification.WriteDependencyVerificationFile; @@ -32,6 +31,7 @@ import org.gradle.internal.component.model.ComponentResolveMetadata; import org.gradle.internal.component.model.ConfigurationMetadata; import org.gradle.internal.component.model.ModuleSources; +import org.gradle.internal.hash.ChecksumService; import org.gradle.internal.operations.BuildOperationExecutor; import org.gradle.internal.resolve.ArtifactResolveException; import org.gradle.internal.resolve.ModuleVersionResolveException; @@ -54,9 +54,11 @@ public class StartParameterResolutionOverride { private final StartParameter startParameter; + private final File gradleDir; - public StartParameterResolutionOverride(StartParameter startParameter) { + public StartParameterResolutionOverride(StartParameter startParameter, File gradleDir) { this.startParameter = startParameter; + this.gradleDir = gradleDir; } public void applyToCachePolicy(CachePolicy cachePolicy) { @@ -75,13 +77,12 @@ public ModuleComponentRepository overrideModuleVersionRepository(ModuleComponent } public DependencyVerificationOverride dependencyVerificationOverride(BuildOperationExecutor buildOperationExecutor, ChecksumService checksumService) { - File currentDir = startParameter.getCurrentDir(); List checksums = startParameter.getWriteDependencyVerifications(); if (!checksums.isEmpty()) { SingleMessageLogger.incubatingFeatureUsed("Dependency verification"); - return new WriteDependencyVerificationFile(currentDir, buildOperationExecutor, checksums, checksumService); + return new WriteDependencyVerificationFile(gradleDir, buildOperationExecutor, checksums, checksumService); } else { - File verificationsFile = DependencyVerificationOverride.dependencyVerificationsFile(currentDir); + File verificationsFile = DependencyVerificationOverride.dependencyVerificationsFile(gradleDir); if (verificationsFile.exists()) { SingleMessageLogger.incubatingFeatureUsed("Dependency verification"); return new ChecksumVerificationOverride(buildOperationExecutor, verificationsFile, checksumService); diff --git a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/ivyresolve/verification/DependencyVerificationOverride.java b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/ivyresolve/verification/DependencyVerificationOverride.java index 5ad918c45cbe..1fa24148c162 100644 --- a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/ivyresolve/verification/DependencyVerificationOverride.java +++ b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/ivyresolve/verification/DependencyVerificationOverride.java @@ -29,17 +29,8 @@ public ModuleComponentRepository overrideDependencyVerification(ModuleComponentR } }; - static File dependencyVerificationsFile(File buildDirectory) { - File gradleDir = ensureGradleDirExists(buildDirectory); - return new File(gradleDir, "verification-metadata.xml"); - } - - static File ensureGradleDirExists(File buildDirectory) { - File gradleDir = new File(buildDirectory, "gradle"); - if (!gradleDir.exists()) { - gradleDir.mkdirs(); - } - return gradleDir; + static File dependencyVerificationsFile(File gradleDirectory) { + return new File(gradleDirectory, "verification-metadata.xml"); } ModuleComponentRepository overrideDependencyVerification(ModuleComponentRepository original); diff --git a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/ivyresolve/verification/WriteDependencyVerificationFile.java b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/ivyresolve/verification/WriteDependencyVerificationFile.java index 661bf8268f35..9a78e75681aa 100644 --- a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/ivyresolve/verification/WriteDependencyVerificationFile.java +++ b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/ivyresolve/verification/WriteDependencyVerificationFile.java @@ -65,14 +65,14 @@ public class WriteDependencyVerificationFile implements DependencyVerificationOv private static final List DEFAULT_CHECKSUMS = ImmutableList.of("sha1", "sha512"); private final DependencyVerifierBuilder verificationsBuilder = new DependencyVerifierBuilder(); - private final File buildDirectory; + private final File gradleDirectory; private final BuildOperationExecutor buildOperationExecutor; private final List checksums; private final Set entriesToBeWritten = Sets.newLinkedHashSetWithExpectedSize(512); private final ChecksumService checksumService; - public WriteDependencyVerificationFile(File buildDirectory, BuildOperationExecutor buildOperationExecutor, List checksums, ChecksumService checksumService) { - this.buildDirectory = buildDirectory; + public WriteDependencyVerificationFile(File gradleDirectory, BuildOperationExecutor buildOperationExecutor, List checksums, ChecksumService checksumService) { + this.gradleDirectory = gradleDirectory; this.buildOperationExecutor = buildOperationExecutor; this.checksums = validateChecksums(checksums); this.checksumService = checksumService; @@ -115,9 +115,11 @@ public ModuleComponentRepository overrideDependencyVerification(ModuleComponentR return new DependencyVerifyingModuleComponentRepository(original, this); } + @SuppressWarnings("ResultOfMethodCallIgnored") @Override public void buildFinished(Gradle gradle) { - File verifFile = DependencyVerificationOverride.dependencyVerificationsFile(buildDirectory); + File verifFile = DependencyVerificationOverride.dependencyVerificationsFile(gradleDirectory); + verifFile.getParentFile().mkdirs(); try { maybeReadExistingFile(verifFile); computeHashsConcurrently(gradle); diff --git a/subprojects/dependency-management/src/test/groovy/org/gradle/api/internal/artifacts/repositories/transport/RepositoryTransportFactoryTest.groovy b/subprojects/dependency-management/src/test/groovy/org/gradle/api/internal/artifacts/repositories/transport/RepositoryTransportFactoryTest.groovy index 5e1e1486ead8..736f96793212 100644 --- a/subprojects/dependency-management/src/test/groovy/org/gradle/api/internal/artifacts/repositories/transport/RepositoryTransportFactoryTest.groovy +++ b/subprojects/dependency-management/src/test/groovy/org/gradle/api/internal/artifacts/repositories/transport/RepositoryTransportFactoryTest.groovy @@ -45,7 +45,7 @@ class RepositoryTransportFactoryTest extends Specification { connectorFactory2.getSupportedProtocols() >> (["protocol2a", "protocol2b"] as Set) connectorFactory2.getSupportedAuthentication() >> ([] as Set) List resourceConnectorFactories = Lists.newArrayList(connectorFactory1, connectorFactory2) - StartParameterResolutionOverride override = new StartParameterResolutionOverride(new StartParameter()) + StartParameterResolutionOverride override = new StartParameterResolutionOverride(new StartParameter(), Mock(File)) repositoryTransportFactory = new RepositoryTransportFactory(resourceConnectorFactories, null, null, null, null, null, null, override, producerGuard, Mock(FileResourceRepository), TestUtil.checksumService) }