Author: aheritier
Date: Fri Apr 13 16:12:22 2007
New Revision: 528699

URL: http://svn.apache.org/viewvc?view=rev&rev=528699
Log:
MPARTIFACT-75 : Allow to sign artifacts to deploy

Modified:
    maven/maven-1/plugins/trunk/artifact/plugin.properties
    maven/maven-1/plugins/trunk/artifact/project.xml
    
maven/maven-1/plugins/trunk/artifact/src/main/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java
    
maven/maven-1/plugins/trunk/artifact/src/main/org/apache/maven/artifact/deployer/DeployBean.java
    
maven/maven-1/plugins/trunk/artifact/src/main/org/apache/maven/artifact/deployer/RepositoryBuilder.java
    
maven/maven-1/plugins/trunk/artifact/src/test/java/org/apache/maven/artifact/PomRewriterTest.java
    maven/maven-1/plugins/trunk/artifact/xdocs/changes.xml
    maven/maven-1/plugins/trunk/artifact/xdocs/properties.xml

Modified: maven/maven-1/plugins/trunk/artifact/plugin.properties
URL: 
http://svn.apache.org/viewvc/maven/maven-1/plugins/trunk/artifact/plugin.properties?view=diff&rev=528699&r1=528698&r2=528699
==============================================================================
--- maven/maven-1/plugins/trunk/artifact/plugin.properties (original)
+++ maven/maven-1/plugins/trunk/artifact/plugin.properties Fri Apr 13 16:12:22 
2007
@@ -22,4 +22,10 @@
 maven.artifact.manifest.basedir=${plugin.dir}/plugin-resources/templates
 maven.artifact.manifest.template=manifest.vm
 
-maven.artifact.deploy.timestamps=true
\ No newline at end of file
+maven.artifact.deploy.timestamps=true
+
+#GPG Settings
+maven.artifact.gpg.skip=true
+#maven.artifact.gpg.passphrase=
+#maven.artifact.gpg.keyname=
+maven.artifact.gpg.useagent=false
\ No newline at end of file

Modified: maven/maven-1/plugins/trunk/artifact/project.xml
URL: 
http://svn.apache.org/viewvc/maven/maven-1/plugins/trunk/artifact/project.xml?view=diff&rev=528699&r1=528698&r2=528699
==============================================================================
--- maven/maven-1/plugins/trunk/artifact/project.xml (original)
+++ maven/maven-1/plugins/trunk/artifact/project.xml Fri Apr 13 16:12:22 2007
@@ -22,7 +22,7 @@
   <pomVersion>3</pomVersion>
   <id>maven-artifact-plugin</id>
   <name>Maven Artifact Plugin</name>
-  <currentVersion>1.8.1-SNAPSHOT</currentVersion>
+  <currentVersion>1.9-SNAPSHOT</currentVersion>
   <description>Tools to manage artifacts and deployment. *WARNING*: This 
version of the artifact-plugin requires Maven 1.1. People using Maven 1.0 
should NOT use this version of the plugin.</description>
   <shortDescription>Tools to manage artifacts and deployment</shortDescription>
   <versions>

Modified: 
maven/maven-1/plugins/trunk/artifact/src/main/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java
URL: 
http://svn.apache.org/viewvc/maven/maven-1/plugins/trunk/artifact/src/main/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java?view=diff&rev=528699&r1=528698&r2=528699
==============================================================================
--- 
maven/maven-1/plugins/trunk/artifact/src/main/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java
 (original)
+++ 
maven/maven-1/plugins/trunk/artifact/src/main/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java
 Fri Apr 13 16:12:22 2007
@@ -16,22 +16,8 @@
  * limitations under the License.
  */
 
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.security.NoSuchAlgorithmException;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.TimeZone;
-
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.SystemUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.maven.MavenConstants;
@@ -52,24 +38,48 @@
 import org.apache.maven.wagon.providers.file.FileWagon;
 import org.apache.maven.wagon.providers.ftp.FtpWagon;
 import org.apache.maven.wagon.providers.http.HttpWagon;
+import org.apache.maven.wagon.providers.ssh.external.ScpExternalWagon;
 import org.apache.maven.wagon.providers.ssh.jsch.ScpWagon;
 import org.apache.maven.wagon.providers.ssh.jsch.SftpWagon;
-import org.apache.maven.wagon.providers.ssh.external.ScpExternalWagon;
 import org.apache.maven.wagon.repository.Repository;
 import org.codehaus.plexus.util.FileUtils;
+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.DefaultConsumer;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.security.NoSuchAlgorithmException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
 
 /**
  * Default implementation of Artifact Deployer interface.
- *
+ * 
  * @author <a href="mailto:[EMAIL PROTECTED]">Michal Maczka</a>
  * @version $Id$
  */
