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