Skip to content

Commit

Permalink
Fix incorrect Gradle root build directory location
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
melix committed Jan 22, 2020
1 parent 43f9ae6 commit aecda42
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 25 deletions.
@@ -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
}
}
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -314,8 +317,8 @@ RepositoryTransportFactory createRepositoryTransportFactory(StartParameter start
BuildOperationExecutor buildOperationExecutor,
ProducerGuard<ExternalResourceName> producerGuard,
FileResourceRepository fileResourceRepository,
ChecksumService checksumService) {
StartParameterResolutionOverride startParameterResolutionOverride = new StartParameterResolutionOverride(startParameter);
ChecksumService checksumService,
StartParameterResolutionOverride startParameterResolutionOverride) {
return new RepositoryTransportFactory(
resourceConnectorFactories,
progressLoggerFactory,
Expand All @@ -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) {
Expand Down
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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) {
Expand All @@ -75,13 +77,12 @@ public ModuleComponentRepository overrideModuleVersionRepository(ModuleComponent
}

public DependencyVerificationOverride dependencyVerificationOverride(BuildOperationExecutor buildOperationExecutor, ChecksumService checksumService) {
File currentDir = startParameter.getCurrentDir();
List<String> 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);
Expand Down
Expand Up @@ -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);
Expand Down
Expand Up @@ -65,14 +65,14 @@ public class WriteDependencyVerificationFile implements DependencyVerificationOv
private static final List<String> 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<String> checksums;
private final Set<ChecksumEntry> entriesToBeWritten = Sets.newLinkedHashSetWithExpectedSize(512);
private final ChecksumService checksumService;

public WriteDependencyVerificationFile(File buildDirectory, BuildOperationExecutor buildOperationExecutor, List<String> checksums, ChecksumService checksumService) {
this.buildDirectory = buildDirectory;
public WriteDependencyVerificationFile(File gradleDirectory, BuildOperationExecutor buildOperationExecutor, List<String> checksums, ChecksumService checksumService) {
this.gradleDirectory = gradleDirectory;
this.buildOperationExecutor = buildOperationExecutor;
this.checksums = validateChecksums(checksums);
this.checksumService = checksumService;
Expand Down Expand Up @@ -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);
Expand Down
Expand Up @@ -45,7 +45,7 @@ class RepositoryTransportFactoryTest extends Specification {
connectorFactory2.getSupportedProtocols() >> (["protocol2a", "protocol2b"] as Set)
connectorFactory2.getSupportedAuthentication() >> ([] as Set)
List<ResourceConnectorFactory> 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)
}

Expand Down

0 comments on commit aecda42

Please sign in to comment.