| 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; |
| } |
| } |