src/com/intellij/vssSupport/commands/GetFileCommand.java (94 lines of code) (raw):
package com.intellij.vssSupport.commands;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vcs.VcsException;
import com.intellij.vssSupport.GetOptions;
import com.intellij.vssSupport.VssBundle;
import com.intellij.vssSupport.VssOutputCollector;
import com.intellij.vssSupport.VssUtil;
import org.jetbrains.annotations.NonNls;
import java.io.File;
import java.util.List;
public class GetFileCommand extends VssCommandAbstract
{
// Get file into the given location.
@NonNls private final static String OUTPUT_KEY = "-GL";
private String path;
private String outputPath;
private String version;
private boolean makeWritable = false;
private boolean isNonExistingFile = false;
/**
* Creates new {@code GetFilesCommand} instance.
* @param project project.
* @param filePath file path to be got
*/
public GetFileCommand( Project project, String filePath, List<VcsException> errors )
{
this( project, filePath, false, errors );
}
public GetFileCommand( Project project, String filePath, String version, List<VcsException> errors )
{
this( project, filePath, false, errors );
this.version = version;
}
public GetFileCommand( Project project, String filePath, boolean writable, List<VcsException> errors )
{
super( project, errors );
path = filePath;
version = null;
makeWritable = writable;
}
public boolean isFileNonExistent() { return isNonExistingFile; }
public void setOutputPath(final String outputPath) {
this.outputPath = outputPath;
}
/**
* Gets the files specified in the constructor.
*/
public void execute()
{
File file = new File( path.replace('/',File.separatorChar ));
String workingPath = file.getParentFile().getAbsolutePath();
GetOptions options = createOptions();
// Difference is in the working folder: it is a parent for the file and
// a folder itself for a particular folder.
if( file.isDirectory() )
{
workingPath = file.getAbsolutePath();
options.RECURSIVE = true;
}
List<String> opts = options.getOptions( file );
// Modify output parameters if we need to download file into other location.
if( outputPath != null )
opts.add( OUTPUT_KEY + outputPath.trim() );
runProcess( opts, workingPath, new GetListener( path, myErrors ) );
}
private GetOptions createOptions()
{
GetOptions options = myConfig.getGetOptions().getCopy();
options.REPLACE_WRITABLE = GetOptions.OPTION_REPLACE;
options.MAKE_WRITABLE = makeWritable;
options.ANSWER_POSITIVELY = true;
options.VERSION = version; // ok if version==null
return options;
}
private class GetListener extends VssOutputCollector
{
/**
* Index of file to be checked out.
*/
private final String path;
@NonNls private static final String NOT_EXISTING_MESSAGE = "is not an existing";
@NonNls private static final String DELETED_MESSAGE = "has been deleted";
public GetListener(String filePath, List<VcsException> errors)
{
super( errors );
path = filePath;
}
public void everythingFinishedImpl( final String output )
{
int exitCode = getExitCode();
if( output.indexOf(NOT_EXISTING_MESSAGE) != -1 )
{
isNonExistingFile = true;
myErrors.add(new VcsException( VssBundle.message("message.text.path.is.not.existing.filename.or.project", path ) ));
}
else if( output.indexOf(DELETED_MESSAGE) != -1 )
{
myErrors.add(new VcsException( VssBundle.message("message.text.cannot.get.deleted.file", path) ));
}
else
{
if( VssUtil.EXIT_CODE_SUCCESS == exitCode || VssUtil.EXIT_CODE_WARNING == exitCode )
VssUtil.showStatusMessage( myProject, VssBundle.message("message.text.file.successfully.received", path ));
else
myErrors.add(new VcsException( output ) );
}
}
}
}