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