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 org.apache.maven.project.MavenProject;
23 import org.apache.maven.scm.ScmException;
24 import org.apache.maven.scm.ScmFileSet;
25 import org.apache.maven.scm.ScmVersion;
26 import org.apache.maven.scm.command.checkin.CheckInScmResult;
27 import org.apache.maven.scm.manager.NoSuchScmProviderException;
28 import org.apache.maven.scm.provider.ScmProvider;
29 import org.apache.maven.scm.repository.ScmRepository;
30 import org.apache.maven.scm.repository.ScmRepositoryException;
31 import org.apache.maven.shared.release.ReleaseExecutionException;
32 import org.apache.maven.shared.release.ReleaseFailureException;
33 import org.apache.maven.shared.release.ReleaseResult;
34 import org.apache.maven.shared.release.config.ReleaseDescriptor;
35 import org.apache.maven.shared.release.env.ReleaseEnvironment;
36 import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
37 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
38 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
39 import org.apache.maven.shared.release.util.ReleaseUtil;
40
41 import java.io.File;
42 import java.text.MessageFormat;
43 import java.util.ArrayList;
44 import java.util.Collection;
45 import java.util.Iterator;
46 import java.util.List;
47
48
49
50
51
52
53 public class ScmCommitPhase
54 extends AbstractReleasePhase
55 {
56
57
58
59 private ScmRepositoryConfigurator scmRepositoryConfigurator;
60
61
62
63
64 private String messageFormat;
65
66 public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment, List reactorProjects )
67 throws ReleaseExecutionException, ReleaseFailureException
68 {
69 ReleaseResult relResult = new ReleaseResult();
70
71 validateConfiguration( releaseDescriptor );
72
73 getLogger().info( "Checking in modified POMs..." );
74
75 ScmRepository repository;
76 ScmProvider provider;
77 try
78 {
79 repository = scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor, releaseEnvironment.getSettings() );
80
81 provider = scmRepositoryConfigurator.getRepositoryProvider( repository );
82 }
83 catch ( ScmRepositoryException e )
84 {
85 throw new ReleaseScmRepositoryException( e.getMessage(), e.getValidationMessages() );
86 }
87 catch ( NoSuchScmProviderException e )
88 {
89 throw new ReleaseExecutionException( "Unable to configure SCM repository: " + e.getMessage(), e );
90 }
91
92 if ( releaseDescriptor.isCommitByProject() )
93 {
94 for ( Iterator i = reactorProjects.iterator(); i.hasNext(); )
95 {
96 MavenProject project = (MavenProject) i.next();
97
98 List pomFiles = createPomFiles( releaseDescriptor, project );
99 ScmFileSet fileSet = new ScmFileSet( project.getFile().getParentFile(), pomFiles );
100
101 checkin( provider, repository, fileSet, releaseDescriptor );
102 }
103 }
104 else
105 {
106 List pomFiles = createPomFiles( releaseDescriptor, reactorProjects );
107 ScmFileSet fileSet = new ScmFileSet( new File( releaseDescriptor.getWorkingDirectory() ), pomFiles );
108
109 checkin( provider, repository, fileSet, releaseDescriptor );
110 }
111
112 relResult.setResultCode( ReleaseResult.SUCCESS );
113
114 return relResult;
115 }
116
117 private void checkin( ScmProvider provider, ScmRepository repository, ScmFileSet fileSet, ReleaseDescriptor releaseDescriptor )
118 throws ReleaseExecutionException, ReleaseScmCommandException
119 {
120 CheckInScmResult result;
121 String message = createMessage( releaseDescriptor );
122 try
123 {
124 result = provider.checkIn( repository, fileSet, (ScmVersion) null, message );
125 }
126 catch ( ScmException e )
127 {
128 throw new ReleaseExecutionException( "An error is occurred in the checkin process: " + e.getMessage(), e );
129 }
130
131 if ( !result.isSuccess() )
132 {
133 throw new ReleaseScmCommandException( "Unable to commit files", result );
134 }
135 if ( releaseDescriptor.isRemoteTagging() )
136 {
137 releaseDescriptor.setScmReleasedPomRevision( result.getScmRevision() );
138 }
139 }
140
141 public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment, List reactorProjects )
142 throws ReleaseExecutionException, ReleaseFailureException
143 {
144 ReleaseResult result = new ReleaseResult();
145
146 validateConfiguration( releaseDescriptor );
147
148 Collection pomFiles = createPomFiles( releaseDescriptor, reactorProjects );
149 logInfo( result, "Full run would be checking in " + pomFiles.size() + " files with message: '" +
150 createMessage( releaseDescriptor ) + "'" );
151
152 result.setResultCode( ReleaseResult.SUCCESS );
153
154 return result;
155 }
156
157 private static void validateConfiguration( ReleaseDescriptor releaseDescriptor )
158 throws ReleaseFailureException
159 {
160 if ( releaseDescriptor.getScmReleaseLabel() == null )
161 {
162 throw new ReleaseFailureException( "A release label is required for committing" );
163 }
164 }
165
166 private String createMessage( ReleaseDescriptor releaseDescriptor )
167 {
168 return MessageFormat.format( releaseDescriptor.getScmCommentPrefix() + messageFormat,
169 new Object[]{releaseDescriptor.getScmReleaseLabel()} );
170 }
171
172 private static List createPomFiles( ReleaseDescriptor releaseDescriptor, MavenProject project )
173 {
174 List pomFiles = new ArrayList();
175
176 pomFiles.add( ReleaseUtil.getStandardPom( project ) );
177
178 if ( releaseDescriptor.isGenerateReleasePoms() )
179 {
180 pomFiles.add( ReleaseUtil.getReleasePom( project ) );
181 }
182
183 return pomFiles;
184 }
185
186 private static List createPomFiles( ReleaseDescriptor releaseDescriptor, List reactorProjects )
187 {
188 List pomFiles = new ArrayList();
189 for ( Iterator i = reactorProjects.iterator(); i.hasNext(); )
190 {
191 MavenProject project = (MavenProject) i.next();
192 pomFiles.addAll( createPomFiles( releaseDescriptor, project ) );
193 }
194 return pomFiles;
195 }
196 }