diff --git a/subprojects/core/src/main/java/org/gradle/api/internal/plugins/repositories/DefaultPluginRepositorySpec.java b/subprojects/core/src/main/java/org/gradle/api/internal/plugins/repositories/DefaultPluginRepositorySpec.java index 0325b1364febe..568dc3f8eab4e 100644 --- a/subprojects/core/src/main/java/org/gradle/api/internal/plugins/repositories/DefaultPluginRepositorySpec.java +++ b/subprojects/core/src/main/java/org/gradle/api/internal/plugins/repositories/DefaultPluginRepositorySpec.java @@ -24,26 +24,34 @@ * Bridges between a global PluginRepositorySpec and a {@link org.gradle.api.Script}. */ public class DefaultPluginRepositorySpec implements PluginRepositorySpec { + private final PluginRepositoryFactory pluginRepositoryFactory; private final PluginRepositoryRegistry pluginRepositoryRegistry; private final FileResolver fileResolver; - public DefaultPluginRepositorySpec(PluginRepositoryRegistry pluginRepositoryRegistry, FileResolver fileResolver) { + public DefaultPluginRepositorySpec(PluginRepositoryFactory pluginRepositoryFactory, PluginRepositoryRegistry pluginRepositoryRegistry, FileResolver fileResolver) { + this.pluginRepositoryFactory = pluginRepositoryFactory; this.pluginRepositoryRegistry = pluginRepositoryRegistry; this.fileResolver = fileResolver; } @Override public MavenPluginRepository maven(Action action) { - return pluginRepositoryRegistry.maven(action, fileResolver); + MavenPluginRepository repo = pluginRepositoryFactory.maven(action, fileResolver); + pluginRepositoryRegistry.add(repo); + return repo; } @Override public IvyPluginRepository ivy(Action action) { - return pluginRepositoryRegistry.ivy(action, fileResolver); + IvyPluginRepository repo = pluginRepositoryFactory.ivy(action, fileResolver); + pluginRepositoryRegistry.add(repo); + return repo; } @Override public GradlePluginPortal gradlePluginPortal() { - return pluginRepositoryRegistry.gradlePluginPortal(); + GradlePluginPortal portal = pluginRepositoryFactory.gradlePluginPortal(); + pluginRepositoryRegistry.add(portal); + return portal; } } diff --git a/subprojects/core/src/main/java/org/gradle/api/internal/plugins/repositories/PluginRepositoryFactory.java b/subprojects/core/src/main/java/org/gradle/api/internal/plugins/repositories/PluginRepositoryFactory.java new file mode 100644 index 0000000000000..100d2bfd85ffd --- /dev/null +++ b/subprojects/core/src/main/java/org/gradle/api/internal/plugins/repositories/PluginRepositoryFactory.java @@ -0,0 +1,50 @@ +/* + * Copyright 2016 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.internal.plugins.repositories; + +import org.gradle.api.Action; +import org.gradle.api.internal.file.FileResolver; + +/** + * Created by pepper on 5/4/16. + */ +public interface PluginRepositoryFactory { + /** + * Adds and configures a {@link MavenPluginRepository}. + * + * @param action The action to use to configure the repository. + * @param scriptFileResolver The {@link FileResolver} in the context of the Script. + * @return The added repository. + */ + MavenPluginRepository maven(Action action, FileResolver scriptFileResolver); + + /** + * Adds and configures a {@link IvyPluginRepository}. + * + * @param action The action to use to configure the repository. + * @param scriptFileResolver The {@link FileResolver} in the context of the Script. + * @return the added repository. + */ + IvyPluginRepository ivy(Action action, FileResolver scriptFileResolver); + + /** + * Adds the Gradle Plugin Portal (plugins.gradle.org) as a plugin repository. + * @return The added repository. + * @throws IllegalArgumentException if called more than once. + */ + GradlePluginPortal gradlePluginPortal(); +} diff --git a/subprojects/core/src/main/java/org/gradle/api/internal/plugins/repositories/PluginRepositoryRegistry.java b/subprojects/core/src/main/java/org/gradle/api/internal/plugins/repositories/PluginRepositoryRegistry.java index 96a148106cee3..cd2dd2e818a10 100644 --- a/subprojects/core/src/main/java/org/gradle/api/internal/plugins/repositories/PluginRepositoryRegistry.java +++ b/subprojects/core/src/main/java/org/gradle/api/internal/plugins/repositories/PluginRepositoryRegistry.java @@ -16,35 +16,12 @@ package org.gradle.api.internal.plugins.repositories; -import org.gradle.api.Action; -import org.gradle.api.internal.file.FileResolver; +import org.gradle.internal.HasInternalProtocol; /** * The {@link PluginRepository} instances used to resolve plugins. */ -public interface PluginRepositoryRegistry extends Iterable { - /** - * Adds and configures a {@link MavenPluginRepository}. - * - * @param action The action to use to configure the repository. - * @param scriptFileResolver The {@link FileResolver} in the context of the Script. - * @return The added repository. - */ - MavenPluginRepository maven(Action action, FileResolver scriptFileResolver); - - /** - * Adds and configures a {@link IvyPluginRepository}. - * - * @param action The action to use to configure the repository. - * @param scriptFileResolver The {@link FileResolver} in the context of the Script. - * @return the added repository. - */ - IvyPluginRepository ivy(Action action, FileResolver scriptFileResolver); - - /** - * Adds the Gradle Plugin Portal (plugins.gradle.org) as a plugin repository. - * @return The added repository. - * @throws IllegalArgumentException if called more than once. - */ - GradlePluginPortal gradlePluginPortal(); +@HasInternalProtocol +public interface PluginRepositoryRegistry { + void add(PluginRepository pluginRepository); } diff --git a/subprojects/core/src/main/java/org/gradle/configuration/DefaultScriptPluginFactory.java b/subprojects/core/src/main/java/org/gradle/configuration/DefaultScriptPluginFactory.java index 4a493bcd0ec8d..77dc4a58ba6e0 100755 --- a/subprojects/core/src/main/java/org/gradle/configuration/DefaultScriptPluginFactory.java +++ b/subprojects/core/src/main/java/org/gradle/configuration/DefaultScriptPluginFactory.java @@ -27,6 +27,7 @@ import org.gradle.api.internal.initialization.ScriptHandlerFactory; import org.gradle.api.internal.initialization.ScriptHandlerInternal; import org.gradle.api.internal.plugins.PluginManagerInternal; +import org.gradle.api.internal.plugins.repositories.PluginRepositoryFactory; import org.gradle.api.internal.plugins.repositories.PluginRepositoryRegistry; import org.gradle.api.internal.project.ProjectInternal; import org.gradle.api.tasks.util.PatternSet; @@ -69,6 +70,7 @@ public class DefaultScriptPluginFactory implements ScriptPluginFactory { private final BuildScriptDataSerializer buildScriptDataSerializer = new BuildScriptDataSerializer(); private final PluginRequestsSerializer pluginRequestsSerializer = new PluginRequestsSerializer(); private final PluginRepositoryRegistry pluginRepositoryRegistry; + private final PluginRepositoryFactory pluginRepositoryFactory; public DefaultScriptPluginFactory(ScriptCompilerFactory scriptCompilerFactory, Factory loggingManagerFactory, @@ -79,7 +81,8 @@ public DefaultScriptPluginFactory(ScriptCompilerFactory scriptCompilerFactory, DirectoryFileTreeFactory directoryFileTreeFactory, DocumentationRegistry documentationRegistry, ModelRuleSourceDetector modelRuleSourceDetector, - PluginRepositoryRegistry pluginRepositoryRegistry) { + PluginRepositoryRegistry pluginRepositoryRegistry, + PluginRepositoryFactory pluginRepositoryFactory) { this.scriptCompilerFactory = scriptCompilerFactory; this.loggingManagerFactory = loggingManagerFactory; this.instantiator = instantiator; @@ -90,6 +93,7 @@ public DefaultScriptPluginFactory(ScriptCompilerFactory scriptCompilerFactory, this.documentationRegistry = documentationRegistry; this.modelRuleSourceDetector = modelRuleSourceDetector; this.pluginRepositoryRegistry = pluginRepositoryRegistry; + this.pluginRepositoryFactory = pluginRepositoryFactory; } public ScriptPlugin create(ScriptSource scriptSource, ScriptHandler scriptHandler, ClassLoaderScope targetScope, ClassLoaderScope baseScope, boolean topLevelScript) { @@ -131,6 +135,7 @@ Factory createPatternSetFactory() { services.add(DirectoryFileTreeFactory.class, directoryFileTreeFactory); services.add(ModelRuleSourceDetector.class, modelRuleSourceDetector); services.add(PluginRepositoryRegistry.class, pluginRepositoryRegistry); + services.add(PluginRepositoryFactory.class, pluginRepositoryFactory); final ScriptTarget initialPassScriptTarget = initialPassTarget(target); diff --git a/subprojects/core/src/main/java/org/gradle/initialization/InitialPassSettingsScript.java b/subprojects/core/src/main/java/org/gradle/initialization/InitialPassSettingsScript.java index 24128f8f1e4b6..3b5974d36870a 100644 --- a/subprojects/core/src/main/java/org/gradle/initialization/InitialPassSettingsScript.java +++ b/subprojects/core/src/main/java/org/gradle/initialization/InitialPassSettingsScript.java @@ -17,6 +17,7 @@ import groovy.lang.Closure; import org.gradle.api.internal.plugins.dsl.PluginRepositorySpec; +import org.gradle.api.internal.plugins.repositories.PluginRepositoryFactory; import org.gradle.api.internal.plugins.repositories.PluginRepositoryRegistry; import org.gradle.api.internal.plugins.repositories.DefaultPluginRepositorySpec; import org.gradle.internal.reflect.Instantiator; @@ -29,9 +30,10 @@ public abstract class InitialPassSettingsScript extends SettingsScript { private PluginRepositorySpec getPluginRepositorySpec() { Instantiator instantiator = __scriptServices.get(Instantiator.class); + PluginRepositoryFactory pluginRepositoryFactory = __scriptServices.get(PluginRepositoryFactory.class); PluginRepositoryRegistry pluginRepositoryRegistry = __scriptServices.get(PluginRepositoryRegistry.class); return instantiator.newInstance( - DefaultPluginRepositorySpec.class, pluginRepositoryRegistry, getFileResolver()); + DefaultPluginRepositorySpec.class, pluginRepositoryFactory, pluginRepositoryRegistry, getFileResolver()); } public void pluginRepositories(Closure config) { diff --git a/subprojects/core/src/main/java/org/gradle/internal/service/scopes/BuildScopeServices.java b/subprojects/core/src/main/java/org/gradle/internal/service/scopes/BuildScopeServices.java index 9b0d3cb48c433..51423e0ee778e 100644 --- a/subprojects/core/src/main/java/org/gradle/internal/service/scopes/BuildScopeServices.java +++ b/subprojects/core/src/main/java/org/gradle/internal/service/scopes/BuildScopeServices.java @@ -45,6 +45,7 @@ import org.gradle.api.internal.plugins.DefaultPluginRegistry; import org.gradle.api.internal.plugins.PluginInspector; import org.gradle.api.internal.plugins.PluginRegistry; +import org.gradle.api.internal.plugins.repositories.PluginRepositoryFactory; import org.gradle.api.internal.plugins.repositories.PluginRepositoryRegistry; import org.gradle.api.internal.project.DefaultProjectAccessListener; import org.gradle.api.internal.project.DefaultProjectRegistry; @@ -287,7 +288,8 @@ private DefaultScriptPluginFactory defaultScriptPluginFactory() { get(DirectoryFileTreeFactory.class), get(DocumentationRegistry.class), get(ModelRuleSourceDetector.class), - get(PluginRepositoryRegistry.class)); + get(PluginRepositoryRegistry.class), + get(PluginRepositoryFactory.class)); } protected SettingsLoader createSettingsLoader(SettingsProcessor settingsProcessor, GradleLauncherFactory gradleLauncherFactory, diff --git a/subprojects/core/src/test/groovy/org/gradle/configuration/DefaultScriptPluginFactoryTest.groovy b/subprojects/core/src/test/groovy/org/gradle/configuration/DefaultScriptPluginFactoryTest.groovy index 2635bb55e2e33..fff656a58f9fd 100755 --- a/subprojects/core/src/test/groovy/org/gradle/configuration/DefaultScriptPluginFactoryTest.groovy +++ b/subprojects/core/src/test/groovy/org/gradle/configuration/DefaultScriptPluginFactoryTest.groovy @@ -26,6 +26,7 @@ import org.gradle.api.internal.initialization.ScriptHandlerFactory import org.gradle.api.internal.initialization.ScriptHandlerInternal import org.gradle.api.internal.initialization.loadercache.ClassPathSnapshot import org.gradle.api.internal.initialization.loadercache.ClassPathSnapshotter +import org.gradle.api.internal.plugins.repositories.PluginRepositoryFactory import org.gradle.api.internal.plugins.repositories.PluginRepositoryRegistry import org.gradle.api.internal.project.ProjectInternal import org.gradle.api.internal.project.ProjectScript @@ -65,9 +66,10 @@ public class DefaultScriptPluginFactoryTest extends Specification { def documentationRegistry = Mock(DocumentationRegistry) def classPathSnapshotter = Mock(ClassPathSnapshotter) def pluginRepositoryRegistry = Mock(PluginRepositoryRegistry) + def pluginRepositoryFactory = Mock(PluginRepositoryFactory) def factory = new DefaultScriptPluginFactory(scriptCompilerFactory, loggingManagerFactory, instantiator, scriptHandlerFactory, pluginRequestApplicator, fileLookup, - directoryFileTreeFactory, documentationRegistry, new ModelRuleSourceDetector(), pluginRepositoryRegistry) + directoryFileTreeFactory, documentationRegistry, new ModelRuleSourceDetector(), pluginRepositoryRegistry, pluginRepositoryFactory) def setup() { def configurations = Mock(ConfigurationContainer) diff --git a/subprojects/core/src/test/groovy/org/gradle/internal/service/scopes/BuildScopeServicesTest.groovy b/subprojects/core/src/test/groovy/org/gradle/internal/service/scopes/BuildScopeServicesTest.groovy index cef5237bac894..e472b091b0530 100644 --- a/subprojects/core/src/test/groovy/org/gradle/internal/service/scopes/BuildScopeServicesTest.groovy +++ b/subprojects/core/src/test/groovy/org/gradle/internal/service/scopes/BuildScopeServicesTest.groovy @@ -28,6 +28,7 @@ import org.gradle.api.internal.file.FileResolver import org.gradle.api.internal.file.collections.DirectoryFileTreeFactory import org.gradle.api.internal.initialization.loadercache.ClassLoaderCache import org.gradle.api.internal.initialization.loadercache.ClassPathSnapshotter +import org.gradle.api.internal.plugins.repositories.PluginRepositoryFactory import org.gradle.api.internal.plugins.repositories.PluginRepositoryRegistry import org.gradle.api.internal.project.* import org.gradle.api.internal.project.antbuilder.DefaultIsolatedAntBuilder @@ -94,6 +95,7 @@ public class BuildScopeServicesTest extends Specification { sessionServices.get(CrossBuildInMemoryCachingScriptClassCache) >> Mock(CrossBuildInMemoryCachingScriptClassCache) sessionServices.get(InjectedPluginClasspath) >> Mock(InjectedPluginClasspath) sessionServices.get(PluginRepositoryRegistry) >> Mock(PluginRepositoryRegistry) + sessionServices.get(PluginRepositoryFactory) >> Mock(PluginRepositoryFactory) sessionServices.getAll(_) >> [] registry = new BuildScopeServices(sessionServices, false) diff --git a/subprojects/plugin-use/src/integTest/groovy/org/gradle/plugin/use/ResolvingFromMultipleCustomPluginRepositorySpec.groovy b/subprojects/plugin-use/src/integTest/groovy/org/gradle/plugin/use/ResolvingFromMultipleCustomPluginRepositorySpec.groovy index 06b3e3ff53316..6f22bbffa76e8 100644 --- a/subprojects/plugin-use/src/integTest/groovy/org/gradle/plugin/use/ResolvingFromMultipleCustomPluginRepositorySpec.groovy +++ b/subprojects/plugin-use/src/integTest/groovy/org/gradle/plugin/use/ResolvingFromMultipleCustomPluginRepositorySpec.groovy @@ -199,6 +199,33 @@ class ResolvingFromMultipleCustomPluginRepositorySpec extends AbstractDependency repoType << [IVY, MAVEN] } + def "Prefers Plugin Repositories over buildscript ones."() { + given: + publishPlugins(MAVEN) + buildScript """ + buildscript { + repositories { + maven { + url "${repoA.uri}" + } + } + dependencies { + classpath "org.example:pluginAB:1.0" + } + } + plugins { + id "$pluginAB" version "1.0" + } + """ + + when: + use(repoB) + + then: + succeeds("pluginAB") + output.contains("fetched from $repoB.uri") + } + @Requires(TestPrecondition.ONLINE) def "Can opt-in to plugin portal"() { given: diff --git a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/internal/DefaultPluginRequestApplicator.java b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/internal/DefaultPluginRequestApplicator.java index 51f975db925cd..cc258741aa545 100644 --- a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/internal/DefaultPluginRequestApplicator.java +++ b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/internal/DefaultPluginRequestApplicator.java @@ -17,7 +17,6 @@ package org.gradle.plugin.use.internal; import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import org.gradle.api.Action; @@ -35,7 +34,6 @@ import org.gradle.api.internal.plugins.PluginManagerInternal; import org.gradle.api.internal.plugins.PluginRegistry; import org.gradle.api.internal.plugins.repositories.PluginRepository; -import org.gradle.api.internal.plugins.repositories.PluginRepositoryRegistry; import org.gradle.api.plugins.InvalidPluginException; import org.gradle.api.plugins.UnknownPluginException; import org.gradle.api.specs.Spec; @@ -43,12 +41,14 @@ import org.gradle.internal.exceptions.LocationAwareException; import org.gradle.plugin.internal.PluginId; import org.gradle.plugin.use.repository.internal.BackedByArtifactRepository; +import org.gradle.plugin.use.repository.internal.PluginRepositoryRegistryInternal; import org.gradle.plugin.use.resolve.internal.NotNonCorePluginOnClasspathCheckPluginResolver; import org.gradle.plugin.use.resolve.internal.PluginResolution; import org.gradle.plugin.use.resolve.internal.PluginResolutionResult; import org.gradle.plugin.use.resolve.internal.PluginResolveContext; import org.gradle.plugin.use.resolve.internal.PluginResolver; +import java.util.ArrayList; import java.util.Collections; import java.util.Formatter; import java.util.LinkedList; @@ -62,9 +62,9 @@ public class DefaultPluginRequestApplicator implements PluginRequestApplicator { private final PluginRegistry pluginRegistry; private final PluginResolverFactory pluginResolverFactory; - private PluginRepositoryRegistry pluginRepositoryRegistry; + private PluginRepositoryRegistryInternal pluginRepositoryRegistry; - public DefaultPluginRequestApplicator(PluginRegistry pluginRegistry, PluginResolverFactory pluginResolver, PluginRepositoryRegistry pluginRepositoryRegistry) { + public DefaultPluginRequestApplicator(PluginRegistry pluginRegistry, PluginResolverFactory pluginResolver, PluginRepositoryRegistryInternal pluginRepositoryRegistry) { this.pluginRegistry = pluginRegistry; this.pluginResolverFactory = pluginResolver; this.pluginRepositoryRegistry = pluginRepositoryRegistry; @@ -94,15 +94,17 @@ public Result transform(PluginRequest request) { final Map> pluginImplsFromOtherLoaders = Maps.newLinkedHashMap(); if (!results.isEmpty()) { + final RepositoryHandler repositories = scriptHandler.getRepositories(); - List pluginArtifactRepositories = Lists.newArrayList(); - for (PluginRepository pluginRepository : pluginRepositoryRegistry) { + List pluginArtifactRepositories = new ArrayList(); + pluginRepositoryRegistry.lock(); + for (PluginRepository pluginRepository : pluginRepositoryRegistry.getPluginRepositories()) { if (pluginRepository instanceof BackedByArtifactRepository) { - pluginArtifactRepositories.add(((BackedByArtifactRepository) pluginRepository).getArtifactRepository()); + pluginArtifactRepositories.add(((BackedByArtifactRepository) pluginRepository).createArtifactRepository(repositories)); } } - - final RepositoryHandler repositories = scriptHandler.getRepositories(); + // The plugin repositories were prepended as they were added, but we want them at the front. + repositories.removeAll(pluginArtifactRepositories); repositories.addAll(0, pluginArtifactRepositories); final List mavenRepos = repositories.withType(MavenArtifactRepository.class); diff --git a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/internal/PluginResolverFactory.java b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/internal/PluginResolverFactory.java index 1db31ad1d0cbc..2a5bf5a3d69c9 100644 --- a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/internal/PluginResolverFactory.java +++ b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/internal/PluginResolverFactory.java @@ -20,9 +20,9 @@ import org.gradle.api.internal.DocumentationRegistry; import org.gradle.api.internal.plugins.PluginRegistry; import org.gradle.api.internal.plugins.repositories.PluginRepository; -import org.gradle.api.internal.plugins.repositories.PluginRepositoryRegistry; import org.gradle.internal.Factory; import org.gradle.plugin.use.repository.internal.PluginRepositoryInternal; +import org.gradle.plugin.use.repository.internal.PluginRepositoryRegistryInternal; import org.gradle.plugin.use.resolve.internal.CompositePluginResolver; import org.gradle.plugin.use.resolve.internal.CorePluginResolver; import org.gradle.plugin.use.resolve.internal.NoopPluginResolver; @@ -38,14 +38,14 @@ class PluginResolverFactory implements Factory { private final PluginRegistry pluginRegistry; private final DocumentationRegistry documentationRegistry; private final PluginResolutionServiceResolver pluginResolutionServiceResolver; - private final PluginRepositoryRegistry pluginRepositoryRegistry; + private final PluginRepositoryRegistryInternal pluginRepositoryRegistry; private final InjectedClasspathPluginResolver injectedClasspathPluginResolver; PluginResolverFactory( PluginRegistry pluginRegistry, DocumentationRegistry documentationRegistry, PluginResolutionServiceResolver pluginResolutionServiceResolver, - PluginRepositoryRegistry pluginRepositoryRegistry, + PluginRepositoryRegistryInternal pluginRepositoryRegistry, InjectedClasspathPluginResolver injectedClasspathPluginResolver ) { this.pluginRegistry = pluginRegistry; @@ -86,12 +86,13 @@ private void addDefaultResolvers(List resolvers) { resolvers.add(injectedClasspathPluginResolver); } - for (PluginRepository pluginRepository : pluginRepositoryRegistry) { + pluginRepositoryRegistry.lock(); + for (PluginRepository pluginRepository : pluginRepositoryRegistry.getPluginRepositories()) { PluginResolver resolver = ((PluginRepositoryInternal) pluginRepository).asResolver(); resolvers.add(resolver); } - if (Iterables.isEmpty(pluginRepositoryRegistry)) { + if (Iterables.isEmpty(pluginRepositoryRegistry.getPluginRepositories())) { resolvers.add(pluginResolutionServiceResolver); } } diff --git a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/internal/PluginUsePluginServiceRegistry.java b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/internal/PluginUsePluginServiceRegistry.java index 849baf8a8113e..356db262ce5ca 100644 --- a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/internal/PluginUsePluginServiceRegistry.java +++ b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/internal/PluginUsePluginServiceRegistry.java @@ -29,7 +29,6 @@ import org.gradle.api.internal.initialization.BasicDomainObjectContext; import org.gradle.api.internal.plugins.PluginInspector; import org.gradle.api.internal.plugins.PluginRegistry; -import org.gradle.api.internal.plugins.repositories.PluginRepositoryRegistry; import org.gradle.cache.CacheRepository; import org.gradle.cache.PersistentCache; import org.gradle.cache.internal.FileLockManager; @@ -40,6 +39,7 @@ import org.gradle.internal.resource.transport.http.SslContextFactory; import org.gradle.internal.service.ServiceRegistration; import org.gradle.internal.service.scopes.PluginServiceRegistry; +import org.gradle.plugin.use.repository.internal.DefaultPluginRepositoryFactory; import org.gradle.plugin.use.repository.internal.DefaultPluginRepositoryRegistry; import org.gradle.plugin.use.resolve.service.internal.DeprecationListeningPluginResolutionServiceClient; import org.gradle.plugin.use.resolve.service.internal.HttpPluginResolutionServiceClient; @@ -102,7 +102,7 @@ PluginResolverFactory createPluginResolverFactory(PluginRegistry pluginRegistry, return new PluginResolverFactory(pluginRegistry, documentationRegistry, pluginResolutionServiceResolver, pluginRepositoryRegistry, injectedClasspathPluginResolver); } - PluginRequestApplicator createPluginRequestApplicator(PluginRegistry pluginRegistry, PluginResolverFactory pluginResolverFactory, PluginRepositoryRegistry pluginRepositoryRegistry) { + PluginRequestApplicator createPluginRequestApplicator(PluginRegistry pluginRegistry, PluginResolverFactory pluginResolverFactory, DefaultPluginRepositoryRegistry pluginRepositoryRegistry) { return new DefaultPluginRequestApplicator(pluginRegistry, pluginResolverFactory, pluginRepositoryRegistry); } @@ -110,15 +110,19 @@ InjectedClasspathPluginResolver createInjectedClassPathPluginResolver(ClassLoade return new InjectedClasspathPluginResolver(classLoaderScopeRegistry.getCoreAndPluginsScope(), pluginInspector, injectedPluginClasspath.getClasspath()); } - DefaultPluginRepositoryRegistry createPluginRepositoryRegistry(PluginResolutionServiceResolver pluginResolutionServiceResolver, VersionSelectorScheme versionSelectorScheme, - final DependencyManagementServices dependencyManagementServices, final FileResolver fileResolver, - final DependencyMetaDataProvider dependencyMetaDataProvider, Instantiator instantiator, - final AuthenticationSchemeRegistry authenticationSchemeRegistry) { + DefaultPluginRepositoryRegistry createPuginRepositoryRegistry() { + return new DefaultPluginRepositoryRegistry(); + } + + DefaultPluginRepositoryFactory createPluginRepositoryFactory(PluginResolutionServiceResolver pluginResolutionServiceResolver, VersionSelectorScheme versionSelectorScheme, + final DependencyManagementServices dependencyManagementServices, final FileResolver fileResolver, + final DependencyMetaDataProvider dependencyMetaDataProvider, Instantiator instantiator, + final AuthenticationSchemeRegistry authenticationSchemeRegistry) { final Factory dependencyResolutionServicesFactory = makeDependencyResolutionServicesFactory( dependencyManagementServices, fileResolver, dependencyMetaDataProvider); return instantiator.newInstance( - DefaultPluginRepositoryRegistry.class, pluginResolutionServiceResolver, + DefaultPluginRepositoryFactory.class, pluginResolutionServiceResolver, dependencyResolutionServicesFactory, versionSelectorScheme, instantiator, authenticationSchemeRegistry); } diff --git a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/AbstractPluginRepository.java b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/AbstractPluginRepository.java index 6540bede98b72..f2b5f6e7a5b80 100644 --- a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/AbstractPluginRepository.java +++ b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/AbstractPluginRepository.java @@ -31,19 +31,19 @@ import org.gradle.plugin.use.resolve.internal.PluginResolver; import java.net.URI; +import java.util.concurrent.atomic.AtomicBoolean; abstract class AbstractPluginRepository implements AuthenticationSupported, PluginRepositoryInternal, BackedByArtifactRepository { - private static final String REPOSITORY_PREFIX = "__pluginRepository"; + private static final String REPOSITORY_PREFIX = "__pluginRepository__"; private final FileResolver fileResolver; private final DependencyResolutionServices dependencyResolutionServices; private final VersionSelectorScheme versionSelectorScheme; private final AuthenticationSupportedInternal authenticationSupport; + private final AtomicBoolean hasYieldedArtifactRepository; private String name; - private int position; private Object url; private PluginResolver resolver; - private ArtifactRepository artifactRepository; AbstractPluginRepository( String defaultName, FileResolver fileResolver, DependencyResolutionServices dependencyResolutionServices, @@ -53,21 +53,24 @@ abstract class AbstractPluginRepository implements AuthenticationSupported, Plug this.dependencyResolutionServices = dependencyResolutionServices; this.versionSelectorScheme = versionSelectorScheme; this.name = defaultName; + this.hasYieldedArtifactRepository = new AtomicBoolean(false); } - protected abstract ArtifactRepository createArtifactRepository(RepositoryHandler repositoryHandler); - AuthenticationSupportedInternal authenticationSupport() { return authenticationSupport; } String getArtifactRepositoryName() { - return REPOSITORY_PREFIX + position; + return REPOSITORY_PREFIX + name; } + protected abstract ArtifactRepository internalCreateArtifactRepository(RepositoryHandler repositoryHandler); + @Override - public String getName() { - return name; + public ArtifactRepository createArtifactRepository(RepositoryHandler repositoryHandler) { + ArtifactRepository repo = internalCreateArtifactRepository(repositoryHandler); + hasYieldedArtifactRepository.set(true); + return repo; } public URI getUrl() { @@ -115,33 +118,15 @@ public AuthenticationContainer getAuthentication() { @Override public PluginResolver asResolver() { if (resolver == null) { - prepareArtifactRepository(); + createArtifactRepository(dependencyResolutionServices.getResolveRepositoryHandler()); resolver = new ArtifactRepositoryPluginResolver(name + '(' + url + ')', dependencyResolutionServices, versionSelectorScheme); } return resolver; } - @Override - public void setPosition(int position) { - checkMutable(); - this.position = position; - } - - @Override - public ArtifactRepository getArtifactRepository() { - prepareArtifactRepository(); - return artifactRepository; - } - private void checkMutable() { - if (artifactRepository != null) { + if (hasYieldedArtifactRepository.get()) { throw new IllegalStateException("A plugin repository cannot be modified after it has been used to resolve plugins."); } } - - private void prepareArtifactRepository() { - if (artifactRepository == null) { - artifactRepository = createArtifactRepository(dependencyResolutionServices.getResolveRepositoryHandler()); - } - } } diff --git a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/BackedByArtifactRepository.java b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/BackedByArtifactRepository.java index 8c15f08497f07..10ef8a3c2b5dc 100644 --- a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/BackedByArtifactRepository.java +++ b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/BackedByArtifactRepository.java @@ -16,17 +16,10 @@ package org.gradle.plugin.use.repository.internal; +import org.gradle.api.artifacts.dsl.RepositoryHandler; import org.gradle.api.artifacts.repositories.ArtifactRepository; import org.gradle.api.internal.plugins.repositories.PluginRepository; public interface BackedByArtifactRepository extends PluginRepository { - ArtifactRepository getArtifactRepository(); - - /** - * This {@link PluginRepository}'s position in the resolution order. - *

- * This is needed just so that the underlying {@link ArtifactRepository} - * can have a unique name. - */ - void setPosition(int position); + ArtifactRepository createArtifactRepository(RepositoryHandler repositoryHandler); } diff --git a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/DefaultGradlePluginPortal.java b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/DefaultGradlePluginPortal.java index 563c414f8146f..8ddc3fe51c469 100644 --- a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/DefaultGradlePluginPortal.java +++ b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/DefaultGradlePluginPortal.java @@ -26,12 +26,12 @@ public class DefaultGradlePluginPortal implements GradlePluginPortal, PluginRepo public DefaultGradlePluginPortal(PluginResolutionServiceResolver pluginResolutionServiceResolver) { this.pluginResolutionServiceResolver = pluginResolutionServiceResolver; } - +/** @Override public String getName() { return "Gradle Plugin Portal"; } - +*/ @Override public PluginResolver asResolver() { return pluginResolutionServiceResolver; diff --git a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/DefaultIvyPluginRepository.java b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/DefaultIvyPluginRepository.java index f5f9bcd9d9427..e11c0d9802a71 100644 --- a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/DefaultIvyPluginRepository.java +++ b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/DefaultIvyPluginRepository.java @@ -38,7 +38,7 @@ public DefaultIvyPluginRepository( } @Override - protected ArtifactRepository createArtifactRepository(RepositoryHandler repositoryHandler) { + protected ArtifactRepository internalCreateArtifactRepository(RepositoryHandler repositoryHandler) { return repositoryHandler.ivy(new Action() { @Override public void execute(IvyArtifactRepository ivyArtifactRepository) { diff --git a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/DefaultMavenPluginRepository.java b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/DefaultMavenPluginRepository.java index 89bdefc8ed0b1..c140d984fb655 100644 --- a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/DefaultMavenPluginRepository.java +++ b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/DefaultMavenPluginRepository.java @@ -39,7 +39,7 @@ public DefaultMavenPluginRepository( } @Override - protected ArtifactRepository createArtifactRepository(RepositoryHandler repositoryHandler) { + protected ArtifactRepository internalCreateArtifactRepository(RepositoryHandler repositoryHandler) { return repositoryHandler.maven(new Action() { @Override public void execute(MavenArtifactRepository mavenArtifactRepository) { diff --git a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/DefaultPluginRepositoryFactory.java b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/DefaultPluginRepositoryFactory.java new file mode 100644 index 0000000000000..896c264d24abb --- /dev/null +++ b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/DefaultPluginRepositoryFactory.java @@ -0,0 +1,92 @@ +/* + * Copyright 2016 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.plugin.use.repository.internal; + +import org.gradle.api.Action; +import org.gradle.api.artifacts.repositories.AuthenticationContainer; +import org.gradle.api.internal.artifacts.DependencyResolutionServices; +import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.VersionSelectorScheme; +import org.gradle.api.internal.artifacts.repositories.AuthenticationSupporter; +import org.gradle.api.internal.file.FileResolver; +import org.gradle.api.internal.plugins.repositories.GradlePluginPortal; +import org.gradle.api.internal.plugins.repositories.IvyPluginRepository; +import org.gradle.api.internal.plugins.repositories.MavenPluginRepository; +import org.gradle.api.internal.plugins.repositories.PluginRepositoryFactory; +import org.gradle.authentication.Authentication; +import org.gradle.internal.Factory; +import org.gradle.internal.artifacts.repositories.AuthenticationSupportedInternal; +import org.gradle.internal.authentication.AuthenticationSchemeRegistry; +import org.gradle.internal.authentication.DefaultAuthenticationContainer; +import org.gradle.internal.reflect.Instantiator; +import org.gradle.plugin.use.resolve.service.internal.PluginResolutionServiceResolver; + +import java.util.Map; + +public class DefaultPluginRepositoryFactory implements PluginRepositoryFactory { + private final AuthenticationSchemeRegistry authenticationSchemeRegistry; + private final Factory dependencyResolutionServicesFactory; + private final VersionSelectorScheme versionSelectorScheme; + private final PluginResolutionServiceResolver pluginResolutionServiceResolver; + private final Instantiator instantiator; + + public DefaultPluginRepositoryFactory( + PluginResolutionServiceResolver pluginResolutionServiceResolver, + Factory dependencyResolutionServicesFactory, + VersionSelectorScheme versionSelectorScheme, Instantiator instantiator, + AuthenticationSchemeRegistry authenticationSchemeRegistry) { + this.pluginResolutionServiceResolver = pluginResolutionServiceResolver; + this.instantiator = instantiator; + this.dependencyResolutionServicesFactory = dependencyResolutionServicesFactory; + this.versionSelectorScheme = versionSelectorScheme; + this.authenticationSchemeRegistry = authenticationSchemeRegistry; + } + + @Override + public MavenPluginRepository maven(Action configurationAction, FileResolver fileResolver) { + AuthenticationContainer authenticationContainer = makeAuthenticationContainer(instantiator, authenticationSchemeRegistry); + AuthenticationSupportedInternal delegate = new AuthenticationSupporter(instantiator, authenticationContainer); + DefaultMavenPluginRepository mavenPluginRepository = instantiator.newInstance( + DefaultMavenPluginRepository.class, fileResolver, dependencyResolutionServicesFactory.create(), versionSelectorScheme, delegate); + configurationAction.execute(mavenPluginRepository); + return mavenPluginRepository; + } + + @Override + public IvyPluginRepository ivy(Action configurationAction, FileResolver fileResolver) { + AuthenticationContainer authenticationContainer = makeAuthenticationContainer(instantiator, authenticationSchemeRegistry); + AuthenticationSupportedInternal delegate = new AuthenticationSupporter(instantiator, authenticationContainer); + DefaultIvyPluginRepository ivyPluginRepository = instantiator.newInstance( + DefaultIvyPluginRepository.class, fileResolver, dependencyResolutionServicesFactory.create(), versionSelectorScheme, delegate); + configurationAction.execute(ivyPluginRepository); + return ivyPluginRepository; + } + + @Override + public GradlePluginPortal gradlePluginPortal() { + return new DefaultGradlePluginPortal(pluginResolutionServiceResolver); + } + + private AuthenticationContainer makeAuthenticationContainer(Instantiator instantiator, AuthenticationSchemeRegistry authenticationSchemeRegistry) { + DefaultAuthenticationContainer container = instantiator.newInstance(DefaultAuthenticationContainer.class, instantiator); + + for (Map.Entry, Class> e : authenticationSchemeRegistry.getRegisteredSchemes().entrySet()) { + container.registerBinding(e.getKey(), e.getValue()); + } + + return container; + } +} diff --git a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/DefaultPluginRepositoryRegistry.java b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/DefaultPluginRepositoryRegistry.java index acedb4c6e85fc..8732f68a21b72 100644 --- a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/DefaultPluginRepositoryRegistry.java +++ b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/DefaultPluginRepositoryRegistry.java @@ -16,104 +16,62 @@ package org.gradle.plugin.use.repository.internal; -import com.google.common.collect.Iterators; -import org.gradle.api.Action; -import org.gradle.api.artifacts.repositories.AuthenticationContainer; -import org.gradle.api.internal.artifacts.DependencyResolutionServices; -import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.VersionSelectorScheme; -import org.gradle.api.internal.artifacts.repositories.AuthenticationSupporter; -import org.gradle.api.internal.file.FileResolver; +import com.google.common.collect.ImmutableList; import org.gradle.api.internal.plugins.repositories.GradlePluginPortal; -import org.gradle.api.internal.plugins.repositories.IvyPluginRepository; -import org.gradle.api.internal.plugins.repositories.MavenPluginRepository; import org.gradle.api.internal.plugins.repositories.PluginRepository; -import org.gradle.api.internal.plugins.repositories.PluginRepositoryRegistry; -import org.gradle.authentication.Authentication; -import org.gradle.internal.Factory; -import org.gradle.internal.artifacts.repositories.AuthenticationSupportedInternal; -import org.gradle.internal.authentication.AuthenticationSchemeRegistry; -import org.gradle.internal.authentication.DefaultAuthenticationContainer; -import org.gradle.internal.reflect.Instantiator; -import org.gradle.plugin.use.resolve.service.internal.PluginResolutionServiceResolver; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; -import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; -public class DefaultPluginRepositoryRegistry implements PluginRepositoryRegistry { - private final AuthenticationSchemeRegistry authenticationSchemeRegistry; - private final Factory dependencyResolutionServicesFactory; - private final VersionSelectorScheme versionSelectorScheme; - private final PluginResolutionServiceResolver pluginResolutionServiceResolver; - private final Instantiator instantiator; +public class DefaultPluginRepositoryRegistry implements PluginRepositoryRegistryInternal { private final List repositories; + private final AtomicBoolean locked; + private final AtomicBoolean portalAdded; - public DefaultPluginRepositoryRegistry( - PluginResolutionServiceResolver pluginResolutionServiceResolver, - Factory dependencyResolutionServicesFactory, - VersionSelectorScheme versionSelectorScheme, Instantiator instantiator, - AuthenticationSchemeRegistry authenticationSchemeRegistry) { - this.pluginResolutionServiceResolver = pluginResolutionServiceResolver; - this.instantiator = instantiator; - this.dependencyResolutionServicesFactory = dependencyResolutionServicesFactory; - this.versionSelectorScheme = versionSelectorScheme; + public DefaultPluginRepositoryRegistry() { this.repositories = new ArrayList(); - this.authenticationSchemeRegistry = authenticationSchemeRegistry; + locked = new AtomicBoolean(false); + portalAdded = new AtomicBoolean(false); } @Override - public MavenPluginRepository maven(Action configurationAction, FileResolver fileResolver) { - AuthenticationContainer authenticationContainer = makeAuthenticationContainer(instantiator, authenticationSchemeRegistry); - AuthenticationSupportedInternal delegate = new AuthenticationSupporter(instantiator, authenticationContainer); - DefaultMavenPluginRepository mavenPluginRepository = instantiator.newInstance( - DefaultMavenPluginRepository.class, fileResolver, dependencyResolutionServicesFactory.create(), versionSelectorScheme, delegate); - configurationAction.execute(mavenPluginRepository); - add(mavenPluginRepository); - return mavenPluginRepository; + public void add(PluginRepository pluginRepository) { + if (pluginRepository instanceof GradlePluginPortal) { + addPortal(pluginRepository); + } else { + addRepository(pluginRepository); + } } @Override - public IvyPluginRepository ivy(Action configurationAction, FileResolver fileResolver) { - AuthenticationContainer authenticationContainer = makeAuthenticationContainer(instantiator, authenticationSchemeRegistry); - AuthenticationSupportedInternal delegate = new AuthenticationSupporter(instantiator, authenticationContainer); - DefaultIvyPluginRepository ivyPluginRepository = instantiator.newInstance( - DefaultIvyPluginRepository.class, fileResolver, dependencyResolutionServicesFactory.create(), versionSelectorScheme, delegate); - configurationAction.execute(ivyPluginRepository); - add(ivyPluginRepository); - return ivyPluginRepository; + public void lock() { + locked.set(true); } @Override - public GradlePluginPortal gradlePluginPortal() { - DefaultGradlePluginPortal gradlePluginPortal = new DefaultGradlePluginPortal(pluginResolutionServiceResolver); - for (PluginRepository pluginRepository : repositories) { - if (((PluginRepositoryInternal) pluginRepository).getName().equals(gradlePluginPortal.getName())) { - throw new IllegalArgumentException("Cannot add Gradle Plugin Portal more than once"); - } + public ImmutableList getPluginRepositories() { + if (locked.get()) { + return ImmutableList.copyOf(repositories); + } else { + throw new IllegalStateException("Cannot read the PluginRepository list when the Registry is unlocked."); } - repositories.add(gradlePluginPortal); - return gradlePluginPortal; - } - - @Override - public Iterator iterator() { - return Iterators.unmodifiableIterator(repositories.iterator()); } - private void add(BackedByArtifactRepository pluginRepository) { - pluginRepository.setPosition(repositories.size() + 1); - repositories.add(pluginRepository); + private void addPortal(PluginRepository pluginPortal) { + if (!portalAdded.get()) { + addRepository(pluginPortal); + portalAdded.set(true); + } else { + throw new IllegalStateException("Cannot add Gradle Plugin Portal more than once."); + } } - - private AuthenticationContainer makeAuthenticationContainer(Instantiator instantiator, AuthenticationSchemeRegistry authenticationSchemeRegistry) { - DefaultAuthenticationContainer container = instantiator.newInstance(DefaultAuthenticationContainer.class, instantiator); - - for (Map.Entry, Class> e : authenticationSchemeRegistry.getRegisteredSchemes().entrySet()) { - container.registerBinding(e.getKey(), e.getValue()); + private void addRepository(PluginRepository pluginRepository) { + if (!locked.get()) { + repositories.add(pluginRepository); + } else { + throw new IllegalStateException("Cannot add a PluginRepository when the Registry is locked."); } - - return container; } } diff --git a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/PluginRepositoryInternal.java b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/PluginRepositoryInternal.java index 728f649f8e0bf..6d1e06c64432e 100644 --- a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/PluginRepositoryInternal.java +++ b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/PluginRepositoryInternal.java @@ -27,7 +27,7 @@ public interface PluginRepositoryInternal extends PluginRepository { * * @return The name. */ - String getName(); + //String getName(); PluginResolver asResolver(); } diff --git a/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/PluginRepositoryRegistryInternal.java b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/PluginRepositoryRegistryInternal.java new file mode 100644 index 0000000000000..4633556270f51 --- /dev/null +++ b/subprojects/plugin-use/src/main/java/org/gradle/plugin/use/repository/internal/PluginRepositoryRegistryInternal.java @@ -0,0 +1,27 @@ +/* + * Copyright 2016 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.plugin.use.repository.internal; + +import com.google.common.collect.ImmutableList; +import org.gradle.api.internal.plugins.repositories.PluginRepository; +import org.gradle.api.internal.plugins.repositories.PluginRepositoryRegistry; + +public interface PluginRepositoryRegistryInternal extends PluginRepositoryRegistry { + void lock(); + + ImmutableList getPluginRepositories(); +}