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