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