1 package org.apache.maven.shared.release.phase;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
52
53 @Singleton
54 @Named( "remove-scm-tag" )
55 public class RemoveScmTagPhase
56 extends AbstractReleasePhase
57 {
58
59
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 }