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