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.artifact.ArtifactUtils;
23 import org.apache.maven.project.MavenProject;
24 import org.apache.maven.scm.manager.NoSuchScmProviderException;
25 import org.apache.maven.scm.provider.ScmProvider;
26 import org.apache.maven.scm.repository.ScmRepository;
27 import org.apache.maven.scm.repository.ScmRepositoryException;
28 import org.apache.maven.shared.release.ReleaseExecutionException;
29 import org.apache.maven.shared.release.ReleaseResult;
30 import org.apache.maven.shared.release.config.ReleaseDescriptor;
31 import org.apache.maven.shared.release.env.ReleaseEnvironment;
32 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
33 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
34 import org.apache.maven.shared.release.util.ReleaseUtil;
35 import org.codehaus.plexus.components.interactivity.Prompter;
36 import org.codehaus.plexus.components.interactivity.PrompterException;
37 import org.codehaus.plexus.interpolation.InterpolationException;
38 import org.codehaus.plexus.interpolation.Interpolator;
39 import org.codehaus.plexus.interpolation.PrefixAwareRecursionInterceptor;
40 import org.codehaus.plexus.interpolation.PrefixedPropertiesValueSource;
41 import org.codehaus.plexus.interpolation.RecursionInterceptor;
42 import org.codehaus.plexus.interpolation.StringSearchInterpolator;
43
44 import java.util.List;
45 import java.util.Properties;
46
47
48
49
50
51
52
53 public class InputVariablesPhase
54 extends AbstractReleasePhase
55 {
56
57
58
59
60
61 private Prompter prompter;
62
63
64
65
66
67
68 private ScmRepositoryConfigurator scmRepositoryConfigurator;
69
70 void setPrompter( Prompter prompter )
71 {
72 this.prompter = prompter;
73 }
74
75 protected ScmProvider getScmProvider( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment )
76 throws ReleaseScmRepositoryException, ReleaseExecutionException
77 {
78 try
79 {
80 ScmRepository repository =
81 scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor,
82 releaseEnvironment.getSettings() );
83
84 return scmRepositoryConfigurator.getRepositoryProvider( repository );
85 }
86 catch ( ScmRepositoryException e )
87 {
88 throw new ReleaseScmRepositoryException(
89 e.getMessage() + " for URL: " + releaseDescriptor.getScmSourceUrl(), e.getValidationMessages() );
90 }
91 catch ( NoSuchScmProviderException e )
92 {
93 throw new ReleaseExecutionException( "Unable to configure SCM repository: " + e.getMessage(), e );
94 }
95 }
96
97 public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
98 List<MavenProject> reactorProjects )
99 throws ReleaseExecutionException
100 {
101 ReleaseResult result = new ReleaseResult();
102
103
104 MavenProject project = ReleaseUtil.getRootProject( reactorProjects );
105
106 String tag = releaseDescriptor.getScmReleaseLabel();
107
108 if ( tag == null )
109 {
110
111 String key = ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() );
112 String releaseVersion = (String) releaseDescriptor.getReleaseVersions().get( key );
113 if ( releaseVersion == null )
114 {
115 throw new ReleaseExecutionException( "Project tag cannot be selected if version is not yet mapped" );
116 }
117
118 String defaultTag;
119 String scmTagNameFormat = releaseDescriptor.getScmTagNameFormat();
120 if ( scmTagNameFormat != null )
121 {
122 Interpolator interpolator = new StringSearchInterpolator( "@{", "}" );
123 List<String> possiblePrefixes = java.util.Arrays.asList( "project", "pom" );
124 Properties values = new Properties();
125 values.setProperty( "artifactId", project.getArtifactId() );
126 values.setProperty( "groupId", project.getGroupId() );
127 values.setProperty( "version", releaseVersion );
128 interpolator.addValueSource( new PrefixedPropertiesValueSource( possiblePrefixes, values, true ) );
129 RecursionInterceptor recursionInterceptor = new PrefixAwareRecursionInterceptor( possiblePrefixes );
130 try
131 {
132 defaultTag = interpolator.interpolate( scmTagNameFormat, recursionInterceptor );
133 }
134 catch ( InterpolationException e )
135 {
136 throw new ReleaseExecutionException(
137 "Could not interpolate specified tag name format: " + scmTagNameFormat, e );
138 }
139 }
140 else
141 {
142 defaultTag = project.getArtifactId() + "-" + releaseVersion;
143 }
144
145 ScmProvider provider = null;
146 try
147 {
148 provider = getScmProvider( releaseDescriptor, releaseEnvironment );
149 }
150 catch ( ReleaseScmRepositoryException e )
151 {
152 throw new ReleaseExecutionException(
153 "No scm provider can be found for url: " + releaseDescriptor.getScmSourceUrl(), e );
154 }
155
156 defaultTag = provider.sanitizeTagName( defaultTag );
157
158 if ( releaseDescriptor.isInteractive() )
159 {
160 try
161 {
162 tag =
163 prompter.prompt( "What is SCM release tag or label for \"" + project.getName() + "\"? ("
164 + project.getGroupId() + ":" + project.getArtifactId() + ")", defaultTag );
165 }
166 catch ( PrompterException e )
167 {
168 throw new ReleaseExecutionException( "Error reading version from input handler: " + e.getMessage(),
169 e );
170 }
171 }
172 else
173 {
174 tag = defaultTag;
175 }
176 releaseDescriptor.setScmReleaseLabel( tag );
177 }
178
179 result.setResultCode( ReleaseResult.SUCCESS );
180
181 return result;
182 }
183
184 public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
185 List<MavenProject> reactorProjects )
186 throws ReleaseExecutionException
187 {
188 ReleaseResult result = new ReleaseResult();
189
190
191 execute( releaseDescriptor, releaseEnvironment, reactorProjects );
192
193 result.setResultCode( ReleaseResult.SUCCESS );
194
195 return result;
196 }
197
198 }