-public class DefaultArtifactDeployer
-    implements ArtifactDeployer
+public class DefaultArtifactDeployer implements ArtifactDeployer
 {
 
     protected static final String POM_TYPE = "pom";
 
+    public static final String SIGNATURE_EXTENSION = ".asc";
+
     private static final ArtifactTypeHandler POM_ARTIFACT_TYPE_HANDLER = new 
DefaultArtifactTypeHandler();
 
     /**
@@ -84,8 +94,8 @@
     /**
      * @see ArtifactDeployer#deploy(String, String, Project, 
ArtifactTypeHandler)
      */
-    public void deploy( final String artifact, final String type, final 
Project project, final ArtifactTypeHandler handler )
-        throws MavenException
+    public void deploy( final String artifact, final String type, final 
Project project,
+                        final ArtifactTypeHandler handler ) throws 
MavenException
     {
         this.handleDeploy( type, project, project.getArtifactId(), artifact, 
handler, project.getCurrentVersion() );
     }
@@ -93,16 +103,30 @@
     /**
      * @see DefaultArtifactDeployer#deploySnapshot(String, String, Project, 
ArtifactTypeHandler)
      */
-    public void deploySnapshot( final String artifact, final String type, 
final Project project, final ArtifactTypeHandler handler )
-        throws MavenException
+    public void deploySnapshot( final String artifact, final String type, 
final Project project,
+                                final ArtifactTypeHandler handler ) throws 
MavenException
     {
         this.handleDeploy( type, project, project.getArtifactId(), artifact, 
handler, MavenConstants.SNAPSHOT_SIGNIFIER );
     }
 
-    protected void handleDeploy( final String type, final Project project, 
final String artifactId, final String artifact,
-                                 final ArtifactTypeHandler handler, final 
String version )
+    protected void handleDeploy( final String type, final Project project, 
final String artifactId,
+                                 final String artifact, final 
ArtifactTypeHandler handler, final String version )
         throws MavenException
     {
+        Boolean gpgSkip = Boolean.valueOf( (String) 
project.getContext().getVariable( "maven.artifact.gpg.skip" ) );
+        String gpgPassphrase;
+        try
+        {
+            gpgPassphrase = getPassphrase( project );
+        }
+        catch ( IOException e )
+        {
+            throw new MavenException( "Error while retreiving the passphrase 
for gpg", e );
+        }
+        String gpgKeyname = (String) project.getContext().getVariable( 
"maven.artifact.gpg.keyname" );
+        Boolean gpgUseagent =
+            Boolean.valueOf( (String) project.getContext().getVariable( 
"maven.artifact.gpg.useagent" ) );
+
         File file;
         if ( DefaultArtifactDeployer.POM_TYPE.equals( type ) )
         {
@@ -116,11 +140,17 @@
         // do not deploy POM twice
         if ( !DefaultArtifactDeployer.POM_TYPE.equals( type ) )
         {
-            this.doDeploy( PomRewriter.getRewrittenPom( project ), project, 
artifactId, DefaultArtifactDeployer.POM_ARTIFACT_TYPE_HANDLER, version,
-                      DefaultArtifactDeployer.POM_TYPE );
-        }
-
-        this.doDeploy( file, project, artifactId, handler, version, type );
+            File pomFile = PomRewriter.getRewrittenPom( project );
+            if ( !gpgSkip.booleanValue() )
+                generateSignatureForArtifact( pomFile, gpgPassphrase, 
gpgUseagent.booleanValue(), gpgKeyname );
+            this.doDeploy( pomFile, project, artifactId, 
DefaultArtifactDeployer.POM_ARTIFACT_TYPE_HANDLER, version,
+                           DefaultArtifactDeployer.POM_TYPE, 
gpgSkip.booleanValue(), gpgPassphrase,
+                           gpgUseagent.booleanValue(), gpgKeyname );
+        }
+        if ( !gpgSkip.booleanValue() )
+            generateSignatureForArtifact( file, gpgPassphrase, 
gpgUseagent.booleanValue(), gpgKeyname );
+        this.doDeploy( file, project, artifactId, handler, version, type, 
gpgSkip.booleanValue(), gpgPassphrase,
+                       gpgUseagent.booleanValue(), gpgKeyname );
 
         this.snapshotSignature = null;
 
@@ -129,8 +159,8 @@
     /**
      * @see ArtifactDeployer#install(String, String, Project, 
ArtifactTypeHandler)
      */
-    public void install( final String artifact, final String type, final 
Project project, final ArtifactTypeHandler handler )
-        throws MavenException
+    public void install( final String artifact, final String type, final 
Project project,
+                         final ArtifactTypeHandler handler ) throws 
MavenException
     {
         this.handleInstall( type, project, artifact, handler, 
project.getCurrentVersion() );
     }
@@ -138,15 +168,14 @@
     /**
      * @see ArtifactDeployer#installSnapshot(String, String, Project, 
ArtifactTypeHandler)
      */
-    public void installSnapshot( final String artifact, final String type, 
final Project project, final ArtifactTypeHandler handler )
-        throws MavenException
+    public void installSnapshot( final String artifact, final String type, 
final Project project,
+                                 final ArtifactTypeHandler handler ) throws 
MavenException
     {
         this.handleInstall( type, project, artifact, handler, 
MavenConstants.SNAPSHOT_SIGNIFIER );
     }
 
-    private void handleInstall( final String type, final Project project, 
final String artifact, final ArtifactTypeHandler handler,
-                                final String version )
-        throws MavenException
+    private void handleInstall( final String type, final Project project, 
final String artifact,
+                                final ArtifactTypeHandler handler, final 
String version ) throws MavenException
     {
         File file;
         if ( DefaultArtifactDeployer.POM_TYPE.equals( type ) )
@@ -163,27 +192,31 @@
         // do not install twice
         if ( !DefaultArtifactDeployer.POM_TYPE.equals( type ) )
         {
-            this.doInstall( PomRewriter.getRewrittenPom( project ), 
DefaultArtifactDeployer.POM_TYPE, project, version, 
DefaultArtifactDeployer.POM_ARTIFACT_TYPE_HANDLER );
+            this.doInstall( PomRewriter.getRewrittenPom( project ), 
DefaultArtifactDeployer.POM_TYPE, project, version,
+                            DefaultArtifactDeployer.POM_ARTIFACT_TYPE_HANDLER 
);
         }
     }
 
     /**
      * Install given file in local repository
-     *
-     * @param file the artifact file to install
-     * @param type The type of the artiafct
+     * 
+     * @param file
+     *            the artifact file to install
+     * @param type
+     *            The type of the artiafct
      * @param project
-     * @param version String denominating the version of the artifact
+     * @param version
+     *            String denominating the version of the artifact
      * @throws MavenException
      */
-    private void doInstall( final File file, final String type, final Project 
project, final String version, final ArtifactTypeHandler handler )
-        throws MavenException
+    private void doInstall( final File file, final String type, final Project 
project, final String version,
+                            final ArtifactTypeHandler handler ) throws 
MavenException
     {
         try
         {
             final Repository repository = new Repository( "local", "file:" + 
project.getContext().getMavenRepoLocal() );
             final String repositoryPath = handler.constructRepositoryFullPath( 
type, project, version );
-            this.deployFile( repository, file, repositoryPath, project );
+            this.deployFile( repository, file, repositoryPath, project, true, 
null, false, null );
         }
         catch ( final Exception e )
         {
@@ -240,9 +273,10 @@
         return null;
     }
 
-    private void doDeploy( final File file, final Project project, final 
String artifactId, final ArtifactTypeHandler handler, final String version,
-                           final String type )
-        throws MavenException
+    private void doDeploy( final File file, final Project project, final 
String artifactId,
+                           final ArtifactTypeHandler handler, final String 
version, final String type,
+                           final boolean gpgSkip, final String gpgPass, final 
boolean gpgUseAgent,
+                           final String gpgKeyname ) throws MavenException
     {
         final List srcFiles = new ArrayList( 3 );
         final List destFiles = new ArrayList( 3 );
@@ -257,13 +291,14 @@
 
             final File snapshotVersionFile = this.createSnapshotVersionFile( 
file, v, artifactId, type );
 
-            final String snapshotVersionsFilename = 
handler.constructRepositoryDirectoryPath( type, project ) + artifactId
-                + "-snapshot-version";
+            final String snapshotVersionsFilename =
+                handler.constructRepositoryDirectoryPath( type, project ) + 
artifactId + "-snapshot-version";
 
             srcFiles.add( snapshotVersionFile );
             destFiles.add( snapshotVersionsFilename );
 
-            final String deployTimestamp = (String) 
project.getContext().getVariable( "maven.artifact.deploy.timestamps" );
+            final String deployTimestamp =
+                (String) project.getContext().getVariable( 
"maven.artifact.deploy.timestamps" );
             if ( deployTimestamp.equals( "true" ) )
             {
                 srcFiles.add( file );
@@ -318,7 +353,8 @@
             final AuthenticationInfo authenticationInfo = 
RepositoryBuilder.getAuthenticationInfo( project, repo );
             try
             {
-                this.deployFiles( repository, srcFiles, destFiles, 
authenticationInfo, project );
+                this.deployFiles( repository, srcFiles, destFiles, 
authenticationInfo, project, gpgSkip, gpgPass,
+                                  gpgUseAgent, gpgKeyname );
                 success = true;
             }
             catch ( final Exception e )
@@ -336,15 +372,20 @@
         }
     }
 
-    protected void deployFile( final Repository repository, final File src, 
final String dest, final Project project )
+    protected void deployFile( final Repository repository, final File src, 
final String dest, final Project project,
+                               final boolean gpgSkip, final String gpgPass, 
final boolean gpgUseAgent,
+                               final String gpgKeyname )
         throws ResourceDoesNotExistException, MalformedURLException, 
NoSuchAlgorithmException, TransferFailedException,
         ConnectionException, AuthenticationException, AuthorizationException, 
MavenException
     {
-        this.deployFiles( repository, Collections.singletonList( src ), 
Collections.singletonList( dest ), null, project );
+        this.deployFiles( repository, Collections.singletonList( src ), 
Collections.singletonList( dest ), null,
+                          project, gpgSkip, gpgPass, gpgUseAgent, gpgKeyname );
     }
 
     protected void deployFiles( final Repository repository, final List 
srcFiles, final List destFiles,
-                                final AuthenticationInfo authenticationInfo, 
final Project project )
+                                final AuthenticationInfo authenticationInfo, 
final Project project,
+                                final boolean gpgSkip, final String gpgPass, 
final boolean gpgUseAgent,
+                                final String gpgKeyname )
         throws ConnectionException, AuthenticationException, 
ResourceDoesNotExistException, TransferFailedException,
         AuthorizationException, MalformedURLException, 
NoSuchAlgorithmException, MavenException
     {
@@ -379,6 +420,7 @@
 
                 final File srcFile = (File) srcIterator.next();
                 final String destFile = (String) destIterator.next();
+
                 wagon.put( srcFile, destFile );
 
                 wagon.removeTransferListener( uploadMonitor );
@@ -403,6 +445,13 @@
 
                     wagon.put( temp, destFile + "." + extension );
                 }
+
+                if ( !gpgSkip )
+                {
+                    File gpgSignature = generateSignatureForArtifact( srcFile, 
gpgPass, gpgUseAgent, gpgKeyname );
+                    wagon.put( gpgSignature, destFile + SIGNATURE_EXTENSION );
+                }
+
             }
         }
         catch ( final IOException e )
@@ -475,8 +524,7 @@
         return this.snapshotSignature;
     }
 
