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 if ( generateReleasePoms )
391 {
392 config.setLineSeparator( resolveLineSeparator() );
393 }
394
395 if ( checkModificationExcludeList != null )
396 {
397 checkModificationExcludes = checkModificationExcludeList.replaceAll( "\\s", "" ).split( "," );
398 }
399
400 if ( checkModificationExcludes != null )
401 {
402 config.setCheckModificationExcludes( Arrays.asList( checkModificationExcludes ) );
403 }
404
405 ReleasePrepareRequest prepareRequest = new ReleasePrepareRequest();
406 prepareRequest.setReleaseDescriptorBuilder( config );
407 prepareRequest.setReleaseEnvironment( getReleaseEnvironment() );
408 prepareRequest.setReactorProjects( getReactorProjects() );
409 prepareRequest.setReleaseManagerListener( new DefaultReleaseManagerListener( getLog(), dryRun ) );
410 prepareRequest.setResume( resume );
411 prepareRequest.setDryRun( dryRun );
412 prepareRequest.setUserProperties( session.getUserProperties() );
413
414 try
415 {
416 releaseManager.prepare( prepareRequest );
417 }
418 catch ( ReleaseExecutionException e )
419 {
420 throw new MojoExecutionException( e.getMessage(), e );
421 }
422 catch ( ReleaseFailureException e )
423 {
424 throw new MojoFailureException( e.getMessage(), e );
425 }
426 }
427
428 private String resolveLineSeparator() throws MojoExecutionException
429 {
430 if ( lineSeparator == null )
431 {
432 return getLineSeparatorFromPom();
433 }
434
435 switch ( lineSeparator )
436 {
437 case "lf":
438 return "\n";
439 case "cr":
440 return "\r";
441 case "crlf":
442 return "\r\n";
443 case "system":
444 return System.lineSeparator();
445 case "source":
446 return getLineSeparatorFromPom();
447 default:
448 throw new IllegalArgumentException( String.format( "Unknown property lineSeparator: '%s'. Use one of"
449 + " the following: 'source', 'system', 'lf', 'cr', 'crlf'.", lineSeparator ) );
450 }
451 }
452
453 private String getLineSeparatorFromPom()
454 throws MojoExecutionException
455 {
456 char current;
457 String lineSeparator = "";
458 try ( InputStream is = new FileInputStream( this.project.getFile() ) )
459 {
460 while ( is.available() > 0 )
461 {
462 current = ( char ) is.read();
463 if ( ( current == '\n' ) || ( current == '\r' ) )
464 {
465 lineSeparator += current;
466 if ( is.available() > 0 )
467 {
468 char next = ( char ) is.read();
469 if ( ( next != current )
470 && ( ( next == '\r' ) || ( next == '\n' ) ) )
471 {
472 lineSeparator += next;
473 }
474 }
475 return lineSeparator;
476 }
477 }
478 }
479 catch ( IOException e )
480 {
481 throw new MojoExecutionException( "Failed to detect line separator of " + this.project.getFile(), e );
482 }
483
484 return lineSeparator;
485 }
486
487 }