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.setScmRevision( releaseDescriptor.getScmReleasedPomRevision() );
123 if ( getLogger().isDebugEnabled() )
124 {
125 getLogger().debug(
126 "ScmTagPhase :: scmTagParameters remotingTag " + releaseDescriptor.isRemoteTagging() );
127 getLogger().debug(
128 "ScmTagPhase :: scmTagParameters scmRevision " + releaseDescriptor.getScmReleasedPomRevision() );
129 getLogger().debug( "ScmTagPhase :: fileSet " + fileSet );
130 }
131 result = provider.tag( repository, fileSet, tagName, scmTagParameters );
132 }
133 catch ( ScmException e )
134 {
135 throw new ReleaseExecutionException( "An error is occurred in the tag process: " + e.getMessage(), e );
136 }
137
138 if ( !result.isSuccess() )
139 {
140 throw new ReleaseScmCommandException( "Unable to tag SCM", result );
141 }
142
143 relResult.setResultCode( ReleaseResult.SUCCESS );
144
145 return relResult;
146 }
147
148 @Override
149 public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
150 List<MavenProject> reactorProjects )
151 throws ReleaseExecutionException, ReleaseFailureException
152 {
153 ReleaseResult result = new ReleaseResult();
154
155 validateConfiguration( releaseDescriptor );
156
157 ReleaseDescriptor basedirAlignedReleaseDescriptor =
158 ReleaseUtil.createBasedirAlignedReleaseDescriptor( releaseDescriptor, reactorProjects );
159
160 if ( releaseDescriptor.isRemoteTagging() )
161 {
162 logInfo( result,
163 "Full run would be tagging working copy " + basedirAlignedReleaseDescriptor.getWorkingDirectory()
164 + " with label: '" + releaseDescriptor.getScmReleaseLabel() + "'" );
165 }
166 else
167 {
168 logInfo( result, "Full run would be tagging remotely " + basedirAlignedReleaseDescriptor.getScmSourceUrl()
169 + " with label: '" + releaseDescriptor.getScmReleaseLabel() + "'" );
170 }
171
172 result.setResultCode( ReleaseResult.SUCCESS );
173
174 return result;
175 }
176
177 private static void validateConfiguration( ReleaseDescriptor releaseDescriptor )
178 throws ReleaseFailureException
179 {
180 if ( releaseDescriptor.getScmReleaseLabel() == null )
181 {
182 throw new ReleaseFailureException( "A release label is required for committing" );
183 }
184 }
185 }