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