diff --git a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/mvnsettings/DefaultMavenSettingsProvider.java b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/mvnsettings/DefaultMavenSettingsProvider.java index 837c594278ff..578226e54c33 100644 --- a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/mvnsettings/DefaultMavenSettingsProvider.java +++ b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/mvnsettings/DefaultMavenSettingsProvider.java @@ -15,6 +15,7 @@ */ package org.gradle.api.internal.artifacts.mvnsettings; +import org.apache.commons.lang.StringUtils; import org.apache.maven.settings.Settings; import org.apache.maven.settings.building.DefaultSettingsBuilder; import org.apache.maven.settings.building.DefaultSettingsBuilderFactory; @@ -56,6 +57,8 @@ public Settings buildSettings() throws SettingsBuildingException { /** * Read the local repository location from local Maven settings files. + * + * @return The path to the local repository, or null if not specified in Maven settings. */ @Override public String getLocalRepository() { @@ -73,7 +76,8 @@ private String readLocalRepository(File settingsFile) { Map options = Collections.singletonMap(SettingsReader.IS_STRICT, Boolean.FALSE); SettingsReader settingsReader = new DefaultSettingsReader(); try { - return settingsReader.read(settingsFile, options).getLocalRepository(); + String localRepository = settingsReader.read(settingsFile, options).getLocalRepository(); + return StringUtils.isEmpty(localRepository) ? null : localRepository; } catch (Exception parseException) { throw new CannotLocateLocalMavenRepositoryException("Unable to parse local Maven settings: " + settingsFile.getAbsolutePath(), parseException); } diff --git a/subprojects/dependency-management/src/test/groovy/org/gradle/api/internal/artifacts/mvnsettings/DefaultLocalMavenRepositoryLocatorTest.groovy b/subprojects/dependency-management/src/test/groovy/org/gradle/api/internal/artifacts/mvnsettings/DefaultLocalMavenRepositoryLocatorTest.groovy index 42db3e0d05fe..97c7ff16f66f 100644 --- a/subprojects/dependency-management/src/test/groovy/org/gradle/api/internal/artifacts/mvnsettings/DefaultLocalMavenRepositoryLocatorTest.groovy +++ b/subprojects/dependency-management/src/test/groovy/org/gradle/api/internal/artifacts/mvnsettings/DefaultLocalMavenRepositoryLocatorTest.groovy @@ -33,7 +33,7 @@ class DefaultLocalMavenRepositoryLocatorTest extends Specification { File repo1 = tmpDir.file("repo1") File repo2 = tmpDir.file("repo2") File userHome1 = tmpDir.file("user_home_1") - File userHome2 = tmpDir.file("user_home_2") + File defaultM2Repo = new File(userHome1, ".m2/repository") def setup() { locations = new SimpleMavenFileLocations() @@ -44,10 +44,11 @@ class DefaultLocalMavenRepositoryLocatorTest extends Specification { when: 1 * system.getProperty("user.home") >> userHome1.absolutePath then: - locator.localMavenRepository == new File(userHome1, ".m2/repository") + locator.localMavenRepository == defaultM2Repo // Ensure that modified user.home is honoured (see http://forums.gradle.org/gradle/topics/override_location_of_the_local_maven_repo) when: + File userHome2 = tmpDir.file("user_home_2") 1 * system.getProperty("user.home") >> userHome2.absolutePath then: locator.localMavenRepository == new File(userHome2, ".m2/repository") @@ -97,25 +98,38 @@ class DefaultLocalMavenRepositoryLocatorTest extends Specification { locator.localMavenRepository == repo1 } - def "ignores changes to maven settings file after initial load"() { + def "honors location specified in global settings file"() { + writeSettingsFile(locations.globalSettingsFile, repo1) + + expect: + locator.localMavenRepository == repo1 + } + + def "returns default location if user settings file specifies empty local repository"() { when: - writeSettingsFile(locations.userSettingsFile, repo1) + writeSettingsFile(locations.userSettingsFile, "") + 1 * system.getProperty("user.home") >> userHome1.absolutePath then: - locator.localMavenRepository == repo1 + locator.localMavenRepository == defaultM2Repo + } + def "returns default location if global settings file specifies empty local repository"() { when: - writeSettingsFile(locations.userSettingsFile, repo2) + writeSettingsFile(locations.globalSettingsFile, "") + 1 * system.getProperty("user.home") >> userHome1.absolutePath then: - locator.localMavenRepository == repo1 + locator.localMavenRepository == defaultM2Repo } - def "honors location specified in global settings file"() { - writeSettingsFile(locations.globalSettingsFile, repo1) + def "returns global location if user settings file specifies empty local repository"() { + when: + writeSettingsFile(locations.userSettingsFile, "") + writeSettingsFile(locations.globalSettingsFile, repo2) - expect: - locator.localMavenRepository == repo1 + then: + locator.localMavenRepository == repo2 } def "prefers location specified in user settings file over that in global settings file"() { @@ -126,6 +140,20 @@ class DefaultLocalMavenRepositoryLocatorTest extends Specification { locator.localMavenRepository == repo1 } + def "ignores changes to maven settings file after initial load"() { + when: + writeSettingsFile(locations.userSettingsFile, repo1) + + then: + locator.localMavenRepository == repo1 + + when: + writeSettingsFile(locations.userSettingsFile, repo2) + + then: + locator.localMavenRepository == repo1 + } + def "handles the case where (potential) location of global settings file cannot be determined"() { locations.globalSettingsFile = null @@ -133,7 +161,7 @@ class DefaultLocalMavenRepositoryLocatorTest extends Specification { system.getProperty("user.home") >> userHome1.absolutePath then: - locator.localMavenRepository == new File(userHome1, ".m2/repository") + locator.localMavenRepository == defaultM2Repo when: writeSettingsFile(locations.userSettingsFile, repo1)