package hudson.plugins.stagingrelease;
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.ArtifactUtils;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.manager.WagonManager;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.DefaultArtifactRepository;
import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
import org.apache.maven.project.MavenProject;
import org.apache.maven.settings.Settings;
import org.apache.maven.shared.release.ReleaseExecutionException;
import org.apache.maven.shared.release.ReleaseFailureException;
import org.apache.maven.shared.release.ReleaseResult;
import org.apache.maven.shared.release.config.ReleaseDescriptor;
import org.apache.maven.shared.release.phase.AbstractReleasePhase;
import org.apache.maven.wagon.Wagon;
import org.apache.maven.wagon.repository.Repository;
import org.codehaus.plexus.util.cli.CommandLineException;
import org.codehaus.plexus.util.cli.CommandLineUtils;
import org.codehaus.plexus.util.cli.Commandline;
import org.codehaus.plexus.util.cli.CommandLineUtils.StringStreamConsumer;
import org.xml.sax.InputSource;
/**
* @plexus.component role="org.apache.maven.shared.release.phase.ReleasePhase"
* role-hint="subversion-version"
* @author awpyv
*
*/
public class SubversionVersionPhase extends AbstractReleasePhase {
public ReleaseResult execute(ReleaseDescriptor releaseDescriptor,
Settings settings, List reactorProjects)
throws ReleaseExecutionException, ReleaseFailureException {
ReleaseResult result = new ReleaseResult();
try {
MavenProject rootProject = null;
for (MavenProject project : (List<MavenProject>) reactorProjects) {
if (project.getBasedir().getAbsolutePath().equals(
releaseDescriptor.getWorkingDirectory())) {
rootProject = project;
}
}
String baseVersion = releaseDescriptor.getBaseVersion();
if (baseVersion.contains("SVNDATE")) {
String date = getDate(releaseDescriptor.getWorkingDirectory());
baseVersion = baseVersion.replace("SVNDATE", date);
}
for (MavenProject project : (List<MavenProject>) reactorProjects) {
String projectId = ArtifactUtils.versionlessKey(project
.getArtifact());
releaseDescriptor.mapReleaseVersion(projectId, baseVersion);
}
result.setResultCode(ReleaseResult.SUCCESS);
return result;
} catch (Exception e) {
throw new ReleaseExecutionException("Error while finding versions",
e);
}
}
public ReleaseResult simulate(ReleaseDescriptor releaseDescriptor,
Settings settings, List reactorProjects)
throws ReleaseExecutionException, ReleaseFailureException {
return execute(releaseDescriptor, settings, reactorProjects);
}
private String getDate(String file)
throws XPathExpressionException, CommandLineException {
// fix case problem on Windows
file = file.substring(0, 1).toUpperCase().concat(file.substring(1));
Commandline cl = new Commandline("svn");
cl.addArguments(new String[] { "info", "--xml" });
cl.addArguments(new String[] { file });
StringStreamConsumer consumer = new StringStreamConsumer();
CommandLineUtils.executeCommandLine(cl, consumer,
new StringStreamConsumer());
String svnInfo = consumer.getOutput();
XPathFactory xpf = XPathFactory.newInstance();
XPath xpath = xpf.newXPath();
String date = xpath.evaluate("/info//entry[@path='" + file
+ "']/commit/date/text()", new InputSource(new StringReader(
svnInfo)));
date = date.replaceAll("-", "");
date = date.replaceAll("T", "_");
date = date.replaceAll(":", "");
date = date.substring(0, 13);
return date;
}
}