001 package org.apache.maven.scm.provider.accurev.command.status;
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.ScmFileStatus;
031 import org.apache.maven.scm.ScmResult;
032 import org.apache.maven.scm.command.status.StatusScmResult;
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.AccuRevCapability;
037 import org.apache.maven.scm.provider.accurev.AccuRevException;
038 import org.apache.maven.scm.provider.accurev.AccuRevScmProviderRepository;
039 import org.apache.maven.scm.provider.accurev.AccuRevStat;
040 import org.apache.maven.scm.provider.accurev.CategorisedElements;
041 import org.apache.maven.scm.provider.accurev.command.AbstractAccuRevCommand;
042
043 public class AccuRevStatusCommand
044 extends AbstractAccuRevCommand
045 {
046
047 public AccuRevStatusCommand( ScmLogger logger )
048 {
049 super( logger );
050 }
051
052 @Override
053 protected ScmResult executeAccurevCommand( AccuRevScmProviderRepository repository, ScmFileSet fileSet,
054 CommandParameters parameters )
055 throws ScmException, AccuRevException
056 {
057
058 AccuRev accuRev = repository.getAccuRev();
059
060 File basedir = fileSet.getBasedir();
061 List<File> elements = fileSet.getFileList();
062
063 List<File> defunctElements = accuRev.stat( basedir, elements, AccuRevStat.DEFUNCT );
064
065 if ( defunctElements == null )
066 {
067 return error( accuRev, "Failed retrieving defunct elements" );
068 }
069
070 List<File> keptElements = accuRev.stat( basedir, elements, AccuRevStat.KEPT );
071
072 // Defunct elements are also listed as kept (AccuRev 4.7.1), exclude those here.
073 if ( keptElements == null )
074 {
075 return error( accuRev, "Failed retrieving kept elements" );
076 }
077
078 List<File> modOrAddedElements = new ArrayList<File>();
079
080 for ( File file : keptElements )
081 {
082 if ( !defunctElements.contains( file ) )
083 {
084 modOrAddedElements.add( file );
085 }
086 }
087
088 List<File> modifiedElements = accuRev.stat( basedir, elements, AccuRevStat.MODIFIED );
089
090 if ( modifiedElements == null )
091 {
092 return error( accuRev, "Failed retrieving modified elements" );
093 }
094
095 modOrAddedElements.addAll( modifiedElements );
096
097 CategorisedElements catElems = accuRev.statBackingStream( basedir, modOrAddedElements );
098
099 if ( catElems == null )
100 {
101 return error( accuRev, "Failed stat backing stream to split modified and added elements" );
102 }
103
104 modifiedElements = catElems.getMemberElements();
105
106 List<File> addedElements;
107 if ( AccuRevCapability.STAT_ADDED_NOT_PROMOTED_BUG.isSupported( accuRev.getClientVersion() ) )
108 {
109 modOrAddedElements.removeAll( modifiedElements );
110 addedElements = modOrAddedElements;
111 }
112 else
113 {
114 addedElements = catElems.getNonMemberElements();
115 }
116
117 List<File> missingElements = accuRev.stat( basedir, elements, AccuRevStat.MISSING );
118
119 if ( missingElements == null )
120 {
121 return error( accuRev, "Failed retrieving missing elements" );
122 }
123
124 List<File> externalElements = accuRev.stat( basedir, elements, AccuRevStat.EXTERNAL );
125
126 if ( externalElements == null )
127 {
128 return error( accuRev, "Failed retrieving external elements" );
129 }
130
131 List<ScmFile> resultFiles = getScmFiles( defunctElements, ScmFileStatus.DELETED );
132 resultFiles.addAll( getScmFiles( modifiedElements, ScmFileStatus.MODIFIED ) );
133 resultFiles.addAll( getScmFiles( addedElements, ScmFileStatus.ADDED ) );
134 resultFiles.addAll( getScmFiles( missingElements, ScmFileStatus.MISSING ) );
135 resultFiles.addAll( getScmFiles( externalElements, ScmFileStatus.UNKNOWN ) );
136
137 return new StatusScmResult( accuRev.getCommandLines(), resultFiles );
138
139 }
140
141 private ScmResult error( AccuRev accuRev, String message )
142 {
143 return new StatusScmResult( accuRev.getCommandLines(), "AccuRev " + message, accuRev.getErrorOutput(), false );
144 }
145
146 public StatusScmResult status( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
147 throws ScmException
148 {
149 return (StatusScmResult) execute( repository, fileSet, parameters );
150 }
151
152 }