1 package org.apache.maven.scm.client.cli;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.File;
23 import java.util.List;
24
25 import org.apache.maven.scm.ScmBranch;
26 import org.apache.maven.scm.ScmException;
27 import org.apache.maven.scm.ScmFile;
28 import org.apache.maven.scm.ScmFileSet;
29 import org.apache.maven.scm.ScmResult;
30 import org.apache.maven.scm.ScmRevision;
31 import org.apache.maven.scm.ScmTag;
32 import org.apache.maven.scm.ScmVersion;
33 import org.apache.maven.scm.command.checkin.CheckInScmResult;
34 import org.apache.maven.scm.command.checkout.CheckOutScmResult;
35 import org.apache.maven.scm.command.update.UpdateScmResult;
36 import org.apache.maven.scm.manager.NoSuchScmProviderException;
37 import org.apache.maven.scm.manager.ScmManager;
38 import org.apache.maven.scm.repository.ScmRepository;
39 import org.apache.maven.scm.repository.ScmRepositoryException;
40 import org.codehaus.plexus.embed.Embedder;
41 import org.codehaus.plexus.util.StringUtils;
42
43
44
45
46
47
48 public class MavenScmCli
49 {
50 private Embedder plexus;
51
52 private ScmManager scmManager;
53
54
55
56
57
58 public MavenScmCli()
59 throws Exception
60 {
61 plexus = new Embedder();
62
63 plexus.start();
64
65 scmManager = (ScmManager) plexus.lookup( ScmManager.ROLE );
66 }
67
68 public void stop()
69 {
70 try
71 {
72 plexus.stop();
73 }
74 catch ( Exception ex )
75 {
76
77 }
78 }
79
80
81
82
83
84 public static void main( String[] args )
85 {
86 MavenScmCli cli;
87
88 try
89 {
90 cli = new MavenScmCli();
91 }
92 catch ( Exception ex )
93 {
94 System.err.println( "Error while starting Maven Scm." );
95
96 ex.printStackTrace( System.err );
97
98 return;
99 }
100
101 String scmUrl;
102
103 String command;
104
105 if ( args.length != 3 )
106 {
107 System.err.println(
108 "Usage: maven-scm-client <command> <working directory> <scm url> [<scmVersion> [<scmVersionType>]]" );
109 System.err.println( "scmVersion is a branch name/tag name/revision number." );
110 System.err.println( "scmVersionType can be 'branch', 'tag', 'revision'. "
111 + "The default value is 'revision'." );
112
113 return;
114 }
115
116 command = args[0];
117
118
119 File workingDirectory = new File( args[1] ).getAbsoluteFile();
120
121 scmUrl = args[2];
122
123 ScmVersion scmVersion = null;
124 if ( args.length > 3 )
125 {
126 String version = args[3];
127
128 if ( args.length > 4 )
129 {
130 String type = args[4];
131
132 if ( "tag".equals( type ) )
133 {
134 scmVersion = new ScmTag( version );
135 }
136 else if ( "branch".equals( type ) )
137 {
138 scmVersion = new ScmBranch( version );
139 }
140 else if ( "revision".equals( type ) )
141 {
142 scmVersion = new ScmRevision( version );
143 }
144 else
145 {
146 throw new IllegalArgumentException( "'" + type + "' version type isn't known." );
147 }
148 }
149 else
150 {
151 scmVersion = new ScmRevision( args[3] );
152 }
153 }
154
155 cli.execute( scmUrl, command, workingDirectory, scmVersion );
156
157 cli.stop();
158 }
159
160
161
162
163
164 public void execute( String scmUrl, String command, File workingDirectory, ScmVersion version )
165 {
166 ScmRepository repository;
167
168 try
169 {
170 repository = scmManager.makeScmRepository( scmUrl );
171 }
172 catch ( NoSuchScmProviderException ex )
173 {
174 System.err.println( "Could not find a provider." );
175
176 return;
177 }
178 catch ( ScmRepositoryException ex )
179 {
180 System.err.println( "Error while connecting to the repository" );
181
182 ex.printStackTrace( System.err );
183
184 return;
185 }
186
187 try
188 {
189 if ( command.equals( "checkout" ) )
190 {
191 checkOut( repository, workingDirectory, version );
192 }
193 else if ( command.equals( "checkin" ) )
194 {
195 checkIn( repository, workingDirectory, version );
196 }
197 else if ( command.equals( "update" ) )
198 {
199 update( repository, workingDirectory, version );
200 }
201 else
202 {
203 System.err.println( "Unknown SCM command '" + command + "'." );
204 }
205 }
206 catch ( ScmException ex )
207 {
208 System.err.println( "Error while executing the SCM command." );
209
210 ex.printStackTrace( System.err );
211
212 return;
213 }
214 }
215
216
217
218
219
220 private void checkOut( ScmRepository scmRepository, File workingDirectory, ScmVersion version )
221 throws ScmException
222 {
223 if ( workingDirectory.exists() )
224 {
225 System.err.println( "The working directory already exist: '" + workingDirectory.getAbsolutePath()
226 + "'." );
227
228 return;
229 }
230
231 if ( !workingDirectory.mkdirs() )
232 {
233 System.err.println(
234 "Error while making the working directory: '" + workingDirectory.getAbsolutePath() + "'." );
235
236 return;
237 }
238
239 CheckOutScmResult result = scmManager.checkOut( scmRepository, new ScmFileSet( workingDirectory ), version );
240
241 if ( !result.isSuccess() )
242 {
243 showError( result );
244
245 return;
246 }
247
248 List<ScmFile> checkedOutFiles = result.getCheckedOutFiles();
249
250 System.out.println( "Checked out these files: " );
251
252 for ( ScmFile file : checkedOutFiles )
253 {
254 System.out.println( " " + file.getPath() );
255 }
256 }
257
258 private void checkIn( ScmRepository scmRepository, File workingDirectory, ScmVersion version )
259 throws ScmException
260 {
261 if ( !workingDirectory.exists() )
262 {
263 System.err.println( "The working directory doesn't exist: '" + workingDirectory.getAbsolutePath()
264 + "'." );
265
266 return;
267 }
268
269 String message = "";
270
271 CheckInScmResult result =
272 scmManager.checkIn( scmRepository, new ScmFileSet( workingDirectory ), version, message );
273
274 if ( !result.isSuccess() )
275 {
276 showError( result );
277
278 return;
279 }
280
281 List<ScmFile> checkedInFiles = result.getCheckedInFiles();
282
283 System.out.println( "Checked in these files: " );
284
285 for ( ScmFile file : checkedInFiles )
286 {
287 System.out.println( " " + file.getPath() );
288 }
289 }
290
291 private void update( ScmRepository scmRepository, File workingDirectory, ScmVersion version )
292 throws ScmException
293 {
294 if ( !workingDirectory.exists() )
295 {
296 System.err.println( "The working directory doesn't exist: '" + workingDirectory.getAbsolutePath()
297 + "'." );
298
299 return;
300 }
301
302 UpdateScmResult result = scmManager.update( scmRepository, new ScmFileSet( workingDirectory ), version );
303
304 if ( !result.isSuccess() )
305 {
306 showError( result );
307
308 return;
309 }
310
311 List<ScmFile> updatedFiles = result.getUpdatedFiles();
312
313 System.out.println( "Updated these files: " );
314
315 for ( ScmFile file : updatedFiles )
316 {
317 System.out.println( " " + file.getPath() );
318 }
319 }
320
321
322
323
324
325 private void showError( ScmResult result )
326 {
327 System.err.println( "There was a error while executing the SCM command." );
328
329 String providerMessage = result.getProviderMessage();
330
331 if ( !StringUtils.isEmpty( providerMessage ) )
332 {
333 System.err.println( "Error message from the provider: " + providerMessage );
334 }
335 else
336 {
337 System.err.println( "The provider didn't give a error message." );
338 }
339
340 String output = result.getCommandOutput();
341
342 if ( !StringUtils.isEmpty( output ) )
343 {
344 System.err.println( "Command output:" );
345
346 System.err.println( output );
347 }
348 }
349 }