From aed93fb8b46a6481d3dcf2491f44ed5fc1f397d7 Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Sun, 22 May 2005 00:33:55 +0000 Subject: [PATCH] o still a work in progress but i can release using the plugin, have released several components now and have worked out most of the kinks. there some debugging info but by the time i go through the continuum release i'll know what's what. git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@171270 13f79535-47bb-0310-9956-ffa450edef68 --- maven-plugins/maven-release-plugin/pom.xml | 6 +- .../plugin/release/AbstractReleaseMojo.java | 86 +++++++---- .../plugin/release/PerformReleaseMojo.java | 2 +- .../plugin/release/PrepareReleaseMojo.java | 143 +++++++++++++++--- .../org/apache/maven/plugin/scm/ScmBean.java | 21 ++- 5 files changed, 201 insertions(+), 57 deletions(-) diff --git a/maven-plugins/maven-release-plugin/pom.xml b/maven-plugins/maven-release-plugin/pom.xml index b40afcc616..70dfda6fca 100644 --- a/maven-plugins/maven-release-plugin/pom.xml +++ b/maven-plugins/maven-release-plugin/pom.xml @@ -18,17 +18,17 @@ org.apache.maven.scm maven-scm-api - 1.0-alpha-1-SNAPSHOT + 1.0-alpha-1 org.apache.maven.scm maven-scm-provider-cvs - 1.0-alpha-1-SNAPSHOT + 1.0-alpha-1 org.apache.maven.scm maven-scm-provider-svn - 1.0-alpha-1-SNAPSHOT + 1.0-alpha-1 dom4j diff --git a/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/release/AbstractReleaseMojo.java b/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/release/AbstractReleaseMojo.java index 82a6a94f47..107ed24529 100644 --- a/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/release/AbstractReleaseMojo.java +++ b/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/release/AbstractReleaseMojo.java @@ -27,6 +27,11 @@ import org.codehaus.plexus.context.Context; import org.codehaus.plexus.context.ContextException; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable; +import java.util.Properties; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.File; + /** * @author Emmanuel Venisse * @version $Id: DoxiaMojo.java 169372 2005-05-09 22:47:34Z evenisse $ @@ -35,69 +40,58 @@ public abstract class AbstractReleaseMojo extends AbstractMojo implements Contextualizable { + public static final String RELEASE_PROPS = "release.properties"; + + public static final String USERNAME = "maven.username"; + + public static final String TAG = "tag"; + + public static final String SCM_URL = "scm.url"; + /** * @parameter expression="${project.build.directory}/checkout" * @required */ - private String workingDirectory; + protected String workingDirectory; /** * @parameter expression="${project.scm.developerConnection}" * @required */ - private String urlScm; + protected String urlScm; /** * @parameter expression="${maven.username}" - * @required */ - private String username; + protected String username; /** * @parameter expression="${password}" */ - private String password; + protected String password; /** * @parameter expression="${tagBase}" */ - private String tagBase = "../tags"; + protected String tagBase = "../tags"; /** * @parameter expression="${tag}" */ - private String tag; + protected String tag; /** * @parameter expression="${project}" * @required * @readonly */ - private MavenProject project; + protected MavenProject project; private PlexusContainer container; - private ScmManager scmManager; + protected ScmManager scmManager; - public MavenProject getProject() - { - return project; - } - - public String getWorkingDirectory() - { - return workingDirectory; - } - - protected ScmManager getScmManager() - { - return scmManager; - } - - public String getTag() - { - return tag; - } + private Properties releaseProperties; protected ScmBean getScm() { @@ -105,12 +99,31 @@ public abstract class AbstractReleaseMojo scm.setScmManager( scmManager ); + if ( releaseProperties != null ) + { + urlScm = releaseProperties.getProperty( SCM_URL ); + } + scm.setUrl( urlScm ); + System.out.println( "urlScm = " + urlScm ); + + if ( releaseProperties != null ) + { + tag = releaseProperties.getProperty( TAG ); + } + scm.setTag( tag ); scm.setTagBase( tagBase ); + if ( releaseProperties != null ) + { + username = releaseProperties.getProperty( USERNAME ); + } + + System.out.println( "username = " + username ); + scm.setUsername( username ); scm.setPassword( password ); @@ -131,6 +144,23 @@ public abstract class AbstractReleaseMojo try { initScmManager(); + + // ---------------------------------------------------------------------- + // The release properties file has been created by the prepare phase and + // wants to be shared with the perform. + // ---------------------------------------------------------------------- + + File releasePropertiesFile = new File( project.getFile().getParentFile(), RELEASE_PROPS ); + + if ( releasePropertiesFile.exists() ) + { + + releaseProperties = new Properties(); + + InputStream is = new FileInputStream( releasePropertiesFile ); + + releaseProperties.load( is ); + } } catch ( Exception e ) { diff --git a/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/release/PerformReleaseMojo.java b/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/release/PerformReleaseMojo.java index 6d5f0d8287..5c417340ed 100644 --- a/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/release/PerformReleaseMojo.java +++ b/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/release/PerformReleaseMojo.java @@ -72,7 +72,7 @@ public class PerformReleaseMojo cl.setExecutable( "m2" ); - cl.setWorkingDirectory( getWorkingDirectory() ); + cl.setWorkingDirectory( workingDirectory ); cl.createArgument().setLine( goals ); diff --git a/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/release/PrepareReleaseMojo.java b/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/release/PrepareReleaseMojo.java index ea595aff91..7805c27df6 100644 --- a/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/release/PrepareReleaseMojo.java +++ b/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/release/PrepareReleaseMojo.java @@ -20,7 +20,6 @@ import org.apache.maven.artifact.Artifact; import org.apache.maven.model.Dependency; import org.apache.maven.model.Model; import org.apache.maven.model.Plugin; -import org.apache.maven.model.io.xpp3.MavenXpp3Writer; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.scm.ScmBean; import org.apache.maven.plugin.transformer.PomTransformer; @@ -31,10 +30,14 @@ import org.apache.maven.scm.ScmFile; import org.codehaus.plexus.components.inputhandler.InputHandler; import org.codehaus.plexus.util.StringUtils; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; +import java.util.Properties; /** * Prepare for a release in SCM @@ -56,29 +59,30 @@ public class PrepareReleaseMojo */ private String basedir; - /** - * @parameter expression="${project}" - * @required - * @readonly - */ - private MavenProject project; - private static final String SNAPSHOT = "-SNAPSHOT"; private String projectVersion; + private Model model; + protected void executeTask() throws MojoExecutionException { + model = project.getModel(); + checkForLocalModifications(); checkForPresenceOfSnapshots(); - transformPom(); + transformPomToReleaseVersionPom(); checkInReleaseVersionPom(); tagRelease(); + + transformPomToSnapshotVersionPom(); + + checkInSnapshotVersionPom(); } private boolean isSnapshot( String version ) @@ -207,11 +211,9 @@ public class PrepareReleaseMojo } } - private void transformPom() + private void transformPomToReleaseVersionPom() throws MojoExecutionException { - Model model = project.getModel(); - if ( !isSnapshot( model.getVersion() ) ) { throw new MojoExecutionException( "This project isn't a snapshot (" + model.getVersion() + ")." ); @@ -240,6 +242,29 @@ public class PrepareReleaseMojo model.setVersion( projectVersion ); + try + { + Properties releaseProperties = new Properties(); + + releaseProperties.setProperty( "version", projectVersion ); + + releaseProperties.setProperty( USERNAME, username ); + + releaseProperties.setProperty( TAG, getTagLabel() ); + + releaseProperties.setProperty( SCM_URL, urlScm ); + + FileOutputStream os = new FileOutputStream( new File( project.getFile().getParentFile(), RELEASE_PROPS ) ); + + releaseProperties.store( os, "maven release plugin info" ); + + os.close(); + } + catch ( IOException e ) + { + throw new MojoExecutionException( "Cannote write release-version file.", e ); + } + //Rewrite parent version if ( project.hasParent() ) { @@ -304,10 +329,70 @@ public class PrepareReleaseMojo } catch ( Exception e ) { - throw new MojoExecutionException( "Can't update pom.", e ); + throw new MojoExecutionException( "Can't transform pom to its release version form.", e ); } } + private void transformPomToSnapshotVersionPom() + throws MojoExecutionException + { + // TODO: we will need to incorporate versioning strategies here because it is unlikely + // that everyone will be able to agree on a standard. + + // releaseVersion = 1.0-beta-4 + // snapshotVersion = 1.0-beta-5-SNAPSHOT + + String nextVersionString = projectVersion.substring( projectVersion.lastIndexOf( "-" ) + 1 ); + + try + { + System.out.println( "nextVersionString = " + nextVersionString ); + + nextVersionString = Integer.toString( Integer.parseInt( nextVersionString ) + 1 ); + + System.out.println( "nextVersionString = " + nextVersionString ); + + projectVersion = projectVersion.substring( 0, projectVersion.lastIndexOf( "-" ) + 1 ) + nextVersionString + SNAPSHOT; + } + catch ( NumberFormatException e ) + { + projectVersion = ""; + } + + try + { + getLog().info( "What is the new version? [" + projectVersion + "]" ); + + InputHandler handler = (InputHandler) getContainer().lookup( InputHandler.ROLE ); + + String inputVersion = handler.readLine(); + + if ( !StringUtils.isEmpty( inputVersion ) ) + { + projectVersion = inputVersion; + } + + model.setVersion( projectVersion ); + + PomTransformer transformer = new VersionTransformer(); + + transformer.setOutputFile( project.getFile() ); + + transformer.setProject( project.getFile() ); + + transformer.setUpdatedModel ( model ); + + transformer.transformNodes(); + + transformer.write(); + } + catch ( Exception e ) + { + throw new MojoExecutionException( "Can't transform pom to its snapshot version form.", e ); + } + } + + /** * Check in the POM to SCM after it has been transformed where the version has been * set to the release version. @@ -316,6 +401,18 @@ public class PrepareReleaseMojo */ private void checkInReleaseVersionPom() throws MojoExecutionException + { + checkInPom( "[maven-release-plugin] prepare release " + projectVersion ); + } + + private void checkInSnapshotVersionPom() + throws MojoExecutionException + { + checkInPom( "[maven-release-plugin] prepare release " + projectVersion ); + } + + private void checkInPom( String message ) + throws MojoExecutionException { try { @@ -323,7 +420,7 @@ public class PrepareReleaseMojo scm.setWorkingDirectory( basedir ); - scm.checkin( "[maven-release-plugin] prepare release " + projectVersion, "pom.xml", null ); + scm.checkin( message, "pom.xml", null ); } catch ( Exception e ) { @@ -331,6 +428,17 @@ public class PrepareReleaseMojo } } + private String getTagLabel() + { + String tag = project.getArtifactId().toUpperCase() + "_" + projectVersion.toUpperCase(); + + tag = tag.replace( '-', '_' ); + + tag = tag.replace( '.', '_' ); + + return tag; + } + /** * Tag the release in preparation for performing the release. * @@ -345,12 +453,7 @@ public class PrepareReleaseMojo private void tagRelease() throws MojoExecutionException { - - String tag = project.getArtifactId().toUpperCase() + "_" + projectVersion.toUpperCase(); - - tag = tag.replace( '-', '_' ); - - tag = tag.replace( '.', '_' ); + String tag = getTagLabel(); try { diff --git a/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/scm/ScmBean.java b/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/scm/ScmBean.java index 85d95b1e6d..320473bea0 100644 --- a/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/scm/ScmBean.java +++ b/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/scm/ScmBean.java @@ -1,6 +1,6 @@ package org.apache.maven.plugin.scm; -/* ==================================================================== +/* =========7=========================================================== * Copyright 2001-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -113,9 +113,13 @@ public class ScmBean { // TODO: improve error handling System.err.println( "Provider message:" ); + System.err.println( result.getProviderMessage() ); + System.err.println( "Command output:" ); + System.err.println( result.getCommandOutput() ); + throw new ScmException( "Error!" ); } } @@ -126,12 +130,19 @@ public class ScmBean ScmRepository repository = getScmRepository(); checkoutDirectory = new File( workingDirectory ); - if ( checkoutDirectory.exists() ) + + System.out.println( "workingDirectory = " + workingDirectory ); + + System.out.println( "tag = " + tag ); + + // TODO: sanity check that it is not . or .. or lower + + if ( FileUtils.fileExists( workingDirectory ) ) { - // TODO: sanity check that it is not . or .. or lower - FileUtils.deleteDirectory( checkoutDirectory ); + FileUtils.deleteDirectory( workingDirectory ); + + FileUtils.mkdir( workingDirectory ); } - checkoutDirectory.mkdirs(); CheckOutScmResult result = getScmManager().checkOut( repository, new ScmFileSet( checkoutDirectory ), tag );