blob: 6a42a0fcf07eeadbd268b0c80886910b6af44edb [file] [log] [blame]
package org.jetbrains.idea.svn.copy;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vcs.VcsException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.svn.api.BaseSvnClient;
import org.jetbrains.idea.svn.api.ProgressTracker;
import org.jetbrains.idea.svn.checkin.CmdCheckinClient;
import org.jetbrains.idea.svn.checkin.CommitEventHandler;
import org.jetbrains.idea.svn.commandLine.BaseUpdateCommandListener;
import org.jetbrains.idea.svn.commandLine.CommandUtil;
import org.jetbrains.idea.svn.commandLine.SvnCommandName;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc2.SvnTarget;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* @author Konstantin Kolosovsky.
*/
public class CmdCopyMoveClient extends BaseSvnClient implements CopyMoveClient {
@Override
public void copy(@NotNull File src, @NotNull File dst, boolean makeParents, boolean isMove) throws VcsException {
List<String> parameters = new ArrayList<String>();
CommandUtil.put(parameters, src);
CommandUtil.put(parameters, dst, false);
CommandUtil.put(parameters, makeParents, "--parents");
// for now parsing of the output is not required as command is executed only for one file
// and will be either successful or exception will be thrown
// Use idea home directory for directory renames which differ only by character case on case insensitive file systems - otherwise that
// directory being renamed will be blocked by svn process
File workingDirectory =
isMove && !SystemInfo.isFileSystemCaseSensitive && FileUtil.filesEqual(src, dst) ? CommandUtil.getHomeDirectory() : null;
execute(myVcs, SvnTarget.fromFile(dst), workingDirectory, getCommandName(isMove), parameters, null);
}
@Override
public long copy(@NotNull SvnTarget source,
@NotNull SvnTarget destination,
@Nullable SVNRevision revision,
boolean makeParents,
boolean isMove,
@NotNull String message,
@Nullable CommitEventHandler handler) throws VcsException {
if (!destination.isURL()) {
throw new IllegalArgumentException("Only urls are supported as destination " + destination);
}
List<String> parameters = new ArrayList<String>();
CommandUtil.put(parameters, source);
CommandUtil.put(parameters, destination);
CommandUtil.put(parameters, revision);
CommandUtil.put(parameters, makeParents, "--parents");
parameters.add("--message");
parameters.add(message);
// copy to url output is the same as commit output - just statuses have "copy of" suffix
// so "Adding" will be "Adding copy of"
CmdCheckinClient.CommandListener listener = new CmdCheckinClient.CommandListener(handler);
if (source.isFile()) {
listener.setBaseDirectory(source.getFile());
}
execute(myVcs, source, getCommandName(isMove), parameters, listener);
return listener.getCommittedRevision();
}
@Override
public void copy(@NotNull SvnTarget source,
@NotNull File destination,
@Nullable SVNRevision revision,
boolean makeParents,
@Nullable ProgressTracker handler) throws VcsException {
List<String> parameters = new ArrayList<String>();
CommandUtil.put(parameters, source);
CommandUtil.put(parameters, destination);
CommandUtil.put(parameters, revision);
CommandUtil.put(parameters, makeParents, "--parents");
File workingDirectory = CommandUtil.getHomeDirectory();
BaseUpdateCommandListener listener = new BaseUpdateCommandListener(workingDirectory, handler);
execute(myVcs, source, workingDirectory, SvnCommandName.copy, parameters, listener);
listener.throwWrappedIfException();
}
@NotNull
private static SvnCommandName getCommandName(boolean isMove) {
return isMove ? SvnCommandName.move : SvnCommandName.copy;
}
}