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