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 java.util.List;
24
25 import org.apache.maven.project.MavenProject;
26 import org.apache.maven.scm.ScmException;
27 import org.apache.maven.scm.ScmFileSet;
28 import org.apache.maven.scm.ScmTagParameters;
29 import org.apache.maven.scm.command.tag.TagScmResult;
30 import org.apache.maven.scm.manager.NoSuchScmProviderException;
31 import org.apache.maven.scm.provider.ScmProvider;
32 import org.apache.maven.scm.repository.ScmRepository;
33 import org.apache.maven.scm.repository.ScmRepositoryException;
34 import org.apache.maven.shared.release.ReleaseExecutionException;
35 import org.apache.maven.shared.release.ReleaseFailureException;
36 import org.apache.maven.shared.release.ReleaseResult;
37 import org.apache.maven.shared.release.config.ReleaseDescriptor;
38 import org.apache.maven.shared.release.env.ReleaseEnvironment;
39 import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
40 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
41 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
42 import org.apache.maven.shared.release.util.ReleaseUtil;
43 import org.codehaus.plexus.component.annotations.Component;
44 import org.codehaus.plexus.component.annotations.Requirement;
45
46
47
48
49
50
51 @Component( role = ReleasePhase.class, hint = "scm-tag" )
52 public class ScmTagPhase
53 extends AbstractReleasePhase
54 {
55
56
57
58 @Requirement
59 private ScmRepositoryConfigurator scmRepositoryConfigurator;
60
61 @Override
62 public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
63 List<MavenProject> reactorProjects )
64 throws ReleaseExecutionException, ReleaseFailureException
65 {
66 ReleaseResult relResult = new ReleaseResult();
67
68 validateConfiguration( releaseDescriptor );
69
70 if ( releaseDescriptor.getWaitBeforeTagging() > 0 )
71 {
72 logInfo( relResult, "Waiting for " + releaseDescriptor.getWaitBeforeTagging()
73 + " seconds before tagging the release." );
74 try
75 {
76 Thread.sleep( 1000L * releaseDescriptor.getWaitBeforeTagging() );
77 }
78 catch ( InterruptedException e )
79 {
80
81 }
82 }
83
84 logInfo( relResult, "Tagging release with the label " + releaseDescriptor.getScmReleaseLabel() + "..." );
85
86 ReleaseDescriptor basedirAlignedReleaseDescriptor =
87 ReleaseUtil.createBasedirAlignedReleaseDescriptor( releaseDescriptor, reactorProjects );
88
89 ScmRepository repository;
90 ScmProvider provider;
91 try
92 {
93 repository =
94 scmRepositoryConfigurator.getConfiguredRepository( basedirAlignedReleaseDescriptor.getScmSourceUrl(),
95 releaseDescriptor,
96 releaseEnvironment.getSettings() );
97
98 repository.getProviderRepository().setPushChanges( releaseDescriptor.isPushChanges() );
99
100 repository.getProviderRepository().setWorkItem( releaseDescriptor.getWorkItem() );
101
102 provider = scmRepositoryConfigurator.getRepositoryProvider( repository );
103 }
104 catch ( ScmRepositoryException e )
105 {
106 throw new ReleaseScmRepositoryException( e.getMessage(), e.getValidationMessages() );
107 }
108 catch ( NoSuchScmProviderException e )
109 {
110 throw new ReleaseExecutionException( "Unable to configure SCM repository: " + e.getMessage(), e );
111 }
112
113 TagScmResult result;
114 try
115 {
116
117 ScmFileSet fileSet = new ScmFileSet( new File( basedirAlignedReleaseDescriptor.getWorkingDirectory() ) );
118 String tagName = releaseDescriptor.getScmReleaseLabel();
119 ScmTagParameters scmTagParameters =
120 new ScmTagParameters( releaseDescriptor.getScmCommentPrefix() + "copy for tag " + tagName );
121 scmTagParameters.setRemoteTagging( releaseDescriptor.isRemoteTagging() );
122 scmTagParameters.setSign( releaseDescriptor.isScmSignTags() );
123 scmTagParameters.setScmRevision( releaseDescriptor.getScmReleasedPomRevision() );
124 scmTagParameters.setPinExternals( releaseDescriptor.isPinExternals() );
125 if ( getLogger().isDebugEnabled() )
126 {
127 getLogger().debug(
128 "ScmTagPhase :: scmTagParameters remotingTag " + releaseDescriptor.isRemoteTagging() );
129 getLogger().debug(
130 "ScmTagPhase :: scmTagParameters scmRevision " + releaseDescriptor.getScmReleasedPomRevision() );
131 getLogger().debug(
132 "ScmTagPhase :: scmTagParameters pinExternals " + releaseDescriptor.isPinExternals() );
133 getLogger().debug( "ScmTagPhase :: fileSet " + fileSet );
134 }
135 result = provider.tag( repository, fileSet, tagName, scmTagParameters );
136 }
137 catch ( ScmException e )
138 {
139 throw new ReleaseExecutionException( "An error is occurred in the tag process: " + e.getMessage(), e );
140 }
141
142 if ( !result.isSuccess() )
143 {
144 throw new ReleaseScmCommandException( "Unable to tag SCM", result );
145 }
146
147 relResult.setResultCode( ReleaseResult.SUCCESS );
148
149 return relResult;
150 }
151
152 @Override
153 public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
154 List<MavenProject> reactorProjects )
155 throws ReleaseExecutionException, ReleaseFailureException
156 {
157 ReleaseResult result = new ReleaseResult();
158
159 validateConfiguration( releaseDescriptor );
160
161 ReleaseDescriptor basedirAlignedReleaseDescriptor =
162 ReleaseUtil.createBasedirAlignedReleaseDescriptor( releaseDescriptor, reactorProjects );
163
164 if ( releaseDescriptor.isRemoteTagging() )
165 {
166 logInfo( result,
167 "Full run would tag working copy '"
168 + basedirAlignedReleaseDescriptor.getWorkingDirectory() + "'" );
169 }
170 else
171 {
172 logInfo( result, "Full run would tag remotely '"
173 + basedirAlignedReleaseDescriptor.getScmSourceUrl() + "'" );
174 }
175 logInfo( result, " with label '" + releaseDescriptor.getScmReleaseLabel() + "'" );
176 if ( releaseDescriptor.isPinExternals() )
177 {
178 logInfo( result, " and pinned externals" );
179 }
180
181 result.setResultCode( ReleaseResult.SUCCESS );
182
183 return result;
184 }
185
186 private static void validateConfiguration( ReleaseDescriptor releaseDescriptor )
187 throws ReleaseFailureException
188 {
189 if ( releaseDescriptor.getScmReleaseLabel() == null )
190 {
191 throw new ReleaseFailureException( "A release label is required for committing" );
192 }
193 }
194 }