Coverage Report - org.apache.maven.shared.release.phase.ScmTagPhase
 
Classes in this File Line Coverage Branch Coverage Complexity
ScmTagPhase
82%
38/46
70%
7/10
5,667
 
 1  
 package org.apache.maven.shared.release.phase;
 2  
 
 3  
 /*
 4  
  * Licensed to the Apache Software Foundation (ASF) under one
 5  
  * or more contributor license agreements.  See the NOTICE file
 6  
  * distributed with this work for additional information
 7  
  * regarding copyright ownership.  The ASF licenses this file
 8  
  * to you under the Apache License, Version 2.0 (the
 9  
  * "License"); you may not use this file except in compliance
 10  
  * with the License.  You may obtain a copy of the License at
 11  
  *
 12  
  *   http://www.apache.org/licenses/LICENSE-2.0
 13  
  *
 14  
  * Unless required by applicable law or agreed to in writing,
 15  
  * software distributed under the License is distributed on an
 16  
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 17  
  * KIND, either express or implied.  See the License for the
 18  
  * specific language governing permissions and limitations
 19  
  * under the License.
 20  
  */
 21  
 
 22  
 import java.io.File;
 23  
 import java.util.List;
 24  
 
 25  
 import org.apache.maven.project.MavenProject;
 26  
 import org.apache.maven.scm.ScmException;
 27  
 import org.apache.maven.scm.ScmFileSet;
 28  
 import org.apache.maven.scm.ScmTagParameters;
 29  
 import org.apache.maven.scm.command.tag.TagScmResult;
 30  
 import org.apache.maven.scm.manager.NoSuchScmProviderException;
 31  
 import org.apache.maven.scm.provider.ScmProvider;
 32  
 import org.apache.maven.scm.repository.ScmRepository;
 33  
 import org.apache.maven.scm.repository.ScmRepositoryException;
 34  
 import org.apache.maven.shared.release.ReleaseExecutionException;
 35  
 import org.apache.maven.shared.release.ReleaseFailureException;
 36  
 import org.apache.maven.shared.release.ReleaseResult;
 37  
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
 38  
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
 39  
 import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
 40  
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 41  
 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 42  
 import org.apache.maven.shared.release.util.ReleaseUtil;
 43  
 
 44  
 /**
 45  
  * Tag the SCM repository after committing the release.
 46  
  *
 47  
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
 48  
  * @plexus.component role="org.apache.maven.shared.release.phase.ReleasePhase" role-hint="scm-tag"
 49  
  */
 50  80
 public class ScmTagPhase
 51  
     extends AbstractReleasePhase
 52  
 {
 53  
     /**
 54  
      * Tool that gets a configured SCM repository from release configuration.
 55  
      *
 56  
      * @plexus.requirement
 57  
      */
 58  
     private ScmRepositoryConfigurator scmRepositoryConfigurator;
 59  
 
 60  
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
 61  
                                   List<MavenProject> reactorProjects )
 62  
         throws ReleaseExecutionException, ReleaseFailureException
 63  
     {
 64  18
         ReleaseResult relResult = new ReleaseResult();
 65  
 
 66  18
         validateConfiguration( releaseDescriptor );
 67  
 
 68  16
         if ( releaseDescriptor.getWaitBeforeTagging() > 0 )
 69  
         {
 70  0
             logInfo( relResult, "Waiting for " + releaseDescriptor.getWaitBeforeTagging()
 71  
                 + " seconds before tagging the release." );
 72  
             try
 73  
             {
 74  0
                 Thread.sleep( 1000L * releaseDescriptor.getWaitBeforeTagging() );
 75  
             }
 76  0
             catch ( InterruptedException e )
 77  
             {
 78  
                 // Ignore
 79  0
             }
 80  
         }
 81  
 
 82  16
         logInfo( relResult, "Tagging release with the label " + releaseDescriptor.getScmReleaseLabel() + "..." );
 83  
 
 84  16
         ReleaseDescriptor basedirAlignedReleaseDescriptor =
 85  
             ReleaseUtil.createBasedirAlignedReleaseDescriptor( releaseDescriptor, reactorProjects );
 86  
 
 87  
         ScmRepository repository;
 88  
         ScmProvider provider;
 89  
         try
 90  
         {
 91  16
             repository =
 92  
                 scmRepositoryConfigurator.getConfiguredRepository( basedirAlignedReleaseDescriptor.getScmSourceUrl(),
 93  
                                                                    releaseDescriptor,
 94  
                                                                    releaseEnvironment.getSettings() );
 95  
 
 96  12
             repository.getProviderRepository().setPushChanges( releaseDescriptor.isPushChanges() );
 97  
 
 98  12
             provider = scmRepositoryConfigurator.getRepositoryProvider( repository );
 99  
         }
 100  2
         catch ( ScmRepositoryException e )
 101  
         {
 102  2
             throw new ReleaseScmRepositoryException( e.getMessage(), e.getValidationMessages() );
 103  
         }
 104  2
         catch ( NoSuchScmProviderException e )
 105  
         {
 106  2
             throw new ReleaseExecutionException( "Unable to configure SCM repository: " + e.getMessage(), e );
 107  12
         }
 108  
 
 109  
         TagScmResult result;
 110  
         try
 111  
         {
 112  
             // TODO: want includes/excludes?
 113  12
             ScmFileSet fileSet = new ScmFileSet( new File( basedirAlignedReleaseDescriptor.getWorkingDirectory() ) );
 114  12
             String tagName = releaseDescriptor.getScmReleaseLabel();
 115  12
             ScmTagParameters scmTagParameters =
 116  
                 new ScmTagParameters( releaseDescriptor.getScmCommentPrefix() + " copy for tag " + tagName );
 117  12
             scmTagParameters.setRemoteTagging( releaseDescriptor.isRemoteTagging() );
 118  12
             scmTagParameters.setScmRevision( releaseDescriptor.getScmReleasedPomRevision() );
 119  12
             if ( getLogger().isDebugEnabled() )
 120  
             {
 121  0
                 getLogger().debug(
 122  
                     "ScmTagPhase :: scmTagParameters remotingTag " + releaseDescriptor.isRemoteTagging() );
 123  0
                 getLogger().debug(
 124  
                     "ScmTagPhase :: scmTagParameters scmRevision " + releaseDescriptor.getScmReleasedPomRevision() );
 125  0
                 getLogger().debug( "ScmTagPhase :: fileSet  " + fileSet );
 126  
             }
 127  12
             result = provider.tag( repository, fileSet, tagName, scmTagParameters );
 128  
         }
 129  2
         catch ( ScmException e )
 130  
         {
 131  2
             throw new ReleaseExecutionException( "An error is occurred in the tag process: " + e.getMessage(), e );
 132  10
         }
 133  
 
 134  10
         if ( !result.isSuccess() )
 135  
         {
 136  2
             throw new ReleaseScmCommandException( "Unable to tag SCM", result );
 137  
         }
 138  
 
 139  8
         relResult.setResultCode( ReleaseResult.SUCCESS );
 140  
 
 141  8
         return relResult;
 142  
     }
 143  
 
 144  
     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
 145  
                                    List<MavenProject> reactorProjects )
 146  
         throws ReleaseExecutionException, ReleaseFailureException
 147  
     {
 148  4
         ReleaseResult result = new ReleaseResult();
 149  
 
 150  4
         validateConfiguration( releaseDescriptor );
 151  
 
 152  2
         ReleaseDescriptor basedirAlignedReleaseDescriptor =
 153  
             ReleaseUtil.createBasedirAlignedReleaseDescriptor( releaseDescriptor, reactorProjects );
 154  
 
 155  2
         if ( releaseDescriptor.isRemoteTagging() )
 156  
         {
 157  0
             logInfo( result,
 158  
                      "Full run would be tagging working copy " + basedirAlignedReleaseDescriptor.getWorkingDirectory()
 159  
                          + " with label: '" + releaseDescriptor.getScmReleaseLabel() + "'" );
 160  
         }
 161  
         else
 162  
         {
 163  2
             logInfo( result, "Full run would be tagging remotely " + basedirAlignedReleaseDescriptor.getScmSourceUrl()
 164  
                 + " with label: '" + releaseDescriptor.getScmReleaseLabel() + "'" );
 165  
         }
 166  
 
 167  2
         result.setResultCode( ReleaseResult.SUCCESS );
 168  
 
 169  2
         return result;
 170  
     }
 171  
 
 172  
     private static void validateConfiguration( ReleaseDescriptor releaseDescriptor )
 173  
         throws ReleaseFailureException
 174  
     {
 175  22
         if ( releaseDescriptor.getScmReleaseLabel() == null )
 176  
         {
 177  4
             throw new ReleaseFailureException( "A release label is required for committing" );
 178  
         }
 179  18
     }
 180  
 }