View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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   * @author Edwin Punzalan
52   */
53  @Singleton
54  @Named("restore-backup-poms")
55  public class RestoreBackupPomsPhase extends AbstractBackupPomsPhase {
56      /**
57       * Tool that gets a configured SCM repository from release configuration.
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 }