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