Return-Path: Delivered-To: apmail-continuum-commits-archive@www.apache.org Received: (qmail 87917 invoked from network); 6 May 2008 23:57:00 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 6 May 2008 23:57:00 -0000 Received: (qmail 85953 invoked by uid 500); 6 May 2008 23:57:02 -0000 Delivered-To: apmail-continuum-commits-archive@continuum.apache.org Received: (qmail 85928 invoked by uid 500); 6 May 2008 23:57:02 -0000 Mailing-List: contact commits-help@continuum.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@continuum.apache.org Delivered-To: mailing list commits@continuum.apache.org Received: (qmail 85917 invoked by uid 99); 6 May 2008 23:57:02 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 06 May 2008 16:57:02 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 06 May 2008 23:56:24 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id D8DF32388A06; Tue, 6 May 2008 16:56:38 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r653954 - in /continuum/trunk: ./ continuum-api/src/main/java/org/apache/maven/continuum/execution/ continuum-base/ continuum-base/continuum-scm/ continuum-base/continuum-scm/src/ continuum-base/continuum-scm/src/main/ continuum-base/contin... Date: Tue, 06 May 2008 23:56:37 -0000 To: commits@continuum.apache.org From: brett@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080506235638.D8DF32388A06@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: brett Date: Tue May 6 16:56:35 2008 New Revision: 653954 URL: http://svn.apache.org/viewvc?rev=653954&view=rev Log: [CONTINUUM-1745] decouple SCM code from continuum model Merged from: r647659:653953 on builder branch Added: continuum/trunk/continuum-base/ (props changed) - copied from r653952, continuum/branches/builder/continuum-base/ continuum/trunk/continuum-base/continuum-scm/ (props changed) - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/ continuum/trunk/continuum-base/continuum-scm/pom.xml - copied unchanged from r653952, continuum/branches/builder/continuum-base/continuum-scm/pom.xml continuum/trunk/continuum-base/continuum-scm/src/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/ continuum/trunk/continuum-base/continuum-scm/src/main/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/main/ continuum/trunk/continuum-base/continuum-scm/src/main/java/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/main/java/ continuum/trunk/continuum-base/continuum-scm/src/main/java/org/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/main/java/org/ continuum/trunk/continuum-base/continuum-scm/src/main/java/org/apache/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/main/java/org/apache/ continuum/trunk/continuum-base/continuum-scm/src/main/java/org/apache/continuum/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/main/java/org/apache/continuum/ continuum/trunk/continuum-base/continuum-scm/src/main/java/org/apache/continuum/scm/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/main/java/org/apache/continuum/scm/ continuum/trunk/continuum-base/continuum-scm/src/main/java/org/apache/continuum/scm/ContinuumScm.java - copied unchanged from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/main/java/org/apache/continuum/scm/ContinuumScm.java continuum/trunk/continuum-base/continuum-scm/src/main/java/org/apache/continuum/scm/ContinuumScmConfiguration.java - copied unchanged from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/main/java/org/apache/continuum/scm/ContinuumScmConfiguration.java continuum/trunk/continuum-base/continuum-scm/src/main/java/org/apache/continuum/scm/DefaultContinuumScm.java - copied unchanged from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/main/java/org/apache/continuum/scm/DefaultContinuumScm.java continuum/trunk/continuum-base/continuum-scm/src/main/java/org/apache/continuum/scm/manager/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/main/java/org/apache/continuum/scm/manager/ continuum/trunk/continuum-base/continuum-scm/src/main/java/org/apache/continuum/scm/manager/ScmManager.java - copied unchanged from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/main/java/org/apache/continuum/scm/manager/ScmManager.java continuum/trunk/continuum-base/continuum-scm/src/main/java/org/apache/continuum/scm/manager/Slf4jScmLogger.java - copied unchanged from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/main/java/org/apache/continuum/scm/manager/Slf4jScmLogger.java continuum/trunk/continuum-base/continuum-scm/src/main/resources/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/main/resources/ continuum/trunk/continuum-base/continuum-scm/src/main/resources/META-INF/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/main/resources/META-INF/ continuum/trunk/continuum-base/continuum-scm/src/main/resources/META-INF/spring-context.xml - copied unchanged from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/main/resources/META-INF/spring-context.xml continuum/trunk/continuum-base/continuum-scm/src/test/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/test/ continuum/trunk/continuum-base/continuum-scm/src/test/java/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/test/java/ continuum/trunk/continuum-base/continuum-scm/src/test/java/org/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/test/java/org/ continuum/trunk/continuum-base/continuum-scm/src/test/java/org/apache/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/test/java/org/apache/ continuum/trunk/continuum-base/continuum-scm/src/test/java/org/apache/continuum/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/test/java/org/apache/continuum/ continuum/trunk/continuum-base/continuum-scm/src/test/java/org/apache/continuum/scm/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/test/java/org/apache/continuum/scm/ continuum/trunk/continuum-base/continuum-scm/src/test/java/org/apache/continuum/scm/manager/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/test/java/org/apache/continuum/scm/manager/ continuum/trunk/continuum-base/continuum-scm/src/test/java/org/apache/continuum/scm/manager/ScmManagerTest.java - copied unchanged from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/test/java/org/apache/continuum/scm/manager/ScmManagerTest.java continuum/trunk/continuum-base/continuum-scm/src/test/resources/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/test/resources/ continuum/trunk/continuum-base/continuum-scm/src/test/resources/org/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/test/resources/org/ continuum/trunk/continuum-base/continuum-scm/src/test/resources/org/apache/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/test/resources/org/apache/ continuum/trunk/continuum-base/continuum-scm/src/test/resources/org/apache/continuum/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/test/resources/org/apache/continuum/ continuum/trunk/continuum-base/continuum-scm/src/test/resources/org/apache/continuum/scm/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/test/resources/org/apache/continuum/scm/ continuum/trunk/continuum-base/continuum-scm/src/test/resources/org/apache/continuum/scm/manager/ - copied from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/test/resources/org/apache/continuum/scm/manager/ continuum/trunk/continuum-base/continuum-scm/src/test/resources/org/apache/continuum/scm/manager/ScmManagerTest.xml - copied unchanged from r653952, continuum/branches/builder/continuum-base/continuum-scm/src/test/resources/org/apache/continuum/scm/manager/ScmManagerTest.xml continuum/trunk/continuum-base/pom.xml - copied unchanged from r653952, continuum/branches/builder/continuum-base/pom.xml Removed: continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/shell/ continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/scm/ continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/utils/shell/ Modified: continuum/trunk/continuum-api/src/main/java/org/apache/maven/continuum/execution/ContinuumBuildExecutor.java continuum/trunk/continuum-core/pom.xml continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/buildcontroller/DefaultBuildController.java continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/core/action/CheckoutProjectContinuumAction.java continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/core/action/UpdateWorkingDirectoryFromScmContinuumAction.java continuum/trunk/continuum-core/src/main/resources/META-INF/plexus/components.xml continuum/trunk/continuum-data-management/ (props changed) continuum/trunk/continuum-notifiers/ (props changed) continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/applicationContext.xml continuum/trunk/continuum-xmlrpc/ (props changed) continuum/trunk/pom.xml Modified: continuum/trunk/continuum-api/src/main/java/org/apache/maven/continuum/execution/ContinuumBuildExecutor.java URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-api/src/main/java/org/apache/maven/continuum/execution/ContinuumBuildExecutor.java?rev=653954&r1=653953&r2=653954&view=diff ============================================================================== --- continuum/trunk/continuum-api/src/main/java/org/apache/maven/continuum/execution/ContinuumBuildExecutor.java (original) +++ continuum/trunk/continuum-api/src/main/java/org/apache/maven/continuum/execution/ContinuumBuildExecutor.java Tue May 6 16:56:35 2008 @@ -33,9 +33,11 @@ { String ROLE = ContinuumBuildExecutor.class.getName(); + // TODO: stream the build output ContinuumBuildExecutionResult build( Project project, BuildDefinition buildDefinition, File buildOutput ) throws ContinuumBuildExecutorException; + // TODO: rename to be clearer void updateProjectFromCheckOut( File workingDirectory, Project project, BuildDefinition buildDefinition ) throws ContinuumBuildExecutorException; @@ -43,8 +45,10 @@ void killProcess( Project project ); + // TODO: are these part of the builder interface, or a separate project/build definition interface? List getDeployableArtifacts( Project project, File workingDirectory, BuildDefinition buildDefinition ) throws ContinuumBuildExecutorException; + //TODO: Move as a plugin void backupTestFiles( Project project, int buildId ); } Propchange: continuum/trunk/continuum-base/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Tue May 6 16:56:35 2008 @@ -0,0 +1,4 @@ +target +.classpath +.project +.settings Propchange: continuum/trunk/continuum-base/continuum-scm/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Tue May 6 16:56:35 2008 @@ -0,0 +1,3 @@ +.classpath +target +.project Modified: continuum/trunk/continuum-core/pom.xml URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/pom.xml?rev=653954&r1=653953&r2=653954&view=diff ============================================================================== --- continuum/trunk/continuum-core/pom.xml (original) +++ continuum/trunk/continuum-core/pom.xml Tue May 6 16:56:35 2008 @@ -128,6 +128,10 @@ continuum-security + org.apache.continuum + continuum-scm + + org.codehaus.plexus.redback redback-rbac-role-manager Modified: continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/buildcontroller/DefaultBuildController.java URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/buildcontroller/DefaultBuildController.java?rev=653954&r1=653953&r2=653954&view=diff ============================================================================== --- continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/buildcontroller/DefaultBuildController.java (original) +++ continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/buildcontroller/DefaultBuildController.java Tue May 6 16:56:35 2008 @@ -29,12 +29,13 @@ import org.apache.maven.continuum.model.scm.ScmResult; import org.apache.maven.continuum.notification.ContinuumNotificationDispatcher; import org.apache.maven.continuum.project.ContinuumProjectState; -import org.apache.maven.continuum.scm.ContinuumScmException; import org.apache.maven.continuum.store.ContinuumObjectNotFoundException; import org.apache.maven.continuum.store.ContinuumStore; import org.apache.maven.continuum.store.ContinuumStoreException; import org.apache.maven.continuum.utils.ContinuumUtils; import org.apache.maven.continuum.utils.WorkingDirectoryService; +import org.apache.maven.scm.ScmException; +import org.apache.maven.scm.repository.ScmRepositoryException; import org.codehaus.plexus.action.ActionManager; import org.codehaus.plexus.action.ActionNotFoundException; import org.codehaus.plexus.logging.AbstractLogEnabled; @@ -413,19 +414,15 @@ error = ContinuumUtils.throwableToString( e ); exception = new TaskExecutionException( "Error looking up action '" + actionName + "'", e ); } - catch ( ContinuumScmException e ) + catch ( ScmRepositoryException e ) { - ScmResult result = e.getResult(); + error = getValidationMessages( e ) + "\n" + ContinuumUtils.throwableToString( e ); - if ( result != null ) - { - error = convertScmResultToError( result ); - } - - if ( error == null ) - { - error = ContinuumUtils.throwableToString( e ); - } + exception = new TaskExecutionException( "SCM error while executing '" + actionName + "'", e ); + } + catch ( ScmException e ) + { + error = ContinuumUtils.throwableToString( e ); exception = new TaskExecutionException( "SCM error while executing '" + actionName + "'", e ); } @@ -571,6 +568,27 @@ return true; } + private String getValidationMessages( ScmRepositoryException ex ) + { + List messages = ex.getValidationMessages(); + + StringBuffer message = new StringBuffer(); + + if ( messages != null && !messages.isEmpty() ) + { + for ( Iterator i = messages.iterator(); i.hasNext(); ) + { + message.append( (String) i.next() ); + + if ( i.hasNext() ) + { + message.append( System.getProperty( "line.separator" ) ); + } + } + } + return message.toString(); + } + protected void checkProjectDependencies( BuildContext context ) { if ( context.getOldBuildResult() == null ) Modified: continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/core/action/CheckoutProjectContinuumAction.java URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/core/action/CheckoutProjectContinuumAction.java?rev=653954&r1=653953&r2=653954&view=diff ============================================================================== --- continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/core/action/CheckoutProjectContinuumAction.java (original) +++ continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/core/action/CheckoutProjectContinuumAction.java Tue May 6 16:56:35 2008 @@ -19,27 +19,32 @@ * under the License. */ -import org.apache.maven.continuum.Continuum; +import java.io.File; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.continuum.scm.ContinuumScm; +import org.apache.continuum.scm.ContinuumScmConfiguration; import org.apache.maven.continuum.model.project.BuildDefinition; import org.apache.maven.continuum.model.project.Project; import org.apache.maven.continuum.model.scm.ScmResult; import org.apache.maven.continuum.notification.ContinuumNotificationDispatcher; import org.apache.maven.continuum.project.ContinuumProjectState; -import org.apache.maven.continuum.scm.ContinuumScm; -import org.apache.maven.continuum.scm.ContinuumScmException; +import org.apache.maven.continuum.store.ContinuumObjectNotFoundException; import org.apache.maven.continuum.store.ContinuumStore; +import org.apache.maven.continuum.store.ContinuumStoreException; import org.apache.maven.continuum.utils.ContinuumUtils; +import org.apache.maven.scm.ScmException; +import org.apache.maven.scm.command.checkout.CheckOutScmResult; import org.apache.maven.scm.manager.NoSuchScmProviderException; +import org.apache.maven.scm.repository.ScmRepositoryException; import org.codehaus.plexus.util.StringUtils; -import java.io.File; -import java.util.Map; - /** * @author Trygve Laugstøl * @version $Id$ - * @plexus.component role="org.codehaus.plexus.action.Action" - * role-hint="checkout-project" + * @plexus.component role="org.codehaus.plexus.action.Action" role-hint="checkout-project" */ public class CheckoutProjectContinuumAction extends AbstractContinuumAction @@ -60,7 +65,7 @@ private ContinuumStore store; public void execute( Map context ) - throws Exception + throws ContinuumObjectNotFoundException, ContinuumStoreException { Project project = store.getProject( getProject( context ).getId() ); @@ -85,39 +90,71 @@ try { - result = scm.checkOut( project, workingDirectory, context ); - //CONTINUUM-1394 - result.setChanges( null ); - } - catch ( ContinuumScmException e ) - { - // TODO: Dissect the scm exception to be able to give better feedback - Throwable cause = e.getCause(); + ContinuumScmConfiguration config = createScmConfiguration( project, workingDirectory ); - if ( cause instanceof NoSuchScmProviderException ) - { - result = new ScmResult(); + String tag = config.getTag(); + getLogger().info( + "Checking out project: '" + project.getName() + "', id: '" + project.getId() + "' " + + "to '" + workingDirectory + "'" + + ( tag != null ? " with branch/tag " + tag + "." : "." ) ); - result.setSuccess( false ); - - result.setProviderMessage( cause.getMessage() ); + CheckOutScmResult checkoutResult = scm.checkout( config ); + if ( StringUtils.isNotEmpty( checkoutResult.getRelativePathProjectDirectory() ) ) + { + context.put( AbstractContinuumAction.KEY_PROJECT_RELATIVE_PATH, + checkoutResult.getRelativePathProjectDirectory() ); } - else if ( e.getResult() != null ) + + if ( !checkoutResult.isSuccess() ) { - result = e.getResult(); + // TODO: is it more appropriate to return this in the converted result so that it can be presented to + // the user? + String msg = + "Error while checking out the code for project: '" + project.getName() + "', id: '" + + project.getId() + "' to '" + workingDirectory.getAbsolutePath() + "'" + + ( tag != null ? " with branch/tag " + tag + "." : "." ); + getLogger().warn( msg ); + + getLogger().warn( "Command output: " + checkoutResult.getCommandOutput() ); + + getLogger().warn( "Provider message: " + checkoutResult.getProviderMessage() ); } else { - result = new ScmResult(); + getLogger().info( "Checked out " + checkoutResult.getCheckedOutFiles().size() + " files." ); + } + + result = convertScmResult( checkoutResult ); + } + catch ( ScmRepositoryException e ) + { + result = new ScmResult(); - result.setSuccess( false ); + result.setSuccess( false ); - result.setException( ContinuumUtils.throwableMessagesToString( e ) ); - } + result.setProviderMessage( e.getMessage() + ": " + getValidationMessages( e ) ); + } + catch ( NoSuchScmProviderException e ) + { + // TODO: this is not making it back into a result of any kind - log it at least. Same is probably the case for ScmException + result = new ScmResult(); + + result.setSuccess( false ); + + result.setProviderMessage( e.getMessage() ); + } + catch ( ScmException e ) + { + result = new ScmResult(); + + result.setSuccess( false ); + + result.setException( ContinuumUtils.throwableMessagesToString( e ) ); } catch ( Throwable t ) { // TODO: do we want this here, or should it be to the logs? + // TODO: what throwables do we really get here that we can cope with? result = new ScmResult(); result.setSuccess( false ); @@ -129,9 +166,7 @@ String relativePath = (String) getObject( context, KEY_PROJECT_RELATIVE_PATH, "" ); if ( StringUtils.isNotEmpty( relativePath ) ) { - project.setRelativePath( relativePath ); - } project = store.getProject( project.getId() ); @@ -145,4 +180,73 @@ context.put( KEY_CHECKOUT_SCM_RESULT, result ); } + + private ContinuumScmConfiguration createScmConfiguration( Project project, File workingDirectory ) + { + ContinuumScmConfiguration config = new ContinuumScmConfiguration(); + config.setUrl( project.getScmUrl() ); + config.setUsername( project.getScmUsername() ); + config.setPassword( project.getScmPassword() ); + config.setUseCredentialsCache( project.isScmUseCache() ); + config.setWorkingDirectory( workingDirectory ); + config.setTag( project.getScmTag() ); + return config; + } + + private ScmResult convertScmResult( CheckOutScmResult scmResult ) + { + ScmResult result = new ScmResult(); + + result.setSuccess( scmResult.isSuccess() ); + + result.setCommandLine( maskPassword( scmResult.getCommandLine() ) ); + + result.setCommandOutput( scmResult.getCommandOutput() ); + + result.setProviderMessage( scmResult.getProviderMessage() ); + + return result; + } + + private String maskPassword( String commandLine ) + { + String cmd = commandLine; + + if ( cmd != null && cmd.startsWith( "svn" ) ) + { + String pwdString = "--password"; + + if ( cmd.indexOf( pwdString ) > 0 ) + { + int index = cmd.indexOf( pwdString ) + pwdString.length() + 1; + + int nextSpace = cmd.indexOf( " ", index ); + + cmd = cmd.substring( 0, index ) + "********" + cmd.substring( nextSpace ); + } + } + + return cmd; + } + + private String getValidationMessages( ScmRepositoryException ex ) + { + List messages = ex.getValidationMessages(); + + StringBuffer message = new StringBuffer(); + + if ( messages != null && !messages.isEmpty() ) + { + for ( Iterator i = messages.iterator(); i.hasNext(); ) + { + message.append( (String) i.next() ); + + if ( i.hasNext() ) + { + message.append( System.getProperty( "line.separator" ) ); + } + } + } + return message.toString(); + } } Modified: continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/core/action/UpdateWorkingDirectoryFromScmContinuumAction.java URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/core/action/UpdateWorkingDirectoryFromScmContinuumAction.java?rev=653954&r1=653953&r2=653954&view=diff ============================================================================== --- continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/core/action/UpdateWorkingDirectoryFromScmContinuumAction.java (original) +++ continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/core/action/UpdateWorkingDirectoryFromScmContinuumAction.java Tue May 6 16:56:35 2008 @@ -19,21 +19,36 @@ * under the License. */ +import org.apache.continuum.scm.ContinuumScm; +import org.apache.continuum.scm.ContinuumScmConfiguration; import org.apache.maven.continuum.model.project.BuildDefinition; +import org.apache.maven.continuum.model.project.BuildResult; import org.apache.maven.continuum.model.project.Project; +import org.apache.maven.continuum.model.scm.ChangeFile; +import org.apache.maven.continuum.model.scm.ChangeSet; import org.apache.maven.continuum.model.scm.ScmResult; import org.apache.maven.continuum.notification.ContinuumNotificationDispatcher; import org.apache.maven.continuum.project.ContinuumProjectState; -import org.apache.maven.continuum.scm.ContinuumScm; +import org.apache.maven.continuum.store.ContinuumObjectNotFoundException; import org.apache.maven.continuum.store.ContinuumStore; - +import org.apache.maven.continuum.store.ContinuumStoreException; +import org.apache.maven.continuum.utils.WorkingDirectoryService; +import org.apache.maven.scm.ScmException; +import org.apache.maven.scm.ScmFile; +import org.apache.maven.scm.command.update.UpdateScmResult; +import org.apache.maven.scm.manager.NoSuchScmProviderException; +import org.apache.maven.scm.repository.ScmRepositoryException; + +import java.io.File; +import java.util.Date; +import java.util.Iterator; +import java.util.List; import java.util.Map; /** * @author Trygve Laugstøl * @version $Id$ - * @plexus.component role="org.codehaus.plexus.action.Action" - * role-hint="update-working-directory-from-scm" + * @plexus.component role="org.codehaus.plexus.action.Action" role-hint="update-working-directory-from-scm" */ public class UpdateWorkingDirectoryFromScmContinuumAction extends AbstractContinuumAction @@ -49,12 +64,18 @@ private ContinuumScm scm; /** + * @plexus.requirement + */ + private WorkingDirectoryService workingDirectoryService; + + /** * @plexus.requirement role-hint="jdo" */ private ContinuumStore store; public void execute( Map context ) - throws Exception + throws ScmRepositoryException, NoSuchScmProviderException, ScmException, ContinuumObjectNotFoundException, + ContinuumStoreException { Project project = store.getProject( getProject( context ).getId() ); @@ -66,25 +87,187 @@ store.updateProject( project ); - ScmResult scmResult; + UpdateScmResult scmResult; + + Date latestUpdateDate = null; + try + { + BuildResult result = store.getLatestBuildResultForProject( project.getId() ); + + latestUpdateDate = new Date( result.getStartTime() ); + } + catch ( Exception e ) + { + } try { notifier.checkoutStarted( project, buildDefinition ); - scmResult = scm.updateProject( project, context ); + // TODO: not sure why this is different to the context, but it all needs to change + File workingDirectory = workingDirectoryService.getWorkingDirectory( project ); + ContinuumScmConfiguration config = createScmConfiguration( project, workingDirectory ); + config.setLatestUpdateDate( latestUpdateDate ); + String tag = config.getTag(); + String msg = + project.getName() + "', id: '" + project.getId() + "' to '" + workingDirectory.getAbsolutePath() + "'" + + ( tag != null ? " with branch/tag " + tag + "." : "." ); + getLogger().info( "Updating project: " + msg ); + scmResult = scm.update( config ); + + if ( !scmResult.isSuccess() ) + { + getLogger().warn( "Error while updating the code for project: '" + msg ); + + getLogger().warn( "Command output: " + scmResult.getCommandOutput() ); + + getLogger().warn( "Provider message: " + scmResult.getProviderMessage() ); + } + + if ( scmResult.getUpdatedFiles() != null && scmResult.getUpdatedFiles().size() > 0 ) + { + getLogger().info( "Updated " + scmResult.getUpdatedFiles().size() + " files." ); + } - context.put( KEY_UPDATE_SCM_RESULT, scmResult ); + context.put( KEY_UPDATE_SCM_RESULT, convertScmResult( scmResult ) ); } finally { - project = store.getProject( project.getId() ); + // set back to the original state + // TODO: transient states! + try + { + project = store.getProject( project.getId() ); + + project.setState( state ); + + store.updateProject( project ); + } + catch ( Exception e ) + { + // nasty nasty, but we're in finally, so just sacrifice the state to keep the original exception + getLogger().error( e.getMessage(), e ); + } - project.setState( state ); + notifier.checkoutComplete( project, buildDefinition ); + } + } - store.updateProject( project ); + private ContinuumScmConfiguration createScmConfiguration( Project project, File workingDirectory ) + { + ContinuumScmConfiguration config = new ContinuumScmConfiguration(); + config.setUrl( project.getScmUrl() ); + config.setUsername( project.getScmUsername() ); + config.setPassword( project.getScmPassword() ); + config.setUseCredentialsCache( project.isScmUseCache() ); + config.setWorkingDirectory( workingDirectory ); + config.setTag( project.getScmTag() ); + return config; + } - notifier.checkoutComplete( project, buildDefinition ); + private ScmResult convertScmResult( UpdateScmResult scmResult ) + { + ScmResult result = new ScmResult(); + + result.setCommandLine( maskPassword( scmResult.getCommandLine() ) ); + + result.setSuccess( scmResult.isSuccess() ); + + result.setCommandOutput( scmResult.getCommandOutput() ); + + result.setProviderMessage( scmResult.getProviderMessage() ); + + if ( scmResult.getChanges() != null && !scmResult.getChanges().isEmpty() ) + { + for ( org.apache.maven.scm.ChangeSet scmChangeSet : (List) scmResult.getChanges() ) + { + ChangeSet change = new ChangeSet(); + + change.setAuthor( scmChangeSet.getAuthor() ); + + change.setComment( scmChangeSet.getComment() ); + + if ( scmChangeSet.getDate() != null ) + { + change.setDate( scmChangeSet.getDate().getTime() ); + } + + if ( scmChangeSet.getFiles() != null ) + { + for ( org.apache.maven.scm.ChangeFile f : (List) scmChangeSet.getFiles() ) + { + ChangeFile file = new ChangeFile(); + + file.setName( f.getName() ); + + file.setRevision( f.getRevision() ); + + change.addFile( file ); + } + } + + result.addChange( change ); + } } + else + { + // We don't have a changes information probably because provider doesn't have a changelog command + // so we use the updated list that contains only the updated files list + ChangeSet changeSet = convertScmFileSetToChangeSet( scmResult.getUpdatedFiles() ); + + if ( changeSet != null ) + { + result.addChange( changeSet ); + } + + } + + return result; + } + + private static ChangeSet convertScmFileSetToChangeSet( List files ) + { + ChangeSet changeSet = null; + + if ( files != null && !files.isEmpty() ) + { + changeSet = new ChangeSet(); + + // TODO: author, etc. + for ( ScmFile scmFile : files ) + { + ChangeFile file = new ChangeFile(); + + file.setName( scmFile.getPath() ); + + // TODO: revision? + + file.setStatus( scmFile.getStatus().toString() ); + + changeSet.addFile( file ); + } + } + return changeSet; + } + + private String maskPassword( String commandLine ) + { + String cmd = commandLine; + + if ( cmd != null && cmd.startsWith( "svn" ) ) + { + String pwdString = "--password"; + + if ( cmd.indexOf( pwdString ) > 0 ) + { + int index = cmd.indexOf( pwdString ) + pwdString.length() + 1; + + int nextSpace = cmd.indexOf( " ", index ); + + cmd = cmd.substring( 0, index ) + "********" + cmd.substring( nextSpace ); + } + } + + return cmd; } } Modified: continuum/trunk/continuum-core/src/main/resources/META-INF/plexus/components.xml URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/resources/META-INF/plexus/components.xml?rev=653954&r1=653953&r2=653954&view=diff ============================================================================== --- continuum/trunk/continuum-core/src/main/resources/META-INF/plexus/components.xml (original) +++ continuum/trunk/continuum-core/src/main/resources/META-INF/plexus/components.xml Tue May 6 16:56:35 2008 @@ -20,32 +20,6 @@ - - - org.apache.maven.continuum.scm.ContinuumScm - org.apache.maven.continuum.scm.DefaultContinuumScm - - - org.apache.maven.scm.manager.ScmManager - - - org.apache.maven.continuum.utils.WorkingDirectoryService - - - org.apache.maven.continuum.store.ContinuumStore - jdo - - - - - - maven.scm.starteam.deleteLocal - true - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Propchange: continuum/trunk/continuum-xmlrpc/ ------------------------------------------------------------------------------ --- svn:ignore (original) +++ svn:ignore Tue May 6 16:56:35 2008 @@ -1,3 +1,4 @@ +.settings target *~ *.log Modified: continuum/trunk/pom.xml URL: http://svn.apache.org/viewvc/continuum/trunk/pom.xml?rev=653954&r1=653953&r2=653954&view=diff ============================================================================== --- continuum/trunk/pom.xml (original) +++ continuum/trunk/pom.xml Tue May 6 16:56:35 2008 @@ -16,8 +16,7 @@ ~ KIND, either express or implied. See the License for the ~ specific language governing permissions and limitations ~ under the License. - --> - + --> 4.0.0 org.apache.continuum @@ -171,6 +170,7 @@ maven-continuum-plugin continuum-docs continuum-jetty + continuum-base @@ -236,6 +236,7 @@ 3.8.1 test + jmock jmock @@ -414,6 +415,11 @@ org.apache.continuum + continuum-scm + ${pom.version} + + + org.apache.continuum continuum-store tests ${pom.version} @@ -878,5 +884,6 @@ 1.1-SNAPSHOT 1.0.1 1.0-alpha-7 + 2.5.1