001 package org.apache.maven.scm.client.cli;
002
003 /*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements. See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership. The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License. You may obtain a copy of the License at
011 *
012 * http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied. See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022 import java.io.File;
023 import java.util.List;
024
025 import org.apache.maven.scm.ScmBranch;
026 import org.apache.maven.scm.ScmException;
027 import org.apache.maven.scm.ScmFile;
028 import org.apache.maven.scm.ScmFileSet;
029 import org.apache.maven.scm.ScmResult;
030 import org.apache.maven.scm.ScmRevision;
031 import org.apache.maven.scm.ScmTag;
032 import org.apache.maven.scm.ScmVersion;
033 import org.apache.maven.scm.command.checkin.CheckInScmResult;
034 import org.apache.maven.scm.command.checkout.CheckOutScmResult;
035 import org.apache.maven.scm.command.update.UpdateScmResult;
036 import org.apache.maven.scm.manager.NoSuchScmProviderException;
037 import org.apache.maven.scm.manager.ScmManager;
038 import org.apache.maven.scm.repository.ScmRepository;
039 import org.apache.maven.scm.repository.ScmRepositoryException;
040 import org.codehaus.plexus.embed.Embedder;
041 import org.codehaus.plexus.util.StringUtils;
042
043 /**
044 * @author <a href="mailto:trygvis@inamo.no">Trygve Laugstøl</a>
045 * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
046 *
047 */
048 public class MavenScmCli
049 {
050 private Embedder plexus;
051
052 private ScmManager scmManager;
053
054 // ----------------------------------------------------------------------
055 // Lifecycle
056 // ----------------------------------------------------------------------
057
058 public MavenScmCli()
059 throws Exception
060 {
061 plexus = new Embedder();
062
063 plexus.start();
064
065 scmManager = (ScmManager) plexus.lookup( ScmManager.ROLE );
066 }
067
068 public void stop()
069 {
070 try
071 {
072 plexus.stop();
073 }
074 catch ( Exception ex )
075 {
076 // ignore
077 }
078 }
079
080 // ----------------------------------------------------------------------
081 //
082 // ----------------------------------------------------------------------
083
084 public static void main( String[] args )
085 {
086 MavenScmCli cli;
087
088 try
089 {
090 cli = new MavenScmCli();
091 }
092 catch ( Exception ex )
093 {
094 System.err.println( "Error while starting Maven Scm." );
095
096 ex.printStackTrace( System.err );
097
098 return;
099 }
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 // SCM-641
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 }