Skip to content

Commit

Permalink
Fixes to support of snapshots with module metadata
Browse files Browse the repository at this point in the history
* Properly saves the timestamp information in the metadata cache
* Properly considers snapshots as changing modules

Fixes #11050
  • Loading branch information
ljacomet committed Oct 22, 2019
1 parent 392f0ab commit b225b44
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 4 deletions.
Expand Up @@ -23,12 +23,15 @@
import org.gradle.api.Transformer;
import org.gradle.api.artifacts.ComponentMetadataListerDetails;
import org.gradle.api.artifacts.ComponentMetadataSupplierDetails;
import org.gradle.api.artifacts.ModuleIdentifier;
import org.gradle.api.artifacts.component.ModuleComponentIdentifier;
import org.gradle.api.artifacts.repositories.AuthenticationContainer;
import org.gradle.api.artifacts.repositories.MavenArtifactRepository;
import org.gradle.api.artifacts.repositories.MavenRepositoryContentDescriptor;
import org.gradle.api.internal.FeaturePreviews;
import org.gradle.api.internal.artifacts.ImmutableModuleIdentifierFactory;
import org.gradle.api.internal.artifacts.ModuleVersionPublisher;
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ComponentResolvers;
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ConfiguredModuleComponentRepository;
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.GradleModuleMetadataParser;
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.MetaDataParser;
Expand All @@ -46,6 +49,8 @@
import org.gradle.api.internal.artifacts.repositories.metadata.RedirectingGradleMetadataModuleMetadataSource;
import org.gradle.api.internal.artifacts.repositories.resolver.ExternalResourceArtifactResolver;
import org.gradle.api.internal.artifacts.repositories.resolver.MavenResolver;
import org.gradle.api.internal.artifacts.repositories.resolver.ResourcePattern;
import org.gradle.api.internal.artifacts.repositories.resolver.VersionLister;
import org.gradle.api.internal.artifacts.repositories.transport.RepositoryTransport;
import org.gradle.api.internal.artifacts.repositories.transport.RepositoryTransportFactory;
import org.gradle.api.internal.file.FileResolver;
Expand All @@ -54,10 +59,16 @@
import org.gradle.internal.action.InstantiatingAction;
import org.gradle.internal.component.external.model.ModuleComponentArtifactIdentifier;
import org.gradle.internal.component.external.model.ModuleComponentArtifactMetadata;
import org.gradle.internal.component.external.model.ModuleDependencyMetadata;
import org.gradle.internal.component.external.model.MutableModuleComponentResolveMetadata;
import org.gradle.internal.component.external.model.maven.MutableMavenModuleResolveMetadata;
import org.gradle.internal.component.model.ComponentOverrideMetadata;
import org.gradle.internal.hash.Hasher;
import org.gradle.internal.instantiation.InstantiatorFactory;
import org.gradle.internal.isolation.IsolatableFactory;
import org.gradle.internal.reflect.Instantiator;
import org.gradle.internal.resolve.result.BuildableModuleComponentMetaDataResolveResult;
import org.gradle.internal.resolve.result.BuildableModuleVersionListingResolveResult;
import org.gradle.internal.resource.local.FileResourceRepository;
import org.gradle.internal.resource.local.FileStore;
import org.gradle.internal.resource.local.LocallyAvailableResourceFinder;
Expand Down Expand Up @@ -272,13 +283,16 @@ ImmutableMetadataSources createMetadataSources(MavenMetadataLoader mavenMetadata
ImmutableList.Builder<MetadataSource<?>> sources = ImmutableList.builder();
// Don't list versions for gradleMetadata if maven-metadata.xml will be checked.
boolean listVersionsForGradleMetadata = !metadataSources.mavenPom;
DefaultGradleModuleMetadataSource gradleModuleMetadataSource = new DefaultGradleModuleMetadataSource(getMetadataParser(), metadataFactory, listVersionsForGradleMetadata);
MetadataSource<MutableModuleComponentResolveMetadata> gradleModuleMetadataSource =
new MavenSnapshotDecoratingSource(
new DefaultGradleModuleMetadataSource(getMetadataParser(), metadataFactory, listVersionsForGradleMetadata)
);
if (metadataSources.gradleMetadata) {
sources.add(gradleModuleMetadataSource);
}
if (metadataSources.mavenPom) {
DefaultMavenPomMetadataSource pomMetadataSource = new DefaultMavenPomMetadataSource(MavenMetadataArtifactProvider.INSTANCE, getPomParser(), fileResourceRepository, getMetadataValidationServices(), mavenMetadataLoader);
if(metadataSources.ignoreGradleMetadataRedirection) {
if (metadataSources.ignoreGradleMetadataRedirection) {
sources.add(pomMetadataSource);
} else {
sources.add(new RedirectingGradleMetadataModuleMetadataSource(pomMetadataSource, gradleModuleMetadataSource));
Expand Down Expand Up @@ -406,4 +420,33 @@ public void ignoreGradleMetadataRedirection() {
}
}

private static class MavenSnapshotDecoratingSource implements MetadataSource<MutableModuleComponentResolveMetadata> {
private static final int HASH_ID = 30155977;

private final MetadataSource<MutableModuleComponentResolveMetadata> delegate;

private MavenSnapshotDecoratingSource(MetadataSource<MutableModuleComponentResolveMetadata> delegate) {
this.delegate = delegate;
}

@Override
public MutableModuleComponentResolveMetadata create(String repositoryName, ComponentResolvers componentResolvers, ModuleComponentIdentifier moduleComponentIdentifier, ComponentOverrideMetadata prescribedMetaData, ExternalResourceArtifactResolver artifactResolver, BuildableModuleComponentMetaDataResolveResult result) {
MutableModuleComponentResolveMetadata metadata = delegate.create(repositoryName, componentResolvers, moduleComponentIdentifier, prescribedMetaData, artifactResolver, result);
if (metadata != null) {
return MavenResolver.processMetaData((MutableMavenModuleResolveMetadata) metadata);
}
return null;
}

@Override
public void listModuleVersions(ModuleDependencyMetadata dependency, ModuleIdentifier module, List<ResourcePattern> ivyPatterns, List<ResourcePattern> artifactPatterns, VersionLister versionLister, BuildableModuleVersionListingResolveResult result) {
delegate.listModuleVersions(dependency, module, ivyPatterns, artifactPatterns, versionLister, result);
}

@Override
public void appendId(Hasher hasher) {
hasher.putInt(HASH_ID);
delegate.appendId(hasher);
}
}
}
Expand Up @@ -39,9 +39,9 @@
*/
public class RedirectingGradleMetadataModuleMetadataSource extends AbstractMetadataSource<MutableModuleComponentResolveMetadata> {
private final MetadataSource<?> delegate;
private final DefaultGradleModuleMetadataSource gradleModuleMetadataSource;
private final MetadataSource<MutableModuleComponentResolveMetadata> gradleModuleMetadataSource;

public RedirectingGradleMetadataModuleMetadataSource(MetadataSource<?> delegate, DefaultGradleModuleMetadataSource gradleModuleMetadataSource) {
public RedirectingGradleMetadataModuleMetadataSource(MetadataSource<?> delegate, MetadataSource<MutableModuleComponentResolveMetadata> gradleModuleMetadataSource) {
this.delegate = delegate;
this.gradleModuleMetadataSource = gradleModuleMetadataSource;
}
Expand Down
Expand Up @@ -21,6 +21,7 @@
import org.gradle.api.artifacts.ModuleVersionIdentifier;
import org.gradle.api.artifacts.component.ModuleComponentIdentifier;
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.GradlePomModuleDescriptorBuilder;
import org.gradle.api.internal.artifacts.repositories.resolver.MavenUniqueSnapshotComponentIdentifier;
import org.gradle.api.internal.attributes.AttributesSchemaInternal;
import org.gradle.api.internal.attributes.ImmutableAttributesFactory;
import org.gradle.api.internal.model.NamedObjectInstantiator;
Expand All @@ -45,6 +46,7 @@ public class DefaultMutableMavenModuleResolveMetadata extends AbstractMutableMod
public DefaultMutableMavenModuleResolveMetadata(ModuleVersionIdentifier id, ModuleComponentIdentifier componentIdentifier, Collection<MavenDependencyDescriptor> dependencies,
ImmutableAttributesFactory attributesFactory, NamedObjectInstantiator objectInstantiator, AttributesSchemaInternal schema) {
super(attributesFactory, id, componentIdentifier, schema);
setTimestampIfNeeded(componentIdentifier);
this.dependencies = ImmutableList.copyOf(dependencies);
this.objectInstantiator = objectInstantiator;
}
Expand All @@ -59,6 +61,18 @@ public DefaultMutableMavenModuleResolveMetadata(ModuleVersionIdentifier id, Modu
this.objectInstantiator = objectInstantiator;
}

private void setTimestampIfNeeded(ModuleComponentIdentifier componentIdentifier) {
if (componentIdentifier instanceof MavenUniqueSnapshotComponentIdentifier) {
snapshotTimestamp = ((MavenUniqueSnapshotComponentIdentifier) componentIdentifier).getTimestamp();
}
}

@Override
public void setId(ModuleComponentIdentifier componentId) {
super.setId(componentId);
setTimestampIfNeeded(componentId);
}

@Override
public MavenModuleResolveMetadata asImmutable() {
return new DefaultMavenModuleResolveMetadata(this);
Expand Down

0 comments on commit b225b44

Please sign in to comment.