blob: 57ce487be9c81772e10c85b7eed54b0446283cdc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 24.08.2011 Aaron Digulla.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Aaron Digulla - initial API and implementation and/or initial documentation
*******************************************************************************/
package m4e
import groovy.xml.MarkupBuilder;
import java.io.File;
import java.text.SimpleDateFormat;
import m4e.maven.VersionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
class DependencyManagementCmd extends AbstractCommand {
static final String DESCRIPTION = '''\
repository groupId:artifactId:version
- Create a POM with a huge dependencyManagement element that contains all the versions of all the artifacts in the repository
'''
File repo
File dmPom
String groupId
String artifactId
String version
void doRun( String... args ) {
if( args.size() == 1 ) {
throw new UserError( 'Missing path to repository to analyze' )
}
repo = new File( args[1] ).canonicalFile
if( !repo.exists() ) {
throw new UserError( "Directory ${repo} doesn't exist" )
}
prepareErrorLog( repo, 'dependencyManagement' )
if( args.size() <= 2 ) {
throw new UserError( 'Missing groupId:artifactId:version of the POM to create' )
}
String key = args[2]
dmPom = MavenRepositoryTools.buildPath( repo, key, 'pom' )
log.info( "Will write dependencyManagement info to ${dmPom}" )
String[] parts = key.split( ':', -1 )
groupId = parts[0]
artifactId = parts[1]
version = parts[2]
collectArtifacts()
createPom()
}
/** short key -> version */
Map<String, String> versions = [:]
Set<String> duplicates = []
void collectArtifacts() {
MavenRepositoryTools.eachPom( repo ) {
if( dmPom != it ) {
def pom = Pom.load( it )
addPom( pom )
}
}
}
void addPom( Pom pom ) {
String groupId = pom.groupId()
String artifactId = pom.value( Pom.ARTIFACT_ID )
String version = pom.version()
String key = "${groupId}:${artifactId}"
if( key in duplicates ) {
return
}
String old = versions.put( key, version )
if( null != old ) {
duplicates << key
versions.remove( key )
twoVersionsError( pom, old )
}
}
void twoVersionsError( Pom pom, String oldVersion ) {
def versions = VersionUtils.sort( [ pom.version(), oldVersion ] )
def xml = [
artifact: pom.key(),
shortKey: pom.shortKey(),
version1: versions[0],
version2: versions[1],
]
error( Error.TWO_VERSIONS, "The repository contains (at least) two versions of ${pom.shortKey()}: ${versions[0]} and ${versions[1]}. Omitting both.", xml )
}
void createPom() {
dmPom.parentFile.makedirs()
File tmp = new File( dmPom.path + '.tmp' )
tmp.withWriter { Writer writer ->
writer << """\
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>${groupId}</groupId>
<artifactId>${artifactId}</artifactId>
<version>${version}</version>
<dependencyManagement>
<dependencies>
"""
writeDependencies( writer )
writer << """\
</dependencies>
</dependencyManagement>
</project>
"""
}
if( dmPom.exists() ) {
dmPom.usefulDelete()
}
tmp.usefulRename( dmPom )
}
void writeDependencies( Writer writer ) {
List<String> keys = new ArrayList( versions.keySet() )
keys.sort()
for( String key : keys ) {
String[] parts = key.split( ':', -1 )
writer << """\
<dependency>
<groupId>${parts[0]}</groupId>
<artifactId>${parts[1]}</artifactId>
<version>${versions[key]}</version>
</dependency>
"""
}
}
}