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.util.List;
28
29 import org.apache.maven.project.MavenProject;
30 import org.apache.maven.scm.ScmBranchParameters;
31 import org.apache.maven.scm.ScmException;
32 import org.apache.maven.scm.ScmFileSet;
33 import org.apache.maven.scm.command.branch.BranchScmResult;
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
48
49
50
51
52
53 @Singleton
54 @Named( "scm-branch" )
55 public class ScmBranchPhase
56 extends AbstractReleasePhase
57 {
58
59
60
61 private final ScmRepositoryConfigurator scmRepositoryConfigurator;
62
63 @Inject
64 public ScmBranchPhase( ScmRepositoryConfigurator scmRepositoryConfigurator )
65 {
66 this.scmRepositoryConfigurator = scmRepositoryConfigurator;
67 }
68
69 @Override
70 public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
71 List<MavenProject> reactorProjects )
72 throws ReleaseExecutionException, ReleaseFailureException
73 {
74 ReleaseResult relResult = new ReleaseResult();
75
76 validateConfiguration( releaseDescriptor );
77
78 logInfo( relResult, "Branching release with the label " + releaseDescriptor.getScmReleaseLabel() + "..." );
79
80 ReleaseDescriptor basedirAlignedReleaseDescriptor =
81 ReleaseUtil.createBasedirAlignedReleaseDescriptor( releaseDescriptor, reactorProjects );
82
83 ScmRepository repository;
84 ScmProvider provider;
85 try
86 {
87 repository =
88 scmRepositoryConfigurator.getConfiguredRepository(
89 basedirAlignedReleaseDescriptor.getScmSourceUrl(),
90 releaseDescriptor,
91 releaseEnvironment.getSettings() );
92
93 repository.getProviderRepository().setPushChanges( releaseDescriptor.isPushChanges() );
94
95 repository.getProviderRepository().setWorkItem( releaseDescriptor.getWorkItem() );
96
97 provider = scmRepositoryConfigurator.getRepositoryProvider( repository );
98
99 }
100 catch ( ScmRepositoryException e )
101 {
102 throw new ReleaseScmRepositoryException( e.getMessage(), e.getValidationMessages() );
103 }
104 catch ( NoSuchScmProviderException e )
105 {
106 throw new ReleaseExecutionException( "Unable to configure SCM repository: " + e.getMessage(), e );
107 }
108
109 BranchScmResult result;
110 try
111 {
112 ScmFileSet fileSet = new ScmFileSet( new File( basedirAlignedReleaseDescriptor.getWorkingDirectory() ) );
113 String branchName = releaseDescriptor.getScmReleaseLabel();
114
115 ScmBranchParameters scmBranchParameters = new ScmBranchParameters();
116 scmBranchParameters.setMessage( releaseDescriptor.getScmCommentPrefix() + "copy for branch " + branchName );
117 scmBranchParameters.setRemoteBranching( releaseDescriptor.isRemoteTagging() );
118 scmBranchParameters.setScmRevision( releaseDescriptor.getScmReleasedPomRevision() );
119 scmBranchParameters.setPinExternals( releaseDescriptor.isPinExternals() );
120
121 result = provider.branch( repository, fileSet, branchName, scmBranchParameters );
122 }
123 catch ( ScmException e )
124 {
125 throw new ReleaseExecutionException( "An error is occurred in the branch process: " + e.getMessage(), e );
126 }
127
128 if ( !result.isSuccess() )
129 {
130 throw new ReleaseScmCommandException( "Unable to branch SCM", result );
131 }
132
133 relResult.setResultCode( ReleaseResult.SUCCESS );
134
135 return relResult;
136 }
137
138 @Override
139 public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
140 List<MavenProject> reactorProjects )
141 throws ReleaseExecutionException, ReleaseFailureException
142 {
143 ReleaseResult result = new ReleaseResult();
144
145 validateConfiguration( releaseDescriptor );
146 ReleaseDescriptor basedirAlignedReleaseDescriptor =
147 ReleaseUtil.createBasedirAlignedReleaseDescriptor( releaseDescriptor, reactorProjects );
148
149 logInfo( result, "Full run would branch " + basedirAlignedReleaseDescriptor.getWorkingDirectory() );
150 if ( releaseDescriptor.getScmBranchBase() != null )
151 {
152 logInfo( result, " to SCM URL " + releaseDescriptor.getScmBranchBase() );
153 }
154 logInfo( result, " with label '" + releaseDescriptor.getScmReleaseLabel() + "'" );
155 if ( releaseDescriptor.isPinExternals() )
156 {
157 logInfo( result, " and pinned externals" );
158 }
159
160 result.setResultCode( ReleaseResult.SUCCESS );
161
162 return result;
163 }
164
165 private static void validateConfiguration( ReleaseDescriptor releaseDescriptor )
166 throws ReleaseFailureException
167 {
168 if ( releaseDescriptor.getScmReleaseLabel() == null )
169 {
170 throw new ReleaseFailureException( "A release label is required for committing" );
171 }
172 }
173 }