001package org.apache.maven.scm.provider.tfs.command; 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 022import org.apache.maven.scm.ScmException; 023import org.apache.maven.scm.ScmFileSet; 024import org.apache.maven.scm.ScmVersion; 025import org.apache.maven.scm.command.checkout.AbstractCheckOutCommand; 026import org.apache.maven.scm.command.checkout.CheckOutScmResult; 027import org.apache.maven.scm.provider.ScmProviderRepository; 028import org.apache.maven.scm.provider.tfs.TfsScmProviderRepository; 029import org.apache.maven.scm.provider.tfs.command.consumer.ErrorStreamConsumer; 030import org.apache.maven.scm.provider.tfs.command.consumer.FileListConsumer; 031 032// Usage: mvn scm:checkout -DcheckoutDirectory=<dir> 033public class TfsCheckOutCommand 034 extends AbstractCheckOutCommand 035{ 036 037 protected CheckOutScmResult executeCheckOutCommand( ScmProviderRepository r, ScmFileSet f, ScmVersion v, 038 boolean recursive ) 039 throws ScmException 040 { 041 TfsScmProviderRepository tfsRepo = (TfsScmProviderRepository) r; 042 String url = tfsRepo.getServerPath(); 043 String tfsUrl = tfsRepo.getTfsUrl(); 044 String workspace = tfsRepo.getWorkspace(); 045 046 // Try creating workspace 047 boolean workspaceProvided = workspace != null && !workspace.trim().equals( "" ); 048 if ( workspaceProvided ) 049 { 050 createWorkspace( r, f, workspace, tfsUrl ); 051 } 052 053 TfsCommand command; 054 int status; 055 056 if ( workspaceProvided ) 057 { 058 status = executeUnmapCommand( r, f ); 059 } 060 061 ErrorStreamConsumer out = new ErrorStreamConsumer(); 062 ErrorStreamConsumer err = new ErrorStreamConsumer(); 063 if ( workspaceProvided ) 064 { 065 command = new TfsCommand( "workfold", r, null, getLogger() ); 066 command.addArgument( "-workspace:" + workspace ); 067 command.addArgument( "-map" ); 068 command.addArgument( url ); 069 command.addArgument( f.getBasedir().getAbsolutePath() ); 070 status = command.execute( out, err ); 071 if ( status != 0 || err.hasBeenFed() ) 072 { 073 return new CheckOutScmResult( command.getCommandString(), 074 "Error code for TFS checkout (workfold map) command - " + status, 075 err.getOutput(), false ); 076 } 077 } 078 FileListConsumer fileConsumer = new FileListConsumer(); 079 err = new ErrorStreamConsumer(); 080 command = createGetCommand( r, f, v, recursive ); 081 status = command.execute( fileConsumer, err ); 082 if ( status != 0 || err.hasBeenFed() ) 083 { 084 return new CheckOutScmResult( command.getCommandString(), "Error code for TFS checkout (get) command - " 085 + status, err.getOutput(), false ); 086 } 087 088 return new CheckOutScmResult( command.getCommandString(), fileConsumer.getFiles() ); 089 } 090 091 public TfsCommand createGetCommand( ScmProviderRepository r, ScmFileSet f, ScmVersion v, boolean recursive ) 092 { 093 TfsCommand command = new TfsCommand( "get", r, f, getLogger() ); 094 if ( recursive ) 095 { 096 command.addArgument( "-recursive" ); 097 } 098 099 command.addArgument( "-force" ); 100 101 if ( v != null && !v.equals( "" ) ) 102 { 103 String vType = ""; 104 if ( v.getType().equals( "Tag" ) ) 105 { 106 vType = "L"; 107 } 108 if ( v.getType().equals( "Revision" ) ) 109 { 110 vType = "C"; 111 } 112 command.addArgument( "-version:" + vType + v.getName() ); 113 } 114 115 command.addArgument( f.getBasedir().getAbsolutePath() ); 116 117 return command; 118 } 119 120 public int executeUnmapCommand( ScmProviderRepository r, ScmFileSet f ) 121 throws ScmException 122 { 123 TfsScmProviderRepository tfsRepo = (TfsScmProviderRepository) r; 124 String url = tfsRepo.getServerPath(); 125 String workspace = tfsRepo.getWorkspace(); 126 ErrorStreamConsumer out = new ErrorStreamConsumer(); 127 ErrorStreamConsumer err = new ErrorStreamConsumer(); 128 129 TfsCommand command = new TfsCommand( "workfold", r, null, getLogger() ); 130 command.addArgument( "-workspace:" + workspace ); 131 command.addArgument( "-unmap" ); 132 command.addArgument( url ); 133 134 return command.execute( out, err ); 135 } 136 137 private void createWorkspace( ScmProviderRepository r, ScmFileSet f, String workspace, String url ) 138 throws ScmException 139 { 140 ErrorStreamConsumer out = new ErrorStreamConsumer(); 141 ErrorStreamConsumer err = new ErrorStreamConsumer(); 142 // Checkout dir may not exist yet 143 TfsCommand command = new TfsCommand( "workspace", r, null, getLogger() ); 144 command.addArgument( "-new" ); 145 command.addArgument( "-comment:Creating workspace for maven command" ); 146 command.addArgument( "-server:" + url ); 147 command.addArgument( workspace ); 148 149 command.execute( out, err ); 150 } 151 152}