001package 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
022import java.io.File;
023import java.util.ArrayList;
024import java.util.List;
025
026import org.apache.maven.scm.CommandParameters;
027import org.apache.maven.scm.ScmException;
028import org.apache.maven.scm.ScmFile;
029import org.apache.maven.scm.ScmFileSet;
030import org.apache.maven.scm.ScmResult;
031import org.apache.maven.scm.ScmVersion;
032import org.apache.maven.scm.command.checkout.CheckOutScmResult;
033import org.apache.maven.scm.log.ScmLogger;
034import org.apache.maven.scm.provider.ScmProviderRepository;
035import org.apache.maven.scm.provider.accurev.AccuRev;
036import org.apache.maven.scm.provider.accurev.AccuRevException;
037import org.apache.maven.scm.provider.accurev.AccuRevInfo;
038import org.apache.maven.scm.provider.accurev.AccuRevScmProviderRepository;
039import org.apache.maven.scm.provider.accurev.AccuRevVersion;
040import org.apache.maven.scm.provider.accurev.command.AbstractAccuRevExtractSourceCommand;
041
042/**
043 * 
044 */
045public class AccuRevCheckOutCommand
046    extends AbstractAccuRevExtractSourceCommand
047{
048
049    public AccuRevCheckOutCommand( ScmLogger logger )
050    {
051        super( logger );
052    }
053
054    public CheckOutScmResult checkout( ScmProviderRepository repository, ScmFileSet fileSet,
055                                       CommandParameters parameters )
056        throws ScmException
057    {
058        return (CheckOutScmResult) execute( repository, fileSet, parameters );
059    }
060
061    @Override
062    protected List<File> extractSource( AccuRevScmProviderRepository repository, File basedir, AccuRevVersion version )
063        throws AccuRevException
064    {
065        AccuRev accuRev = repository.getAccuRev();
066
067        AccuRevInfo info = accuRev.info( basedir );
068
069        List<File> extractedFiles = new ArrayList<File>();
070        
071        String basisStream = version.getBasisStream();
072        String transactionId = version.getTimeSpec();
073
074        boolean success = true;
075        if ( info.isWorkSpace() )
076        {
077
078            if ( !repository.isWorkSpaceTop( info ) )
079            {
080                throw new AccuRevException( String.format( "Can't checkout to %s, "
081                    + "a subdirectory of existing workspace %s", 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,
147                                      ScmVersion version )
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}