Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ import org.gradle.initialization.BuildStructureOperationProject
import org.gradle.initialization.GradlePropertiesController
import org.gradle.initialization.ProjectsIdentifiedProgressDetails
import org.gradle.initialization.RootBuildCacheControllerSettingsProcessor
import org.gradle.initialization.layout.BuildLayout
import org.gradle.internal.Actions
import org.gradle.internal.build.BuildProjectRegistry
import org.gradle.internal.build.BuildState
Expand Down Expand Up @@ -72,6 +71,7 @@ import org.gradle.internal.extensions.core.serviceOf
import org.gradle.internal.extensions.stdlib.uncheckedCast
import org.gradle.internal.file.FileSystemDefaultExcludesProvider
import org.gradle.internal.flow.services.BuildFlowScope
import org.gradle.internal.initialization.BuildLocations
import org.gradle.internal.operations.BuildOperationProgressEventEmitter
import org.gradle.internal.scopeids.id.BuildInvocationScopeId
import org.gradle.internal.serialize.codecs.core.IsolateContextSource
Expand Down Expand Up @@ -397,12 +397,12 @@ class ConfigurationCacheState(

private
fun GradleInternal.loadGradleProperties() {
val settingDir = serviceOf<BuildLayout>().settingsDir
val buildRootDir = serviceOf<BuildLocations>().buildRootDirectory
val buildId = this.owner.buildIdentifier
// Load Gradle properties from a file but skip applying system properties defined here.
// System properties from the file may be mutated by the build logic, and the execution-time values are already restored by the EnvironmentChangeTracker.
// Applying properties from file overwrites these modifications.
serviceOf<GradlePropertiesController>().loadGradleProperties(buildId, settingDir, false)
serviceOf<GradlePropertiesController>().loadGradleProperties(buildId, buildRootDir, false)
}

private
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,11 @@ import org.gradle.initialization.ClassLoaderScopeRegistry
import org.gradle.initialization.DefaultProjectDescriptor
import org.gradle.initialization.DefaultSettings
import org.gradle.initialization.SettingsState
import org.gradle.initialization.layout.BuildLayout
import org.gradle.internal.build.BuildState
import org.gradle.internal.build.BuildStateRegistry
import org.gradle.internal.cc.base.serialize.service
import org.gradle.internal.file.PathToFileResolver
import org.gradle.internal.initialization.BuildLocations
import org.gradle.internal.reflect.Instantiator
import org.gradle.internal.resource.TextFileResourceLoader
import org.gradle.internal.service.CloseableServiceRegistry
Expand Down Expand Up @@ -174,7 +174,7 @@ class DefaultConfigurationCacheHost internal constructor(

private
fun settingsDir() =
service<BuildLayout>().settingsDir
service<BuildLocations>().buildRootDirectory

private
fun getProjectDescriptor(parentPath: Path?): DefaultProjectDescriptor? =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package org.gradle.internal.cc.impl

import org.gradle.api.internal.StartParameterInternal
import org.gradle.api.logging.LogLevel
import org.gradle.initialization.layout.BuildLayout
import org.gradle.internal.buildoption.DefaultInternalOptions
import org.gradle.internal.buildoption.Option
import org.gradle.internal.buildtree.RunTasksRequirements
Expand All @@ -27,6 +26,7 @@ import org.gradle.internal.cc.impl.services.DefaultBuildModelParameters
import org.gradle.internal.encryption.EncryptionConfiguration
import org.gradle.internal.hash.HashCode
import org.gradle.internal.hash.Hashing
import org.gradle.internal.initialization.BuildLocations
import org.gradle.internal.initialization.BuildTreeLocations
import org.gradle.internal.scripts.DefaultScriptFileResolver
import org.gradle.test.fixtures.file.TestNameTestDirectoryProvider
Expand Down Expand Up @@ -138,7 +138,7 @@ class ConfigurationCacheKeyTest {
val startParameter = StartParameterInternal().apply(configure)
return ConfigurationCacheKey(
ConfigurationCacheStartParameter(
BuildTreeLocations(BuildLayout(file("root"), null, DefaultScriptFileResolver())),
BuildTreeLocations(BuildLocations(file("root"), null, DefaultScriptFileResolver())),
startParameter,
DefaultInternalOptions(mapOf()),
DefaultBuildModelParameters(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,7 @@

package org.gradle.internal.declarativedsl.provider

import org.gradle.api.internal.GradleInternal
import org.gradle.api.model.ObjectFactory
import org.gradle.initialization.layout.BuildLayoutFactory
import org.gradle.internal.declarativedsl.evaluationSchema.InterpretationSchemaBuilder
import org.gradle.internal.declarativedsl.interpreter.DeclarativeKotlinScriptEvaluator
import org.gradle.internal.declarativedsl.interpreter.GradleProcessInterpretationSchemaBuilder
Expand All @@ -27,13 +25,13 @@ import org.gradle.internal.declarativedsl.interpreter.StoringInterpretationSchem
import org.gradle.internal.declarativedsl.interpreter.defaultDeclarativeScriptEvaluator
import org.gradle.internal.declarativedsl.interpreter.defaults.DeclarativeModelDefaultsHandler
import org.gradle.internal.event.ListenerManager
import org.gradle.internal.initialization.BuildLocations
import org.gradle.internal.service.Provides
import org.gradle.internal.service.ServiceRegistration
import org.gradle.internal.service.ServiceRegistrationProvider
import org.gradle.internal.service.scopes.AbstractGradleModuleServices
import org.gradle.plugin.software.internal.ModelDefaultsHandler
import org.gradle.plugin.software.internal.SoftwareTypeRegistry
import java.io.File


class DeclarativeDslServices : AbstractGradleModuleServices() {
Expand Down Expand Up @@ -61,12 +59,13 @@ object BuildServices : ServiceRegistrationProvider {
@Provides
fun createInterpretationSchemaBuilder(
softwareTypeRegistry: SoftwareTypeRegistry,
buildLayoutFactory: BuildLayoutFactory,
settingsUnderInitialization: SettingsUnderInitialization,
gradleInternal: GradleInternal
buildLocations: BuildLocations,
settingsUnderInitialization: SettingsUnderInitialization
): InterpretationSchemaBuilder =
MemoizedInterpretationSchemaBuilder(
StoringInterpretationSchemaBuilder(GradleProcessInterpretationSchemaBuilder(settingsUnderInitialization::instance, softwareTypeRegistry), buildLayoutFactory.settingsDir(gradleInternal))
StoringInterpretationSchemaBuilder(
GradleProcessInterpretationSchemaBuilder(settingsUnderInitialization::instance, softwareTypeRegistry), buildLocations.buildRootDirectory
)
)

@Provides
Expand All @@ -77,8 +76,4 @@ object BuildServices : ServiceRegistrationProvider {
): ModelDefaultsHandler {
return objectFactory.newInstance(DeclarativeModelDefaultsHandler::class.java, softwareTypeRegistry, interpretationSchemaBuilder)
}

private
fun BuildLayoutFactory.settingsDir(gradle: GradleInternal): File =
getLayoutFor(gradle.startParameter.toBuildLayoutConfiguration()).settingsDir
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,34 +15,38 @@
*/
package org.gradle.initialization;

import org.gradle.internal.initialization.BuildLocations;
import org.jspecify.annotations.Nullable;

import java.io.File;

/**
* @implNote Despite not being part of the public API, this service is known to have been used by users.
* So we treat its removal as a breaking change.
* @deprecated Instead, use {@link org.gradle.api.file.BuildLayout#getSettingsDirectory()} for settings or {@link org.gradle.api.file.ProjectLayout#getSettingsDirectory()} for project.
*/
@Deprecated
public class SettingsLocation {
private final File settingsDir;

@Nullable
private final File settingsFile;
protected final BuildLocations buildLocations;

public SettingsLocation(File settingsDir, @Nullable File settingsFile) {
this.settingsDir = settingsDir;
this.settingsFile = settingsFile;
public SettingsLocation(BuildLocations buildLocations) {
this.buildLocations = buildLocations;
}

/**
* Returns the settings directory. Never null.
*/
public File getSettingsDir() {
return settingsDir;
return buildLocations.getBuildRootDirectory();
}

/**
* Returns the settings file. May be null, which mean "no settings file" rather than "use default settings file location".
*/
@Nullable
public File getSettingsFile() {
return settingsFile;
return buildLocations.getSettingsFile();
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -15,37 +15,37 @@
*/
package org.gradle.initialization.layout;

import org.gradle.initialization.SettingsLocation;
import org.gradle.internal.initialization.BuildLogicFiles;
import org.gradle.internal.scripts.ScriptFileResolver;
import org.gradle.internal.initialization.BuildLocations;
import org.gradle.internal.service.scopes.Scope;
import org.gradle.internal.service.scopes.ServiceScope;
import org.jspecify.annotations.Nullable;

import java.io.File;

/**
* @implNote Despite not being part of the public API, this service is known to have been used by users.
* So we treat its removal as a breaking change.
* @deprecated Instead, use {@link org.gradle.api.file.BuildLayout#getSettingsDirectory()} for settings or {@link org.gradle.api.file.ProjectLayout#getSettingsDirectory()} for project.
*/
@Deprecated
@ServiceScope(Scope.Build.class)
public class BuildLayout extends SettingsLocation {
private final ScriptFileResolver scriptFileResolver;
@SuppressWarnings("deprecation")
public class BuildLayout extends org.gradle.initialization.SettingsLocation {

// Note: `null` for `settingsFile` means explicitly no settings
// A non null value can be a non existent file, which is semantically equivalent to an empty file
public BuildLayout(File rootDirectory, @Nullable File settingsFile, ScriptFileResolver scriptFileResolver) {
super(rootDirectory, settingsFile);
this.scriptFileResolver = scriptFileResolver;
public BuildLayout(BuildLocations buildLocations) {
super(buildLocations);
}

/**
* Was a build definition found?
*/
public boolean isBuildDefinitionMissing() {
return getSettingsFile() != null && !getSettingsFile().exists() && scriptFileResolver.resolveScriptFile(getRootDirectory(), BuildLogicFiles.BUILD_FILE_BASENAME) == null;
return buildLocations.isBuildDefinitionMissing();
}

/**
* Returns the root directory of the build, is never null.
*/
public File getRootDirectory() {
return getSettingsDir();
return buildLocations.getBuildRootDirectory();
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2012 the original author or authors.
* Copyright 2025 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.
Expand All @@ -13,34 +13,37 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.gradle.initialization.layout;
package org.gradle.internal.initialization;

import org.gradle.initialization.BuildLayoutParameters;

import java.io.File;

/**
* Configuration which affects the (static) layout of a build.
* Target directory and other parameters to determine the location of the build.
*
* @see BuildLocator
*/
public class BuildLayoutConfiguration {
private final File currentDir;
public class BuildDiscoveryParameters {

private final File targetDirectory;
private final boolean searchUpwards;
private final boolean useEmptySettings;

public BuildLayoutConfiguration(File currentDir, boolean searchUpwards, boolean useEmptySettings) {
this.currentDir = currentDir;
public BuildDiscoveryParameters(File targetDirectory, boolean searchUpwards, boolean useEmptySettings) {
this.targetDirectory = targetDirectory;
this.searchUpwards = searchUpwards;
this.useEmptySettings = useEmptySettings;
}

public BuildLayoutConfiguration(BuildLayoutParameters parameters) {
this.currentDir = parameters.getCurrentDir();
public BuildDiscoveryParameters(BuildLayoutParameters parameters) {
this.targetDirectory = parameters.getCurrentDir();
this.searchUpwards = true;
this.useEmptySettings = false;
}

public File getCurrentDir() {
return currentDir;
public File getTargetDirectory() {
return targetDirectory;
}

public boolean isSearchUpwards() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
* Copyright 2025 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.internal.initialization;

import org.gradle.internal.scripts.ScriptFileResolver;
import org.gradle.internal.service.scopes.Scope;
import org.gradle.internal.service.scopes.ServiceScope;
import org.jspecify.annotations.Nullable;

import java.io.File;

/**
* Location of a build represented as its {@link #getBuildRootDirectory() root directory}.
*/
@ServiceScope(Scope.Build.class)
public class BuildLocations {

private final File buildRootDirectory;
@Nullable
private final File settingsFile;
private final ScriptFileResolver scriptFileResolver;

public BuildLocations(File buildRootDirectory, @Nullable File settingsFile, ScriptFileResolver scriptFileResolver) {
this.buildRootDirectory = buildRootDirectory;
this.settingsFile = settingsFile;
this.scriptFileResolver = scriptFileResolver;
}

/**
* Root directory of the build.
* <p>
* It is the same as the settings directory.
* <p>
* Note that this directory can technically differ from the <code>Project.rootDir</code>, because the latter is mutable during settings
* via the <code>ProjectDescriptor</code> of the root project.
*/
public File getBuildRootDirectory() {
return buildRootDirectory;
}

/**
* Settings script file or null if using "empty settings".
* <p>
* When not null, the file might not exist on disk, in which case it is treated as a file with empty contents.
* <p>
* Note that this file might still not be the effective settings file, because under certain conditions
* the build can switch to empty settings despite a valid settings file being present.
* See {@link org.gradle.initialization.DefaultSettingsLoader settings loader} logic for details.
*/
@Nullable
public File getSettingsFile() {
return settingsFile;
}

/**
* Was a build definition found?
*/
public boolean isBuildDefinitionMissing() {
return settingsFile != null && !settingsFile.exists() && scriptFileResolver.resolveScriptFile(buildRootDirectory, BuildLogicFiles.BUILD_FILE_BASENAME) == null;
}
}
Loading
Loading