001 package org.apache.maven.scm.provider.accurev.command.checkout;
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.ArrayList;
024 import java.util.List;
025
026 import org.apache.maven.scm.CommandParameters;
027 import org.apache.maven.scm.ScmException;
028 import org.apache.maven.scm.ScmFile;
029 import org.apache.maven.scm.ScmFileSet;
030 import org.apache.maven.scm.ScmResult;
031 import org.apache.maven.scm.ScmVersion;
032 import org.apache.maven.scm.command.checkout.CheckOutScmResult;
033 import org.apache.maven.scm.log.ScmLogger;
034 import org.apache.maven.scm.provider.ScmProviderRepository;
035 import org.apache.maven.scm.provider.accurev.AccuRev;
036 import org.apache.maven.scm.provider.accurev.AccuRevException;
037 import org.apache.maven.scm.provider.accurev.AccuRevInfo;
038 import org.apache.maven.scm.provider.accurev.AccuRevScmProviderRepository;
039 import org.apache.maven.scm.provider.accurev.AccuRevVersion;
040 import org.apache.maven.scm.provider.accurev.command.AbstractAccuRevExtractSourceCommand;
041
042 public class AccuRevCheckOutCommand
043 extends AbstractAccuRevExtractSourceCommand
044 {
045
046 public AccuRevCheckOutCommand( ScmLogger logger )
047 {
048 super( logger );
049 }
050
051 public CheckOutScmResult checkout( ScmProviderRepository repository, ScmFileSet fileSet,
052 CommandParameters parameters )
053 throws ScmException
054 {
055
056 return (CheckOutScmResult) execute( repository, fileSet, parameters );
057 }
058
059 @Override
060 protected List<File> extractSource( AccuRevScmProviderRepository repository, File basedir, AccuRevVersion version )
061 throws AccuRevException
062 {
063 AccuRev accuRev = repository.getAccuRev();
064
065 AccuRevInfo info = accuRev.info( basedir );
066
067 List<File> extractedFiles = new ArrayList<File>();
068
069 String basisStream = version.getBasisStream();
070 String transactionId = version.getTimeSpec();
071
072 boolean success = true;
073 if ( info.isWorkSpace() )
074 {
075
076 if ( !repository.isWorkSpaceTop( info ) )
077 {
078 throw new AccuRevException(
079 String.format(
080 "Can't checkout to %s, a subdirectory of existing workspace %s",
081 basedir, info.getWorkSpace() ) );
082 }
083 // workspace exists at this basedir already.
084 if ( !basisStream.equals( info.getBasis() ) )
085 {
086 // different basis, reparent.
087 success = accuRev.chws( basedir, info.getWorkSpace(), basisStream );
088 }
089
090 if ( success )
091 {
092 // repopulate everything in the workspace.
093 // note we do NOT want -t here, we just fill in any missing files
094 // to the current transaction watermark...
095 // the update later on will get the extra files
096 List<File> poppedFiles = accuRev.pop( basedir, null );
097 if ( poppedFiles != null )
098 {
099 extractedFiles.addAll( poppedFiles );
100 }
101 else
102 {
103 success = false;
104 }
105 }
106
107 }
108 else
109 {
110 // not a workspace, make one...
111 // TODO set incl rules to only include the projectPath
112 // TODO somehow set provider message (via throw exception?
113 // if basisStream is null
114 String workSpaceName = getWorkSpaceName( basedir, basisStream );
115
116 success = accuRev.mkws( basisStream, workSpaceName, basedir );
117
118 //Even though a new workspace starts with "0" as the high water mark
119 //it can't be updated to anything less than its own mkstream transaction
120 //now is close enough since even if something does sneak inbetween we
121 //were just lucky that it didn't happen before...
122 transactionId = "now";
123
124 if ( success )
125 {
126 getLogger().info( "Created workspace " + workSpaceName );
127 }
128 }
129
130 if ( success )
131 {
132 List<File> updatedFiles = accuRev.update( basedir, transactionId );
133 if ( updatedFiles != null )
134 {
135 extractedFiles.addAll( updatedFiles );
136 }
137 else
138 {
139 success = false;
140 }
141 }
142 return success ? extractedFiles : null;
143 }
144
145 @Override
146 protected ScmResult getScmResult( AccuRevScmProviderRepository repository, List<ScmFile> scmFiles , ScmVersion version)
147 {
148
149 AccuRev accuRev = repository.getAccuRev();
150 if ( scmFiles != null )
151 {
152 return new CheckOutScmResult( accuRev.getCommandLines(), scmFiles, repository.getProjectPath() );
153 }
154 else
155 {
156 return new CheckOutScmResult( accuRev.getCommandLines(), "AccuRev Error", accuRev.getErrorOutput(), false );
157 }
158 }
159
160 public static String getWorkSpaceName( File basedir, String basisStream )
161 {
162 String workSpaceName;
163 String baseName = basedir.getName();
164 if ( baseName.contains( basisStream ) )
165 {
166 workSpaceName = baseName;
167 }
168 else if ( basisStream.contains( baseName ) )
169 {
170 workSpaceName = basisStream;
171 }
172 else
173 {
174 workSpaceName = basisStream + "_" + baseName;
175 }
176 return workSpaceName;
177 }
178
179 }