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 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
48
49 @Component( role = ReleasePhase.class, hint = "remove-scm-tag" )
50 public class RemoveScmTagPhase
51 extends AbstractReleasePhase
52 {
53
54
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 }