View Javadoc
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 org.apache.maven.project.MavenProject;
24  import org.apache.maven.shared.release.ReleaseExecutionException;
25  import org.apache.maven.shared.release.ReleaseFailureException;
26  import org.apache.maven.shared.release.ReleaseResult;
27  import org.apache.maven.shared.release.config.ReleaseDescriptor;
28  import org.apache.maven.shared.release.env.ReleaseEnvironment;
29  import org.codehaus.plexus.component.annotations.Component;
30  
31  import java.util.List;
32  import org.apache.maven.scm.CommandParameter;
33  import org.apache.maven.scm.CommandParameters;
34  import org.apache.maven.scm.ScmException;
35  import org.apache.maven.scm.ScmFileSet;
36  import org.apache.maven.scm.command.untag.UntagScmResult;
37  import org.apache.maven.scm.manager.NoSuchScmProviderException;
38  import org.apache.maven.scm.provider.ScmProvider;
39  import org.apache.maven.scm.repository.ScmRepository;
40  import org.apache.maven.scm.repository.ScmRepositoryException;
41  import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
42  import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
43  import org.apache.maven.shared.release.util.ReleaseUtil;
44  import org.codehaus.plexus.component.annotations.Requirement;
45  
46  /**
47   * Remove tag from SCM repository during rollback
48   */
49  @Component( role = ReleasePhase.class, hint = "remove-scm-tag" )
50  public class RemoveScmTagPhase
51      extends AbstractReleasePhase
52  {
53      /**
54       * Tool that gets a configured SCM repository from release configuration.
55       */
56      @Requirement
57      private ScmRepositoryConfigurator scmRepositoryConfigurator;
58  
59      @Override
60      public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
61                                    List<MavenProject> reactorProjects )
62          throws ReleaseExecutionException, ReleaseFailureException
63      {
64          ReleaseResult releaseResult = new ReleaseResult();
65  
66          validateConfiguration( releaseDescriptor );
67  
68          logInfo( releaseResult, "Removing tag with the label " + releaseDescriptor.getScmReleaseLabel() + " ..." );
69  
70          ReleaseDescriptor basedirAlignedReleaseDescriptor =
71              ReleaseUtil.createBasedirAlignedReleaseDescriptor( releaseDescriptor, reactorProjects );
72  
73          ScmRepository repository;
74          ScmProvider provider;
75          try
76          {
77              repository =
78                  scmRepositoryConfigurator.getConfiguredRepository( basedirAlignedReleaseDescriptor.getScmSourceUrl(),
79                                                                     releaseDescriptor,
80                                                                     releaseEnvironment.getSettings() );
81  
82              repository.getProviderRepository().setPushChanges( releaseDescriptor.isPushChanges() );
83  
84              repository.getProviderRepository().setWorkItem( releaseDescriptor.getWorkItem() );
85  
86              provider = scmRepositoryConfigurator.getRepositoryProvider( repository );
87          }
88          catch ( ScmRepositoryException e )
89          {
90              throw new ReleaseScmRepositoryException( e.getMessage(), e.getValidationMessages() );
91          }
92          catch ( NoSuchScmProviderException e )
93          {
94              throw new ReleaseExecutionException( "Unable to configure SCM repository: " + e.getMessage(), e );
95          }
96  
97          UntagScmResult untagScmResult;
98          try
99          {
100             ScmFileSet fileSet = new ScmFileSet( new File( basedirAlignedReleaseDescriptor.getWorkingDirectory() ) );
101             String tagName = releaseDescriptor.getScmReleaseLabel();
102             String message = releaseDescriptor.getScmCommentPrefix() + "remove tag " + tagName;
103             CommandParameters commandParameters = new CommandParameters();
104             commandParameters.setString( CommandParameter.TAG_NAME, tagName );
105             commandParameters.setString( CommandParameter.MESSAGE, message );
106             if ( getLogger().isDebugEnabled() )
107             {
108                 getLogger().debug(
109                     "RemoveScmTagPhase :: scmUntagParameters tagName " + tagName );
110                 getLogger().debug(
111                     "RemoveScmTagPhase :: scmUntagParameters message " + message );
112                 getLogger().debug(
113                     "RemoveScmTagPhase :: fileSet  " + fileSet );
114             }
115             untagScmResult = provider.untag( repository, fileSet, commandParameters );
116         }
117         catch ( ScmException e )
118         {
119             throw new ReleaseExecutionException( "An error has occurred in the remove tag process: "
120                 + e.getMessage(), e );
121         }
122 
123         if ( !untagScmResult.isSuccess() )
124         {
125             getLogger().warn( String.format( "Unable to remove tag%nProvider message: %s%nCommand output: %s",
126                     untagScmResult.getProviderMessage(), untagScmResult.getCommandOutput() ) );
127         }
128 
129         releaseResult.setResultCode( ReleaseResult.SUCCESS );
130 
131         return releaseResult;
132     }
133 
134     @Override
135     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
136                                    List<MavenProject> reactorProjects )
137         throws ReleaseExecutionException, ReleaseFailureException
138     {
139         ReleaseResult releaseResult = new ReleaseResult();
140 
141         validateConfiguration( releaseDescriptor );
142 
143         logInfo( releaseResult, "Full run would remove tag with label: '" + releaseDescriptor.getScmReleaseLabel()
144                 + "'" );
145 
146         releaseResult.setResultCode( ReleaseResult.SUCCESS );
147 
148         return releaseResult;
149     }
150 
151     private void validateConfiguration( ReleaseDescriptor releaseDescriptor )
152         throws ReleaseFailureException
153     {
154         if ( releaseDescriptor.getScmReleaseLabel() == null )
155         {
156             throw new ReleaseFailureException( "A release label is required for removal" );
157         }
158     }
159 
160 }