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, releaseEnvironment.getSettings() );
81
82 repository.getProviderRepository().setPushChanges( releaseDescriptor.isPushChanges() );
83
84 provider = scmRepositoryConfigurator.getRepositoryProvider( repository );
85
86 }
87 catch ( ScmRepositoryException e )
88 {
89 throw new ReleaseScmRepositoryException( e.getMessage(), e.getValidationMessages() );
90 }
91 catch ( NoSuchScmProviderException e )
92 {
93 throw new ReleaseExecutionException( "Unable to configure SCM repository: " + e.getMessage(), e );
94 }
95
96 BranchScmResult result;
97 try
98 {
99 ScmFileSet fileSet = new ScmFileSet( new File( basedirAlignedReleaseDescriptor.getWorkingDirectory() ) );
100 String branchName = releaseDescriptor.getScmReleaseLabel();
101
102 ScmBranchParameters scmBranchParameters = new ScmBranchParameters();
103 scmBranchParameters.setMessage( releaseDescriptor.getScmCommentPrefix() + "copy for branch " + branchName );
104 scmBranchParameters.setRemoteBranching( releaseDescriptor.isRemoteTagging() );
105 scmBranchParameters.setScmRevision( releaseDescriptor.getScmReleasedPomRevision() );
106
107 result = provider.branch( repository, fileSet, branchName, scmBranchParameters );
108 }
109 catch ( ScmException e )
110 {
111 throw new ReleaseExecutionException( "An error is occurred in the branch process: " + e.getMessage(), e );
112 }
113
114 if ( !result.isSuccess() )
115 {
116 throw new ReleaseScmCommandException( "Unable to branch SCM", result );
117 }
118
119 relResult.setResultCode( ReleaseResult.SUCCESS );
120
121 return relResult;
122 }
123
124 public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
125 List<MavenProject> reactorProjects )
126 throws ReleaseExecutionException, ReleaseFailureException
127 {
128 ReleaseResult result = new ReleaseResult();
129
130 validateConfiguration( releaseDescriptor );
131 ReleaseDescriptor basedirAlignedReleaseDescriptor =
132 ReleaseUtil.createBasedirAlignedReleaseDescriptor( releaseDescriptor, reactorProjects );
133
134 logInfo( result, "Full run would be branching " + basedirAlignedReleaseDescriptor.getWorkingDirectory() );
135 if ( releaseDescriptor.getScmBranchBase() != null )
136 {
137 logInfo( result, " To SCM URL: " + releaseDescriptor.getScmBranchBase() );
138 }
139 logInfo( result, " with label: '" + releaseDescriptor.getScmReleaseLabel() + "'" );
140
141 result.setResultCode( ReleaseResult.SUCCESS );
142
143 return result;
144 }
145
146 private static void validateConfiguration( ReleaseDescriptor releaseDescriptor )
147 throws ReleaseFailureException
148 {
149 if ( releaseDescriptor.getScmReleaseLabel() == null )
150 {
151 throw new ReleaseFailureException( "A release label is required for committing" );
152 }
153 }
154 }