-    protected File getFileForArtifact( final String artifact )
-        throws MavenException
+    protected File getFileForArtifact( final String artifact ) throws 
MavenException
     {
         final File file = new File( artifact );
         if ( !file.exists() )
@@ -500,8 +548,8 @@
     /**
      * Create a file which contains timestamp of the latetst snapshot
      */
-    protected File createSnapshotVersionFile( final File artifact, final 
String snapshotVersion, final String artifactId, final String type )
-        throws MavenException
+    protected File createSnapshotVersionFile( final File artifact, final 
String snapshotVersion,
+                                              final String artifactId, final 
String type ) throws MavenException
     {
         File file = null;
         final String filename = artifactId + "-" + type + "-snapshot-version";
@@ -518,4 +566,156 @@
         return file;
     }
 
+    /**
+     * @param pass
+     *            The passphrase to use when signing. 
"${maven.artifact.gpg.passphrase}"
+     * @param keyname
+     *            The "name" of the key to sign with. Passed to gpg as 
--local-user. "${maven.artifact.gpg.keyname}"
+     * @param useAgent
+     *            Passes --use-agent or --no-use-agent to gpg. If using an 
agent, the password is optional as the agent
+     *            will provide it. "${maven.artifact.gpg.useagent}"
+     */
+    protected File generateSignatureForArtifact( File file, String pass, 
boolean useAgent, String keyname )
+        throws MavenException
+    {
+        File signature = new File( file + SIGNATURE_EXTENSION );
+
+        if ( signature.exists() )
+        {
+            signature.delete();
+        }
+
+        Commandline cmd = new Commandline();
+
+        cmd.setExecutable( "gpg" + ( SystemUtils.IS_OS_WINDOWS ? ".exe" : "" ) 
);
+
+        if ( useAgent )
+        {
+            cmd.createArgument().setValue( "--use-agent" );
+        }
+        else
+        {
+            cmd.createArgument().setValue( "--no-use-agent" );
+        }
+
+        InputStream in = null;
+        if ( null != pass )
+        {
+            cmd.createArgument().setValue( "--passphrase-fd" );
+
+            cmd.createArgument().setValue( "0" );
+
+            // Prepare the input stream which will be used to pass the 
passphrase to the executable
+            in = new ByteArrayInputStream( pass.getBytes() );
+        }
+
+        if ( null != keyname )
+        {
+            cmd.createArgument().setValue( "--local-user" );
+
+            cmd.createArgument().setValue( keyname );
+        }
+
+        cmd.createArgument().setValue( "--armor" );
+
+        cmd.createArgument().setValue( "--detach-sign" );
+
+        cmd.createArgument().setFile( file );
+
+        try
+        {
+            LOG.debug( "GPG cmd : " + cmd );
+            int exitCode = CommandLineUtils.executeCommandLine( cmd, in, new 
DefaultConsumer(), new DefaultConsumer() );
+
+            if ( exitCode != 0 )
+            {
+                throw new MavenException( "Exit code: " + exitCode );
+            }
+        }
+        catch ( CommandLineException e )
+        {
+            throw new MavenException( "Unable to execute gpg command", e );
+        }
+
+        return signature;
+    }
+
+    protected String getPassphrase( Project project ) throws IOException
+    {
+        String pass = (String) project.getContext().getVariable( 
"maven.artifact.gpg.passphrase" );
+        if ( pass == null )
+        {
+            // TODO: with JDK 1.6, we could call 
System.console().readPassword("GPG Passphrase: ", null);
+
+            BufferedReader in = new BufferedReader( new InputStreamReader( 
System.in ) );
+            while ( System.in.available() != 0 )
+            {
+                // there's some junk already on the input stream, consume it
+                // so we can get the real passphrase
+                System.in.read();
+            }
+
+            System.out.print( "GPG Passphrase: " );
+            MaskingThread thread = new MaskingThread();
+            thread.start();
+
+            pass = in.readLine();
+
+            // stop masking
+            thread.stopMasking();
+        }
+        project.getContext().setVariable( "maven.artifact.gpg.passphrase", 
pass );
+        return pass;
+    }
+
+    // based on ideas from 
http://java.sun.com/developer/technicalArticles/Security/pwordmask/
+    class MaskingThread extends Thread
+    {
+        private volatile boolean stop;
+
+        /**
+         * Begin masking until asked to stop.
+         */
+        public void run()
+        {
+            // this needs to be high priority to make sure the characters don't
+            // really get to the screen.
+
+            int priority = Thread.currentThread().getPriority();
+            Thread.currentThread().setPriority( Thread.MAX_PRIORITY );
+
+            try
+            {
+                stop = false;
+                while ( !stop )
+                {
+                    // print a backspace + * to overwrite anything they type
+                    System.out.print( "\010*" );
+                    try
+                    {
+                        // attempt masking at this rate
+                        Thread.sleep( 1 );
+                    }
+                    catch ( InterruptedException iex )
+                    {
+                        Thread.currentThread().interrupt();
+                        return;
+                    }
+                }
+            }
+            finally
+            {
+                // restore the original priority
+                Thread.currentThread().setPriority( priority );
+            }
+        }
+
+        /**
+         * Instruct the thread to stop masking.
+         */
+        public void stopMasking()
+        {
+            this.stop = true;
+        }
+    }
 }

