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