MavenArtifactRepository.isArtifactEnabled strange behavior

Trying to understand how MavenArtifactRepository.isArtifactEnabled(), the following build script print values for two different repos:

repositories {
    repositories.clear()
    maven {
        metadataSources {
            mavenPom()
            artifact()
            gradleMetadata()
            println "maven repo: "
            println delegate
            println delegate.isMavenPomEnabled()
            println delegate.isArtifactEnabled()
            println delegate.isGradleMetadataEnabled()
        }
        url "https://repo1.maven.org/maven2/"
    }

    maven {
        metadataSources {
            mavenPom()
            //artifact()
            gradleMetadata()
            println "maven repo 2: "
            println delegate
            println delegate.isMavenPomEnabled()
            println delegate.isArtifactEnabled()
            println delegate.isGradleMetadataEnabled()
        }
        url "https://repo1.maven.org/maven2/"
    }

    forEach{
        println "this is repo section"
        println it
        println it.url.toString()
        println it.metadataSources
        if (it instanceof MavenArtifactRepository) {

            println maven.metadataSources.isMavenPomEnabled()
            println maven.metadataSources.isArtifactEnabled()
            println maven.metadataSources.isGradleMetadataEnabled()
        }
        else
        {
            println ivy.metadataSources.isIvyDescriptorEnabled()
            println ivy.metadataSources.isArtifactEnabled()
            println ivy.metadataSources.isGradleMetadataEnabled()
        }
    }
}


************************************************************
//output:
maven repo:
org.gradle.api.internal.artifacts.repositories.DefaultMavenArtifactRepository$MavenMetadataSources@3d8dacdc
true
true
true
maven repo 2:
org.gradle.api.internal.artifacts.repositories.DefaultMavenArtifactRepository$MavenMetadataSources@64730a5c
true
false
true
this is repo section
org.gradle.api.internal.artifacts.repositories.DefaultMavenArtifactRepository_Decorated@5def4cdd
https://repo1.maven.org/maven2/
org.gradle.api.internal.artifacts.repositories.DefaultMavenArtifactRepository$MavenMetadataSources@3d8dacdc
true
true
true
this is repo section
org.gradle.api.internal.artifacts.repositories.DefaultMavenArtifactRepository_Decorated@7b58a471
https://repo1.maven.org/maven2/
org.gradle.api.internal.artifacts.repositories.DefaultMavenArtifactRepository$MavenMetadataSources@64730a5c
true
true
true

My question is why org.gradle.api.internal.artifacts.repositories.DefaultMavenArtifactRepository$MavenMetadataSources@64730a5c isArtifactEnabled() return value changes from false to true?

Couple things to know about metadataSources.

  1. Before Gradle 6.0, the defaults (no metadataSources specified) include artifact(). In 6.0 and up, artifact() is no longer included in the defaults.
  2. In all versions that support metadataSources, if any metadataSources are configured they replace the defaults. So in repo 2 specifying mavenPom() and gradleMetadata() results in artifact being disabled.

The printlns in the forEach are not all correct. println maven.metadataSources.isMavenPomEnabled() should be println it.metadataSources.isMavenPomEnabled(), same for the other maven.* and ivy.* prints.

The incorrect prints are “working” because; Repositories are named, when maven {...} is called it creates a repository named "maven". The second maven{...} call creates a repo named "maven2". When calling println maven...., the property maven is resolved to the repo with that name, and therefore the forEach loop always prints out the same values (of the first maven repo).

Hope that helps explain what you’re seeing.

Thank you! That helps a lot!