1 package org.apache.maven.plugins.release;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.FileInputStream;
23 import java.io.IOException;
24 import java.io.InputStream;
25 import java.util.Arrays;
26
27 import org.apache.maven.plugin.MojoExecutionException;
28 import org.apache.maven.plugin.MojoFailureException;
29 import org.apache.maven.plugins.annotations.Mojo;
30 import org.apache.maven.plugins.annotations.Parameter;
31 import org.apache.maven.plugins.annotations.ResolutionScope;
32 import org.apache.maven.shared.release.DefaultReleaseManagerListener;
33 import org.apache.maven.shared.release.ReleaseExecutionException;
34 import org.apache.maven.shared.release.ReleaseFailureException;
35 import org.apache.maven.shared.release.ReleasePrepareRequest;
36 import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 @Mojo( name = "prepare", aggregator = true, requiresDependencyCollection = ResolutionScope.TEST )
52 public class PrepareReleaseMojo
53 extends AbstractScmReleaseMojo
54 {
55
56
57
58
59 @Parameter( defaultValue = "true", property = "resume" )
60 private boolean resume;
61
62
63
64
65 @Deprecated
66 @Parameter( defaultValue = "false", property = "generateReleasePoms" )
67 private boolean generateReleasePoms;
68
69
70
71
72 @Parameter( defaultValue = "false", property = "useEditMode" )
73 private boolean useEditMode;
74
75
76
77
78
79
80 @Parameter( defaultValue = "true", property = "updateDependencies" )
81 private boolean updateDependencies;
82
83
84
85
86
87
88
89 @Parameter( defaultValue = "false", property = "autoVersionSubmodules" )
90 private boolean autoVersionSubmodules;
91
92
93
94
95
96
97
98 @Parameter( defaultValue = "false", property = "dryRun" )
99 private boolean dryRun;
100
101
102
103
104 @Parameter( defaultValue = "true", property = "addSchema" )
105 private boolean addSchema;
106
107
108
109
110 @Parameter( defaultValue = "clean verify", property = "preparationGoals" )
111 private String preparationGoals;
112
113
114
115
116
117
118
119 @Parameter( defaultValue = "", property = "completionGoals" )
120 private String completionGoals;
121
122
123
124
125
126
127 @Parameter( defaultValue = "false", property = "commitByProject" )
128 private boolean commitByProject;
129
130
131
132
133
134
135 @Parameter( defaultValue = "false", property = "ignoreSnapshots" )
136 private boolean allowTimestampedSnapshots;
137
138
139
140
141
142
143
144 @Parameter( defaultValue = "false", property = "allowReleasePluginSnapshot", readonly = true )
145 private boolean allowReleasePluginSnapshot;
146
147
148
149
150
151
152
153 @Parameter
154 private String[] checkModificationExcludes;
155
156
157
158
159
160
161 @Parameter( property = "checkModificationExcludeList" )
162 private String checkModificationExcludeList;
163
164
165
166
167
168
169 @Parameter( property = "releaseVersion" )
170 private String releaseVersion;
171
172
173
174
175
176
177 @Parameter( property = "developmentVersion" )
178 private String developmentVersion;
179
180
181
182
183
184
185
186
187
188
189
190
191 @Parameter( defaultValue = "true", property = "remoteTagging" )
192 private boolean remoteTagging;
193
194
195
196
197
198
199 @Parameter( property = "signTag" )
200 private boolean signTag = false;
201
202
203
204
205
206
207 @Parameter( defaultValue = "true", property = "updateWorkingCopyVersions" )
208 private boolean updateWorkingCopyVersions;
209
210
211
212
213
214
215
216
217
218
219
220 @Parameter( defaultValue = "false", property = "suppressCommitBeforeTag" )
221 private boolean suppressCommitBeforeTag;
222
223
224
225
226
227
228
229
230 @Parameter( defaultValue = "0", property = "waitBeforeTagging" )
231 private int waitBeforeTagging;
232
233
234
235
236
237
238
239
240 @Parameter( defaultValue = "default", property = "projectVersionPolicyId" )
241 private String projectVersionPolicyId;
242
243
244
245
246
247
248
249
250 @Parameter( property = "projectNamingPolicyId" )
251 private String projectTagNamingPolicyId;
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269 @Parameter( defaultValue = "@{prefix} prepare release @{releaseLabel}", property = "scmReleaseCommitComment" )
270 private String scmReleaseCommitComment = "@{prefix} prepare release @{releaseLabel}";
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288 @Parameter(
289 defaultValue = "@{prefix} prepare for next development iteration",
290 property = "scmDevelopmentCommitComment" )
291 private String scmDevelopmentCommitComment = "@{prefix} prepare for next development iteration";
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308 @Parameter( property = "autoResolveSnapshots" )
309 private String autoResolveSnapshots;
310
311
312
313
314
315
316
317 @Parameter( defaultValue = "false", property = "pinExternals" )
318 private boolean pinExternals;
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333 @Parameter( defaultValue = "source", property = "lineSeparator" )
334 private String lineSeparator;
335
336
337
338
339 @Override
340 public void execute()
341 throws MojoExecutionException, MojoFailureException
342 {
343 if ( generateReleasePoms )
344 {
345 throw new MojoFailureException( "Generating release POMs is no longer supported in release:prepare. "
346 + "Please run release:prepare-with-pom instead." );
347 }
348
349 prepareRelease( generateReleasePoms );
350 }
351
352
353
354
355
356
357
358
359 protected void prepareRelease( boolean generateReleasePoms )
360 throws MojoExecutionException, MojoFailureException
361 {
362
363
364 super.execute();
365
366 final ReleaseDescriptorBuilder config = createReleaseDescriptor();
367 config.setAddSchema( addSchema );
368 config.setGenerateReleasePoms( generateReleasePoms );
369 config.setScmUseEditMode( useEditMode );
370 config.setPreparationGoals( preparationGoals );
371 config.setCompletionGoals( completionGoals );
372 config.setCommitByProject( commitByProject );
373 config.setUpdateDependencies( updateDependencies );
374 config.setAutoVersionSubmodules( autoVersionSubmodules );
375 config.setAllowTimestampedSnapshots( allowTimestampedSnapshots );
376 config.setSnapshotReleasePluginAllowed( allowReleasePluginSnapshot );
377 config.setDefaultReleaseVersion( releaseVersion );
378 config.setDefaultDevelopmentVersion( developmentVersion );
379 config.setRemoteTagging( remoteTagging );
380 config.setScmSignTags( signTag );
381 config.setUpdateWorkingCopyVersions( updateWorkingCopyVersions );
382 config.setSuppressCommitBeforeTagOrBranch( suppressCommitBeforeTag );
383 config.setWaitBeforeTagging( waitBeforeTagging );
384 config.setProjectVersionPolicyId( projectVersionPolicyId );
385 config.setProjectNamingPolicyId( projectTagNamingPolicyId );
386 config.setScmDevelopmentCommitComment( scmDevelopmentCommitComment );
387 config.setScmReleaseCommitComment( scmReleaseCommitComment );
388 config.setAutoResolveSnapshots( autoResolveSnapshots );
389 config.setPinExternals( pinExternals );
390 config.setLineSeparator( resolveLineSeparator() );
391
392 if ( checkModificationExcludeList != null )
393 {
394 checkModificationExcludes = checkModificationExcludeList.replaceAll( "\\s", "" ).split( "," );
395 }
396
397 if ( checkModificationExcludes != null )
398 {
399 config.setCheckModificationExcludes( Arrays.asList( checkModificationExcludes ) );
400 }
401
402 ReleasePrepareRequest prepareRequest = new ReleasePrepareRequest();
403 prepareRequest.setReleaseDescriptorBuilder( config );
404 prepareRequest.setReleaseEnvironment( getReleaseEnvironment() );
405 prepareRequest.setReactorProjects( getReactorProjects() );
406 prepareRequest.setReleaseManagerListener( new DefaultReleaseManagerListener( getLog(), dryRun ) );
407 prepareRequest.setResume( resume );
408 prepareRequest.setDryRun( dryRun );
409 prepareRequest.setUserProperties( session.getUserProperties() );
410
411 try
412 {
413 releaseManager.prepare( prepareRequest );
414 }
415 catch ( ReleaseExecutionException e )
416 {
417 throw new MojoExecutionException( e.getMessage(), e );
418 }
419 catch ( ReleaseFailureException e )
420 {
421 throw new MojoFailureException( e.getMessage(), e );
422 }
423 }
424
425 private String resolveLineSeparator() throws MojoExecutionException
426 {
427 if ( lineSeparator == null )
428 {
429 return getLineSeparatorFromPom();
430 }
431
432 switch ( lineSeparator )
433 {
434 case "lf":
435 return "\n";
436 case "cr":
437 return "\r";
438 case "crlf":
439 return "\r\n";
440 case "system":
441 return System.lineSeparator();
442 case "source":
443 return getLineSeparatorFromPom();
444 default:
445 throw new IllegalArgumentException( String.format( "Unknown property lineSeparator: '%s'. Use one of"
446 + " the following: 'source', 'system', 'lf', 'cr', 'crlf'.", lineSeparator ) );
447 }
448 }
449
450 private String getLineSeparatorFromPom()
451 throws MojoExecutionException
452 {
453 char current;
454 String lineSeparator = "";
455 try ( InputStream is = new FileInputStream( this.project.getFile() ) )
456 {
457 while ( is.available() > 0 )
458 {
459 current = ( char ) is.read();
460 if ( ( current == '\n' ) || ( current == '\r' ) )
461 {
462 lineSeparator += current;
463 if ( is.available() > 0 )
464 {
465 char next = ( char ) is.read();
466 if ( ( next != current )
467 && ( ( next == '\r' ) || ( next == '\n' ) ) )
468 {
469 lineSeparator += next;
470 }
471 }
472 return lineSeparator;
473 }
474 }
475 }
476 catch ( IOException e )
477 {
478 throw new MojoExecutionException( "Failed to detect line separator of " + this.project.getFile(), e );
479 }
480
481 return lineSeparator;
482 }
483
484 }