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, releaseEnvironment.getSettings() );
82
83 return scmRepositoryConfigurator.getRepositoryProvider( repository );
84 }
85 catch ( ScmRepositoryException e )
86 {
87 throw new ReleaseScmRepositoryException(
88 e.getMessage() + " for URL: " + releaseDescriptor.getScmSourceUrl(), e.getValidationMessages() );
89 }
90 catch ( NoSuchScmProviderException e )
91 {
92 throw new ReleaseExecutionException( "Unable to configure SCM repository: " + e.getMessage(), e );
93 }
94 }
95
96 public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
97 List<MavenProject> reactorProjects )
98 throws ReleaseExecutionException
99 {
100 ReleaseResult result = new ReleaseResult();
101
102
103 MavenProject project = ReleaseUtil.getRootProject( reactorProjects );
104
105 String tag = releaseDescriptor.getScmReleaseLabel();
106
107 if ( tag == null )
108 {
109
110 String key = ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() );
111 String releaseVersion = (String) releaseDescriptor.getReleaseVersions().get( key );
112 if ( releaseVersion == null )
113 {
114 throw new ReleaseExecutionException( "Project tag cannot be selected if version is not yet mapped" );
115 }
116
117 String defaultTag;
118 String scmTagNameFormat = releaseDescriptor.getScmTagNameFormat();
119 if ( scmTagNameFormat != null )
120 {
121 Interpolator interpolator = new StringSearchInterpolator( "@{", "}" );
122 List<String> possiblePrefixes = java.util.Arrays.asList( "project", "pom" );
123 Properties values = new Properties();
124 values.setProperty( "artifactId", project.getArtifactId() );
125 values.setProperty( "groupId", project.getGroupId() );
126 values.setProperty( "version", releaseVersion );
127 interpolator.addValueSource( new PrefixedPropertiesValueSource( possiblePrefixes, values, true ) );
128 RecursionInterceptor recursionInterceptor = new PrefixAwareRecursionInterceptor( possiblePrefixes );
129 try
130 {
131 defaultTag = interpolator.interpolate( scmTagNameFormat, recursionInterceptor );
132 }
133 catch ( InterpolationException e )
134 {
135 throw new ReleaseExecutionException(
136 "Could not interpolate specified tag name format: " + scmTagNameFormat, e );
137 }
138 }
139 else
140 {
141 defaultTag = project.getArtifactId() + "-" + releaseVersion;
142 }
143
144 ScmProvider provider = null;
145 try
146 {
147 provider = getScmProvider( releaseDescriptor, releaseEnvironment );
148 }
149 catch ( ReleaseScmRepositoryException e )
150 {
151 throw new ReleaseExecutionException(
152 "No scm provider can be found for url: " + releaseDescriptor.getScmSourceUrl(), e );
153 }
154
155 defaultTag = provider.sanitizeTagName( defaultTag );
156
157 if ( releaseDescriptor.isInteractive() )
158 {
159 try
160 {
161 tag =
162 prompter.prompt( "What is SCM release tag or label for \"" + project.getName() + "\"? ("
163 + project.getGroupId() + ":" + project.getArtifactId() + ")", defaultTag );
164 }
165 catch ( PrompterException e )
166 {
167 throw new ReleaseExecutionException( "Error reading version from input handler: " + e.getMessage(),
168 e );
169 }
170 }
171 else
172 {
173 tag = defaultTag;
174 }
175 releaseDescriptor.setScmReleaseLabel( tag );
176 }
177
178 result.setResultCode( ReleaseResult.SUCCESS );
179
180 return result;
181 }
182
183 public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
184 List<MavenProject> reactorProjects )
185 throws ReleaseExecutionException
186 {
187 ReleaseResult result = new ReleaseResult();
188
189
190 execute( releaseDescriptor, releaseEnvironment, reactorProjects );
191
192 result.setResultCode( ReleaseResult.SUCCESS );
193
194 return result;
195 }
196
197 }