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 @Parameter(property = "preparationProfiles")
114 private String preparationProfiles;
115
116
117
118
119 @Parameter(defaultValue = "clean verify", property = "preparationGoals")
120 private String preparationGoals;
121
122
123
124
125
126
127
128 @Parameter(defaultValue = "", property = "completionGoals")
129 private String completionGoals;
130
131
132
133
134
135
136 @Parameter(defaultValue = "false", property = "commitByProject")
137 private boolean commitByProject;
138
139
140
141
142
143
144 @Parameter(defaultValue = "false", property = "ignoreSnapshots")
145 private boolean allowTimestampedSnapshots;
146
147
148
149
150
151
152
153 @Parameter(defaultValue = "false", property = "allowReleasePluginSnapshot", readonly = true)
154 private boolean allowReleasePluginSnapshot;
155
156
157
158
159
160
161
162 @Parameter
163 private String[] checkModificationExcludes;
164
165
166
167
168
169
170 @Parameter(property = "checkModificationExcludeList")
171 private String checkModificationExcludeList;
172
173
174
175
176
177
178 @Parameter(property = "releaseVersion")
179 private String releaseVersion;
180
181
182
183
184
185
186 @Parameter(property = "developmentVersion")
187 private String developmentVersion;
188
189
190
191
192
193
194
195
196
197
198
199
200 @Parameter(defaultValue = "true", property = "remoteTagging")
201 private boolean remoteTagging;
202
203
204
205
206
207
208 @Parameter(property = "signTag")
209 private boolean signTag = false;
210
211
212
213
214
215
216 @Parameter(defaultValue = "true", property = "updateWorkingCopyVersions")
217 private boolean updateWorkingCopyVersions;
218
219
220
221
222
223
224
225
226
227
228
229 @Parameter(defaultValue = "false", property = "suppressCommitBeforeTag")
230 private boolean suppressCommitBeforeTag;
231
232
233
234
235
236
237
238
239 @Parameter(defaultValue = "0", property = "waitBeforeTagging")
240 private int waitBeforeTagging;
241
242
243
244
245
246
247
248
249 @Parameter(defaultValue = "default", property = "projectVersionPolicyId")
250 private String projectVersionPolicyId;
251
252
253
254
255
256
257 @Parameter(property = "projectVersionPolicyConfig")
258 private PlexusConfiguration projectVersionPolicyConfig;
259
260
261
262
263
264
265
266
267 @Parameter(property = "projectNamingPolicyId")
268 private String projectTagNamingPolicyId;
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286 @Parameter(defaultValue = "@{prefix} prepare release @{releaseLabel}", property = "scmReleaseCommitComment")
287 private String scmReleaseCommitComment = "@{prefix} prepare release @{releaseLabel}";
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305 @Parameter(
306 defaultValue = "@{prefix} prepare for next development iteration",
307 property = "scmDevelopmentCommitComment")
308 private String scmDevelopmentCommitComment = "@{prefix} prepare for next development iteration";
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325 @Parameter(property = "autoResolveSnapshots")
326 private String autoResolveSnapshots;
327
328
329
330
331
332
333
334 @Parameter(defaultValue = "false", property = "pinExternals")
335 private boolean pinExternals;
336
337 @Inject
338 public PrepareReleaseMojo(ReleaseManager releaseManager, ScmManager scmManager) {
339 super(releaseManager, scmManager);
340 }
341
342
343
344
345 @Override
346 protected String getAdditionalProfiles() {
347 return preparationProfiles;
348 }
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363 @Parameter(defaultValue = "source", property = "lineSeparator")
364 private String lineSeparator;
365
366
367
368
369 @Override
370 public void execute() throws MojoExecutionException, MojoFailureException {
371 if (generateReleasePoms) {
372 throw new MojoFailureException("Generating release POMs is no longer supported in release:prepare. "
373 + "Please run release:prepare-with-pom instead.");
374 }
375
376 prepareRelease(generateReleasePoms);
377 }
378
379
380
381
382
383
384
385
386 protected void prepareRelease(boolean generateReleasePoms) throws MojoExecutionException, MojoFailureException {
387
388
389 super.execute();
390
391 final ReleaseDescriptorBuilder config = createReleaseDescriptor();
392 config.setAddSchema(addSchema);
393 config.setGenerateReleasePoms(generateReleasePoms);
394 config.setScmUseEditMode(useEditMode);
395 config.setPreparationGoals(preparationGoals);
396 config.setCompletionGoals(completionGoals);
397 config.setCommitByProject(commitByProject);
398 config.setUpdateDependencies(updateDependencies);
399 config.setAutoVersionSubmodules(autoVersionSubmodules);
400 config.setAllowTimestampedSnapshots(allowTimestampedSnapshots);
401 config.setSnapshotReleasePluginAllowed(allowReleasePluginSnapshot);
402 config.setDefaultReleaseVersion(releaseVersion);
403 config.setDefaultDevelopmentVersion(developmentVersion);
404 config.setRemoteTagging(remoteTagging);
405 config.setScmSignTags(signTag);
406 config.setUpdateWorkingCopyVersions(updateWorkingCopyVersions);
407 config.setSuppressCommitBeforeTagOrBranch(suppressCommitBeforeTag);
408 config.setWaitBeforeTagging(waitBeforeTagging);
409 config.setProjectVersionPolicyId(projectVersionPolicyId);
410 if (projectVersionPolicyConfig != null) {
411 config.setProjectVersionPolicyConfig(projectVersionPolicyConfig.toString());
412 }
413 config.setProjectNamingPolicyId(projectTagNamingPolicyId);
414 config.setScmDevelopmentCommitComment(scmDevelopmentCommitComment);
415 config.setScmReleaseCommitComment(scmReleaseCommitComment);
416 config.setAutoResolveSnapshots(autoResolveSnapshots);
417 config.setPinExternals(pinExternals);
418 config.setLineSeparator(resolveLineSeparator());
419
420 if (checkModificationExcludeList != null) {
421 checkModificationExcludes =
422 checkModificationExcludeList.replaceAll("\\s", "").split(",");
423 }
424
425 if (checkModificationExcludes != null) {
426 config.setCheckModificationExcludes(Arrays.asList(checkModificationExcludes));
427 }
428
429 ReleasePrepareRequest prepareRequest = new ReleasePrepareRequest();
430 prepareRequest.setReleaseDescriptorBuilder(config);
431 prepareRequest.setReleaseEnvironment(getReleaseEnvironment());
432 prepareRequest.setReactorProjects(getReactorProjects());
433 prepareRequest.setReleaseManagerListener(new DefaultReleaseManagerListener(getLog(), dryRun));
434 prepareRequest.setResume(resume);
435 prepareRequest.setDryRun(dryRun);
436 prepareRequest.setUserProperties(session.getUserProperties());
437
438 try {
439 releaseManager.prepare(prepareRequest);
440 } catch (ReleaseExecutionException e) {
441 throw new MojoExecutionException(e.getMessage(), e);
442 } catch (ReleaseFailureException e) {
443 throw new MojoFailureException(e.getMessage(), e);
444 }
445 }
446
447 private String resolveLineSeparator() throws MojoExecutionException {
448 if (lineSeparator == null) {
449 return getLineSeparatorFromPom();
450 }
451
452 switch (lineSeparator) {
453 case "lf":
454 return "\n";
455 case "cr":
456 return "\r";
457 case "crlf":
458 return "\r\n";
459 case "system":
460 return System.lineSeparator();
461 case "source":
462 return getLineSeparatorFromPom();
463 default:
464 throw new IllegalArgumentException(String.format(
465 "Unknown property lineSeparator: '%s'. Use one of"
466 + " the following: 'source', 'system', 'lf', 'cr', 'crlf'.",
467 lineSeparator));
468 }
469 }
470
471 private String getLineSeparatorFromPom() throws MojoExecutionException {
472 char current;
473 String lineSeparator = "";
474 try (InputStream is = new FileInputStream(this.project.getFile())) {
475 while (is.available() > 0) {
476 current = (char) is.read();
477 if ((current == '\n') || (current == '\r')) {
478 lineSeparator += current;
479 if (is.available() > 0) {
480 char next = (char) is.read();
481 if ((next != current) && ((next == '\r') || (next == '\n'))) {
482 lineSeparator += next;
483 }
484 }
485 return lineSeparator;
486 }
487 }
488 } catch (IOException e) {
489 throw new MojoExecutionException("Failed to detect line separator of " + this.project.getFile(), e);
490 }
491
492 return lineSeparator;
493 }
494 }