1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.shared.release.phase;
20
21 import javax.inject.Inject;
22 import javax.inject.Named;
23 import javax.inject.Singleton;
24
25 import java.io.File;
26 import java.io.IOException;
27 import java.util.List;
28
29 import org.apache.maven.project.MavenProject;
30 import org.apache.maven.scm.ScmException;
31 import org.apache.maven.scm.ScmFileSet;
32 import org.apache.maven.scm.command.edit.EditScmResult;
33 import org.apache.maven.scm.manager.NoSuchScmProviderException;
34 import org.apache.maven.scm.provider.ScmProvider;
35 import org.apache.maven.scm.repository.ScmRepository;
36 import org.apache.maven.scm.repository.ScmRepositoryException;
37 import org.apache.maven.shared.release.ReleaseExecutionException;
38 import org.apache.maven.shared.release.ReleaseFailureException;
39 import org.apache.maven.shared.release.ReleaseResult;
40 import org.apache.maven.shared.release.config.ReleaseDescriptor;
41 import org.apache.maven.shared.release.env.ReleaseEnvironment;
42 import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
43 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
44 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
45 import org.apache.maven.shared.release.util.ReleaseUtil;
46 import org.codehaus.plexus.util.FileUtils;
47
48 import static java.util.Objects.requireNonNull;
49
50
51
52
53 @Singleton
54 @Named("restore-backup-poms")
55 public class RestoreBackupPomsPhase extends AbstractBackupPomsPhase {
56
57
58
59 private final ScmRepositoryConfigurator scmRepositoryConfigurator;
60
61 @Inject
62 public RestoreBackupPomsPhase(ScmRepositoryConfigurator scmRepositoryConfigurator) {
63 this.scmRepositoryConfigurator = requireNonNull(scmRepositoryConfigurator);
64 }
65
66 @Override
67 public ReleaseResult execute(
68 ReleaseDescriptor releaseDescriptor,
69 ReleaseEnvironment releaseEnvironment,
70 List<MavenProject> reactorProjects)
71 throws ReleaseExecutionException, ReleaseFailureException {
72 ReleaseResult result = new ReleaseResult();
73
74 for (MavenProject project : reactorProjects) {
75 restorePomBackup(releaseDescriptor, releaseEnvironment, project);
76 }
77
78 result.setResultCode(ReleaseResult.SUCCESS);
79
80 return result;
81 }
82
83 @Override
84 public ReleaseResult simulate(
85 ReleaseDescriptor releaseDescriptor,
86 ReleaseEnvironment releaseEnvironment,
87 List<MavenProject> reactorProjects)
88 throws ReleaseExecutionException, ReleaseFailureException {
89 return execute(releaseDescriptor, releaseEnvironment, reactorProjects);
90 }
91
92 protected void restorePomBackup(
93 ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment, MavenProject project)
94 throws ReleaseExecutionException, ReleaseFailureException {
95 File pomBackup = getPomBackup(project);
96
97 if (!pomBackup.exists()) {
98 throw new ReleaseExecutionException(
99 "Cannot restore from a missing backup POM: " + pomBackup.getAbsolutePath());
100 }
101
102 try {
103 ScmRepository scmRepository;
104 ScmProvider provider;
105 try {
106 scmRepository = scmRepositoryConfigurator.getConfiguredRepository(
107 releaseDescriptor, releaseEnvironment.getSettings());
108
109 provider = scmRepositoryConfigurator.getRepositoryProvider(scmRepository);
110 } catch (ScmRepositoryException e) {
111 throw new ReleaseScmRepositoryException(e.getMessage(), e.getValidationMessages());
112 } catch (NoSuchScmProviderException e) {
113 throw new ReleaseExecutionException("Unable to configure SCM repository: " + e.getMessage(), e);
114 }
115
116 if (releaseDescriptor.isScmUseEditMode() || provider.requiresEditMode()) {
117 EditScmResult result = provider.edit(
118 scmRepository,
119 new ScmFileSet(new File(releaseDescriptor.getWorkingDirectory()), project.getFile()));
120
121 if (!result.isSuccess()) {
122 throw new ReleaseScmCommandException("Unable to enable editing on the POM", result);
123 }
124 }
125 } catch (ScmException e) {
126 throw new ReleaseExecutionException("An error occurred enabling edit mode: " + e.getMessage(), e);
127 }
128
129 try {
130 FileUtils.copyFile(getPomBackup(project), ReleaseUtil.getStandardPom(project));
131 } catch (IOException e) {
132 throw new ReleaseExecutionException("Error restoring from backup POM: " + e.getMessage(), e);
133 }
134 }
135 }