Modified: 
maven/maven-1/plugins/trunk/artifact/src/main/org/apache/maven/artifact/deployer/DeployBean.java
URL: 
http://svn.apache.org/viewvc/maven/maven-1/plugins/trunk/artifact/src/main/org/apache/maven/artifact/deployer/DeployBean.java?view=diff&rev=528699&r1=528698&r2=528699
==============================================================================
--- 
maven/maven-1/plugins/trunk/artifact/src/main/org/apache/maven/artifact/deployer/DeployBean.java
 (original)
+++ 
maven/maven-1/plugins/trunk/artifact/src/main/org/apache/maven/artifact/deployer/DeployBean.java
 Fri Apr 13 16:12:22 2007
@@ -18,14 +18,15 @@
  */
 
 import org.apache.maven.MavenException;
+import org.apache.maven.artifact.deployer.NamedArtifactDeployer;
+import org.apache.maven.artifact.deployer.NamedArtifactTypeHandler;
 import org.apache.maven.project.Project;
 import org.apache.maven.repository.ArtifactTypeHandler;
 
 /**
- *
- * The Bean which provides access to Artifact Deployement API
- * from jelly scripts.
- *
+ * 
+ * The Bean which provides access to Artifact Deployement API from jelly 
scripts.
+ * 
  * @author <a href="mailto:[EMAIL PROTECTED]">Michal Maczka</a>
  * @version $Id$
  */
