Yoav Abrahami created MNG-5250:
----------------------------------

             Summary: DefaultVersionResolver.readVersions reads snapshot 
versions from release only repositories
                 Key: MNG-5250
                 URL: https://jira.codehaus.org/browse/MNG-5250
             Project: Maven 2 & 3
          Issue Type: Bug
          Components: Dependencies, Embedding
    Affects Versions: 3.0.4
         Environment: embedded maven
            Reporter: Yoav Abrahami


with the below repositories configuration in settings.xml [1]
I get an error that a parent of a project is not found if the parent version is 
marked as LATEST. 
The actual error is 
"Could not find artifact XXX in snapshots (URL of SNAPSHOT repository)"
while debugging the reason, I have found that because the 
DefaultVersionResolver.readVersions() method returns SNAPSHOT versions when 
reading versions from a release only repository (repository with snapshot 
policy not enabled).

The fix I have in place is to add to the DefaultVersionResolver.readVersions() 
method the following fragment:
(see the full method below [2]

{code}
/*
 * fix for LATEST - repository who does not support snapshots should not return 
shapshot versions
 */
if (versioning != null && repository instanceof RemoteRepository) {
  RemoteRepository remoteRepository = (RemoteRepository)repository;
  if (!remoteRepository.getPolicy(true).isEnabled()) {
    Versioning repaired = new Versioning();
    repaired.setLastUpdated(versioning.getLastUpdated());
    repaired.setRelease(versioning.getRelease());
    repaired.setVersions(versioning.getVersions());
    versioning = repaired;
  }
}
{code}


[1] : 
{code}
<repositories>
        <repository>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <id>central</id>
          <name>libs-releases</name>
          <url>http://repo.dev.wix/artifactory/libs-releases</url>
        </repository>
        <repository>
          <snapshots />
          <id>snapshots</id>
          <name>libs-snapshots</name>
          <url>http://repo.dev.wix/artifactory/libs-snapshots</url>
        </repository>
      </repositories>
{code}
[2] : 
{code}
    private Versioning readVersions( RepositorySystemSession session, 
RequestTrace trace, Metadata metadata,
                                     ArtifactRepository repository, 
VersionResult result )
    {
        Versioning versioning = null;

        FileInputStream fis = null;
        try
        {
            if ( metadata != null )
            {
                SyncContext syncContext = syncContextFactory.newInstance( 
session, true );

                try
                {
                    syncContext.acquire( null, Collections.singleton( metadata 
) );

                    if ( metadata.getFile() != null && 
metadata.getFile().exists() )
                    {
                        fis = new FileInputStream( metadata.getFile() );
                        org.apache.maven.artifact.repository.metadata.Metadata 
m =
                            new MetadataXpp3Reader().read( fis, false );
                        versioning = m.getVersioning();

                        /*
                         * NOTE: Users occasionally misuse the id "local" for 
remote repos which screws up the metadata
                         * of the local repository. This is especially 
troublesome during snapshot resolution so we try
                         * to handle that gracefully.
                         */
                        if ( versioning != null && repository instanceof 
LocalRepository )
                        {
                            if ( versioning.getSnapshot() != null && 
versioning.getSnapshot().getBuildNumber() > 0 )
                            {
                                Versioning repaired = new Versioning();
                                repaired.setLastUpdated( 
versioning.getLastUpdated() );
                                Snapshot snapshot = new Snapshot();
                                snapshot.setLocalCopy( true );
                                repaired.setSnapshot( snapshot );
                                versioning = repaired;

                                throw new IOException( "Snapshot information 
corrupted with remote repository data"
                                    + ", please verify that no remote 
repository uses the id '" + repository.getId()
                                    + "'" );
                            }
                        }

                        /*
                         * fix for LATEST - repository who does not support 
snapshots should not return shapshot versions
                         */
                        if (versioning != null && repository instanceof 
RemoteRepository) {
                            RemoteRepository remoteRepository = 
(RemoteRepository)repository;
                            if (!remoteRepository.getPolicy(true).isEnabled()) {
                                Versioning repaired = new Versioning();
                                
repaired.setLastUpdated(versioning.getLastUpdated());
                                repaired.setRelease(versioning.getRelease());
                                repaired.setVersions(versioning.getVersions());
                                versioning = repaired;
                            }
                        }
                    }
                }
                finally
                {
                    syncContext.release();
                }
            }
        }
        catch ( Exception e )
        {
            invalidMetadata( session, trace, metadata, repository, e );
            result.addException( e );
        }
        finally
        {
            IOUtil.close( fis );
        }

        return ( versioning != null ) ? versioning : new Versioning();
    }
{code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://jira.codehaus.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to