@@ -109,7 +110,8 @@
     }
 
     /**
-     * @param newIdOverride The new id.
+     * @param newIdOverride
+     *            The new id.
      */
     public void setArtifactIdOverride( final String newIdOverride )
     {
@@ -117,10 +119,10 @@
     }
 
     /**
-     * @throws MavenException MavenException
+     * @throws MavenException
+     *             MavenException
      */
-    protected void checkAttributes()
-        throws MavenException
+    protected void checkAttributes() throws MavenException
     {
         if ( this.project == null )
         {
@@ -146,15 +148,16 @@
     }
 
     /**
-     * @throws MavenException MavenException
+     * @throws MavenException
+     *             MavenException
      */
-    public void deploy()
-        throws MavenException
+    public void deploy() throws MavenException
     {
         this.checkAttributes();
         if ( this.artifactIdOverride != null )
         {
-            this.artifactDeployer.deploy( this.artifact, this.type, 
this.project, (NamedArtifactTypeHandler) this.typeHandler );
+            this.artifactDeployer.deploy( this.artifact, this.type, 
this.project,
+                                          (NamedArtifactTypeHandler) 
this.typeHandler );
         }
         else
         {
@@ -163,15 +166,16 @@
     }
 
     /**
-     * @throws MavenException MavenException
+     * @throws MavenException
+     *             MavenException
      */
-    public void deploySnapshot()
-        throws MavenException
+    public void deploySnapshot() throws MavenException
     {
         this.checkAttributes();
         if ( this.artifactIdOverride != null )
         {
-            this.artifactDeployer.deploySnapshot( this.artifact, this.type, 
this.project, (NamedArtifactTypeHandler) this.typeHandler );
+            this.artifactDeployer.deploySnapshot( this.artifact, this.type, 
this.project,
+                                                  (NamedArtifactTypeHandler) 
this.typeHandler );
         }
         else
         {
@@ -180,10 +184,10 @@
     }
 
     /**
-     * @throws MavenException MavenException
+     * @throws MavenException
+     *             MavenException
      */
-    public void install()
-        throws MavenException
+    public void install() throws MavenException
     {
         this.checkAttributes();
         if ( this.artifactIdOverride != null )
@@ -197,10 +201,10 @@
     }
 
     /**
-     * @throws MavenException MavenException
+     * @throws MavenException
+     *             MavenException
      */
-    public void installSnapshot()
-        throws MavenException
+    public void installSnapshot() throws MavenException
     {
         this.checkAttributes();
         if ( this.artifactIdOverride != null )

Modified: 
maven/maven-1/plugins/trunk/artifact/src/main/org/apache/maven/artifact/deployer/RepositoryBuilder.java
URL: 
http://svn.apache.org/viewvc/maven/maven-1/plugins/trunk/artifact/src/main/org/apache/maven/artifact/deployer/RepositoryBuilder.java?view=diff&rev=528699&r1=528698&r2=528699
==============================================================================
--- 
maven/maven-1/plugins/trunk/artifact/src/main/org/apache/maven/artifact/deployer/RepositoryBuilder.java
 (original)
+++ 
maven/maven-1/plugins/trunk/artifact/src/main/org/apache/maven/artifact/deployer/RepositoryBuilder.java
 Fri Apr 13 16:12:22 2007
@@ -24,10 +24,10 @@
 import org.apache.maven.wagon.authentication.AuthenticationInfo;
 import org.apache.maven.wagon.providers.ftp.FtpWagon;
 import org.apache.maven.wagon.providers.ssh.AbstractSshWagon;
+import org.apache.maven.wagon.providers.ssh.external.ScpExternalWagon;
 import org.apache.maven.wagon.providers.ssh.jsch.ScpWagon;
 import org.apache.maven.wagon.providers.ssh.jsch.SftpWagon;
 import org.apache.maven.wagon.providers.ssh.knownhost.NullKnownHostProvider;
-import org.apache.maven.wagon.providers.ssh.external.ScpExternalWagon;
 import org.apache.maven.wagon.proxy.ProxyInfo;
 import org.apache.maven.wagon.repository.Repository;
 import org.apache.maven.wagon.repository.RepositoryPermissions;

Modified: 
maven/maven-1/plugins/trunk/artifact/src/test/java/org/apache/maven/artifact/PomRewriterTest.java
URL: 
http://svn.apache.org/viewvc/maven/maven-1/plugins/trunk/artifact/src/test/java/org/apache/maven/artifact/PomRewriterTest.java?view=diff&rev=528699&r1=528698&r2=528699
==============================================================================
--- 
maven/maven-1/plugins/trunk/artifact/src/test/java/org/apache/maven/artifact/PomRewriterTest.java
 (original)
+++ 
maven/maven-1/plugins/trunk/artifact/src/test/java/org/apache/maven/artifact/PomRewriterTest.java
 Fri Apr 13 16:12:22 2007
@@ -16,14 +16,14 @@
  * limitations under the License.
  */
 
+import org.apache.maven.MavenConstants;
+import org.apache.maven.project.Dependency;
+import org.apache.maven.project.Model;
+
 import java.io.File;
 
 import junit.framework.Assert;
 import junit.framework.TestCase;
-
-import org.apache.maven.MavenConstants;
-import org.apache.maven.project.Dependency;
-import org.apache.maven.project.Model;
 
 /**
  * Test the POM rewriter.

Modified: maven/maven-1/plugins/trunk/artifact/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/maven/maven-1/plugins/trunk/artifact/xdocs/changes.xml?view=diff&rev=528699&r1=528698&r2=528699
==============================================================================
--- maven/maven-1/plugins/trunk/artifact/xdocs/changes.xml (original)
+++ maven/maven-1/plugins/trunk/artifact/xdocs/changes.xml Fri Apr 13 16:12:22 
2007
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
 <!-- 
 /*
  * Copyright 2001-2004 The Apache Software Foundation.
@@ -24,19 +23,20 @@
     <author email="[EMAIL PROTECTED]">Vincent Massol</author>
   </properties>
   <body>
-    <release version="1.8.1-SNAPSHOT" date="In SVN">
+    <release version="1.9-SNAPSHOT" date="In SVN">
+      <action dev="aheritier" type="add" issue="MPARTIFACT-75">Allow to sign 
artifacts to deploy. Refer to properties documentation to know how to activate 
it.</action>
       <action dev="aheritier" type="update" issue="MAVEN-1755">Upgrade 
maven-model to version 3.0.2 and use stax reader/parser for the pom to allow to 
use relative entities.</action>
       <action dev="aheritier" type="update" issue="MAVEN-1803">Upgrade 
plexus-utils to version 1.0.5</action>
       <action dev="aheritier" type="update" issue="MAVEN-1796">Upgrade 
commons-jexl to version 1.1</action>
       <action dev="aheritier" type="update" issue="MAVEN-1789">Change the 
default repository to http://repo1.maven.org/maven/ for dependencies url in the 
manifest.</action>
       <action dev="ltheussl" type="fix" issue="MPARTIFACT-72">Creating an 
upload-bundle for a plugin without any java code does not work.</action>
-        <action dev="ltheussl" type="update">Update to velocity 1.5.</action>
+      <action dev="ltheussl" type="update">Update to velocity 1.5.</action>
       <action dev="ltheussl" type="update">Update jelly dependency to match 
the ones in maven 1.1 core.</action>
       <action dev="ltheussl" type="update" issue="MPARTIFACT-67">Include 
javadocs in created upload bundle.</action>
       <action dev="aheritier" type="fix" issue="MPARTIFACT-71">"reject 
HostKey" error : Due to the upgrade of wagon, artifacts can't be deployed with 
scp and sftp protocols.</action>
       <action dev="ltheussl" type="update" issue="MPARTIFACT-66">Upgrade Wagon 
dependencies to version 1.0-beta-2.</action>
       <action dev="aheritier" type="update" issue="MPARTIFACT-66">Upgrade 
dependencies required by wagon : upgrade jsch 0.1.27 (instead of 0.1.14) and 
commons-net 1.4.1 (instead of 1.4.0).</action>
-    </release>  
+    </release>
     <release version="1.8" date="2006-02-24">
       <action dev="ltheussl" type="add" issue="MPARTIFACT-65">Document
         <code>artifact:create-upload-bundle</code>.

Modified: maven/maven-1/plugins/trunk/artifact/xdocs/properties.xml
URL: 
http://svn.apache.org/viewvc/maven/maven-1/plugins/trunk/artifact/xdocs/properties.xml?view=diff&rev=528699&r1=528698&r2=528699
==============================================================================
--- maven/maven-1/plugins/trunk/artifact/xdocs/properties.xml (original)
+++ maven/maven-1/plugins/trunk/artifact/xdocs/properties.xml Fri Apr 13 
16:12:22 2007
@@ -1,21 +1,21 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <!-- 
-/*
- * Copyright 2001-2004 The Apache Software Foundation.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- -->
+  /*
+  * Copyright 2001-2004 The Apache Software Foundation.
+  * 
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  * 
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  * 
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+-->
 
 <document>
 
@@ -35,118 +35,104 @@
         <tr>
           <td>maven.repo.list</td>
           <td>
-            The list of comma separated names of 
-            the repositories to which artifacts produced by 
-            the project will be deployed. E.g.:
-            <br/>
+            The list of comma separated names of the repositories to which 
artifacts produced by the project will be
+            deployed. E.g.:
+            <br />
             <i>maven.repo.list=myrepo1,ibiblio</i>
-            <br/>
-            The names of all other properties are constructed using the
-            entries present in this list. 
-            Below the set of properties which can be used for
-            configuration of deployment process to each of the repositories
-            provided in the list. <i>x</i> in the names
-            of those properties should be replaced by actual repository name
-            (like <i>ibiblio</i>).
-            In case of doubts see an <a href="examples.html">example</a> 
+            <br />
+            The names of all other properties are constructed using the 
entries present in this list. Below the set of
+            properties which can be used for configuration of deployment 
process to each of the repositories provided in
+            the list.
+            <i>x</i>
+            in the names of those properties should be replaced by actual 
repository name (like
+            <i>ibiblio</i>
+            ). In case of doubts see an
+            <a href="examples.html">example</a>
           </td>
           <td>No</td>
         </tr>
         <tr>
           <td>maven.repo.x</td>
           <td>
-             Specifies the URL of remote repository. The URL
-             should contain the protocol name. 
-             <br/>
-             See the <a href="protocols.html">the list</a> of supported 
protocols.
-             <br/>
-             x corresponds to
-             repository name defined using <i>maven.repo.list</i> property.    
         
+            Specifies the URL of remote repository. The URL should contain the 
protocol name.
+            <br />
+            See the
+            <a href="protocols.html">the list</a>
+            of supported protocols.
+            <br />
+            x corresponds to repository name defined using
+            <i>maven.repo.list</i>
+            property.
           </td>
           <td>No</td>
         </tr>
         <tr>
           <td>maven.repo.x.directory</td>
-          <td>
-            The path on the remote file system where artifacts will be placed
-          </td>
+          <td>The path on the remote file system where artifacts will be 
placed</td>
           <td>No</td>
         </tr>
         <tr>
           <td>maven.repo.x.username</td>
           <td>
-             The user name that will be used to authenticated
-             user if access to repository requires authentication.
+            The user name that will be used to authenticated user if access to 
repository requires authentication.
           </td>
           <td>Yes</td>
         </tr>
         <tr>
           <td>maven.repo.x.password</td>
           <td>
-            The password which will be used to authenticate
-            user.
-            <br/>
-            If server/protocol supports authentication via
-            both private/public keys and password,
-            it will first try to use keys for authentication 
-            and if that doesn't work then 
-            will fall back to using the username and password
+            The password which will be used to authenticate user.
+            <br />
+            If server/protocol supports authentication via both private/public 
keys and password, it will first try to
+            use keys for authentication and if that doesn't work then will 
fall back to using the username and password
           </td>
           <td>Yes</td>
-        </tr>        
+        </tr>
         <tr>
           <td>maven.repo.x.group</td>
-          <td>
-            The remote group (UNIX group) to which
-            the artifact will belong after it 
-            is deployed
-          </td>
+          <td>The remote group (UNIX group) to which the artifact will belong 
after it is deployed</td>
           <td>Yes</td>
         </tr>
         <tr>
           <td>maven.repo.x.mode</td>
           <td>
-            The remote file mode (UNIX permissions) to which
-            the artifact will be set to after it 
-            is deployed. Default is <code>g+w</code>.
+            The remote file mode (UNIX permissions) to which the artifact will 
be set to after it is deployed. Default
+            is
+            <code>g+w</code>
+            .
           </td>
           <td>Yes</td>
         </tr>
         <tr>
           <td>maven.repo.x.directory.mode</td>
           <td>
-            The remote directory mode (UNIX permissions) 
-            when directories are created while deploying the artifact.
-            Default is <code>maven.repo.x.mode</code>.
-            <b>Warning:</b> if you are using an octal file permission,
-            you should not use the default value for this as you should
-            add the executable permission for directories.
+            The remote directory mode (UNIX permissions) when directories are 
created while deploying the artifact.
+            Default is
+            <code>maven.repo.x.mode</code>
+            .
+            <b>Warning:</b>
+            if you are using an octal file permission, you should not use the 
default value for this as you should add
+            the executable permission for directories.
           </td>
           <td>Yes</td>
         </tr>
         <tr>
           <td>maven.repo.x.privatekey</td>
           <td>
-             The absolute path to private key file.
-             <br/>
-             Thie is used only for when protocol
-             supports authentication via private/public
-             key pair.
+            The absolute path to private key file.
+            <br />
+            Thie is used only for when protocol supports authentication via 
private/public key pair.
           </td>
           <td>Yes</td>
         </tr>
         <tr>
           <td>maven.repo.x.passphrase</td>
-          <td>
-             The passphrase used to decrypt private key file
-          </td>
+          <td>The passphrase used to decrypt private key file</td>
           <td>Yes</td>
         </tr>
         <tr>
           <td>maven.repo.x.compress</td>
-          <td>
-             Used by scp if you want to compress the stream.
-          </td>
+          <td>Used by scp if you want to compress the stream.</td>
           <td>Yes</td>
         </tr>
       </table>
@@ -155,98 +141,144 @@
       <subsection name="scpexe">
         <table>
           <tr>
+            <th>Property name</th>
+            <th>Description</th>
+            <th>Optional?</th>
+          </tr>
+          <tr>
             <td>maven.repo.x.scp.executable</td>
-            <td>Yes</td>
             <td>
-              Specifies the name (and possibly location) of the remote secure
-              copy executable to use (SCP).
-              The default value is <code>maven.scp.executable</code>.
+              Specifies the name (and possibly location) of the remote secure 
copy executable to use (SCP). The default
+              value is
+              <code>maven.scp.executable</code>
+              .
             </td>
+            <td>Yes</td>
           </tr>
-           <tr>
+          <tr>
             <td>maven.repo.x.scp.args</td>
+            <td>Specifies optional parameters that are passed to the scp 
executable.</td>
             <td>Yes</td>
-            <td>
-              Specifies optional parameters that are passed to the scp 
executable.
-            </td>
           </tr>
           <tr>
             <td>maven.repo.x.ssh.executable</td>
-            <td>Yes</td>
             <td>
-              Specifies the name (and possibly location) of the remote secure
-              shell executable to use (SSH).
-              The default value is <code>maven.ssh.executable</code>.
+              Specifies the name (and possibly location) of the remote secure 
shell executable to use (SSH). The default
+              value is
+              <code>maven.ssh.executable</code>
+              .
             </td>
+            <td>Yes</td>
           </tr>
           <tr>
             <td>maven.repo.x.ssh.args</td>
+            <td>Specifies optional parameters that are passed to the ssh 
executable.</td>
             <td>Yes</td>
-            <td>
-              Specifies optional parameters that are passed to the ssh 
executable.
-            </td>
           </tr>
           <tr>
             <td>maven.repo.x.port</td>
-            <td></td>
-            <td>
-              This property has no effect with scpexe protocol, use args 
instead.
-            </td>
+            <td>This property has no effect with scpexe protocol, use args 
instead.</td>
+            <td>Yes</td>
           </tr>
         </table>
       </subsection>
     </section>
+    <section name="Sign Artifacts - GPG Settings">
+      <p>
+        The artifact plugin allows to automatically sign your artifacts with 
GPG when you deploy a release. You'll find
+        more informations about signing releases here :
+        <a 
href="http://www.apache.org/dev/release-signing.html";>http://www.apache.org/dev/release-signing.html</a>
+      </p>
+      <table>
+        <tr>
+          <th>Property name</th>
+          <th>Description</th>
+          <th>Optional?</th>
+        </tr>
+        <tr>
+          <td>maven.artifact.gpg.skip</td>
+          <td>Do you want to skip the signing step? Default : true. Before to 
enable it you have to correctly setup GPG. You need to have a key and 
<code>gpg</code> must be in your PATH.</td>
+          <td>Yes</td>
+        </tr>
+        <tr>
+          <td>maven.artifact.gpg.passphrase</td>
+          <td>The passphrase to use when signing. Default : not defined. If 
not defined and signing activated, the plugin will prompt for the 
passphrase.</td>
+          <td>Yes</td>
+        </tr>
+        <tr>
+          <td>maven.artifact.gpg.keyname</td>
+          <td>The "name" of the key to sign with. Passed to gpg as 
<code>--local-user</code>. Default : not defined. The default key is used.</td>
+          <td>Yes</td>
+        </tr>
+        <tr>
+          <td>maven.artifact.gpg.useagent</td>
+          <td>Passes <code>--use-agent</code> or <code>--no-use-agent</code> 
to gpg. If using an agent, the password is optional as the agent will provide 
it. Default : false.</td>
+          <td>Yes</td>
+        </tr>
+      </table>
+    </section>
     <section name="Other properties used">
-     <table>
+      <table>
+        <tr>
+          <th>Property name</th>
+          <th>Description</th>
+          <th>Optional?</th>
+        </tr>
         <tr>
           <td>maven.artifact.deploy.timestamps</td>
           <td>
-            Specifies whether timestamped versions of artifacts should
-            be deployed as well when deploying SNAPSHOT versions.
-            Defaults to 'true'.
+            Specifies whether timestamped versions of artifacts should be 
deployed as well when deploying SNAPSHOT
+            versions. Defaults to 'true'.
           </td>
+          <td>Yes</td>
         </tr>
       </table>
-     <p>
-       If you are behind a firewall and need to use a proxy server, check the
-      <a 
href="http://maven.apache.org/maven-1.x/reference/properties.html#Proxy_Properties";>proxy
 properties</a>.
-     </p> 
-    </section>  
+      <p>
+        If you are behind a firewall and need to use a proxy server, check the
+        <a 
href="http://maven.apache.org/maven-1.x/reference/properties.html#Proxy_Properties";>proxy
 properties</a>
+        .
+      </p>
+    </section>
     <section name="Deploy Properties (DEPRECATED)">
       <table>
         <tr>
+          <th>Property name</th>
+          <th>Description</th>
+          <th>Optional?</th>
+        </tr>
+        <tr>
           <td>maven.scp.executable</td>
-          <td>Yes</td>
           <td>
-            Specifies the name (and possibly location) of the remote secure
-            copy executable to use (SCP).
-            The default value is <code>scp</code> (i.e. an executable
-            named <code>scp</code> must be in your path).
+            Specifies the name (and possibly location) of the remote secure 
copy executable to use (SCP). The default
+            value is
+            <code>scp</code>
+            (i.e. an executable named
+            <code>scp</code>
+            must be in your path).
           </td>
+          <td>Yes</td>
         </tr>
-         <tr>
+        <tr>
           <td>maven.scp.args</td>
+          <td>Specifies optional parameters that are passed to the scp 
executable.</td>
           <td>Yes</td>
-          <td>
-            Specifies optional parameters that are passed to the scp 
executable.
-          </td>
         </tr>
         <tr>
           <td>maven.ssh.executable</td>
-          <td>Yes</td>
           <td>
-            Specifies the name (and possibly location) of the remote secure
-            shell executable to use (SSH).
-            The default value is <code>ssh</code> (i.e. an executable
-            named <code>ssh</code> must be in your path).
+            Specifies the name (and possibly location) of the remote secure 
shell executable to use (SSH). The default
+            value is
+            <code>ssh</code>
+            (i.e. an executable named
+            <code>ssh</code>
+            must be in your path).
           </td>
+          <td>Yes</td>
         </tr>
         <tr>
           <td>maven.ssh.args</td>
+          <td>Specifies optional parameters that are passed to the ssh 
executable.</td>
           <td>Yes</td>
-          <td>
-            Specifies optional parameters that are passed to the ssh 
executable.
-          </td>
         </tr>
       </table>
     </section>


Reply via email to