blob: 50215fba76c847d228f06af5da0505d304951a9d [file] [log] [blame]
package org.jetbrains.idea.svn.commandLine;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.svn.api.ProgressTracker;
import org.tmatesoft.svn.core.SVNURL;
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.Arrays;
import java.util.List;
/**
* @author Konstantin Kolosovsky.
*/
// TODO: Probably make command immutable and use CommandBuilder for updates.
public class Command {
@NotNull private final List<String> myParameters = ContainerUtil.newArrayList();
@NotNull private final List<String> myOriginalParameters = ContainerUtil.newArrayList();
@NotNull private final SvnCommandName myName;
private File workingDirectory;
@Nullable private File myConfigDir;
@Nullable private LineCommandListener myResultBuilder;
@Nullable private volatile SVNURL myRepositoryUrl;
@NotNull private SvnTarget myTarget;
@Nullable private ProgressTracker myCanceller;
public Command(@NotNull SvnCommandName name) {
myName = name;
}
public void put(@NonNls @NotNull String... parameters) {
put(Arrays.asList(parameters));
}
public void put(@NotNull List<String> parameters) {
myParameters.addAll(parameters);
}
public void putIfNotPresent(@NotNull String parameter) {
if (!myParameters.contains(parameter)) {
myParameters.add(parameter);
}
}
@Nullable
public ProgressTracker getCanceller() {
return myCanceller;
}
public void setCanceller(@Nullable ProgressTracker canceller) {
myCanceller = canceller;
}
@Nullable
public File getConfigDir() {
return myConfigDir;
}
public File getWorkingDirectory() {
return workingDirectory;
}
@Nullable
public LineCommandListener getResultBuilder() {
return myResultBuilder;
}
@Nullable
public SVNURL getRepositoryUrl() {
return myRepositoryUrl;
}
@NotNull
public SvnTarget getTarget() {
return myTarget;
}
@NotNull
public SvnCommandName getName() {
return myName;
}
public void setWorkingDirectory(File workingDirectory) {
this.workingDirectory = workingDirectory;
}
public void setConfigDir(@Nullable File configDir) {
this.myConfigDir = configDir;
}
public void setResultBuilder(@Nullable LineCommandListener resultBuilder) {
myResultBuilder = resultBuilder;
}
public void setRepositoryUrl(@Nullable SVNURL repositoryUrl) {
myRepositoryUrl = repositoryUrl;
}
public void setTarget(@NotNull SvnTarget target) {
myTarget = target;
}
// TODO: used only to ensure authentication info is not logged to file. Remove when command execution model is refactored
// TODO: - so we could determine if parameter should be logged by the parameter itself.
public void saveOriginalParameters() {
myOriginalParameters.clear();
myOriginalParameters.addAll(myParameters);
}
@NotNull
public List<String> getParameters() {
return ContainerUtil.newArrayList(myParameters);
}
public String getText() {
List<String> data = new ArrayList<String>();
if (myConfigDir != null) {
data.add("--config-dir");
data.add(myConfigDir.getPath());
}
data.add(myName.getName());
data.addAll(myOriginalParameters);
return StringUtil.join(data, " ");
}
public boolean isLocalInfo() {
return is(SvnCommandName.info) && hasLocalTarget() && !myParameters.contains("--revision");
}
public boolean isLocalStatus() {
return is(SvnCommandName.st) && hasLocalTarget() && !myParameters.contains("-u");
}
public boolean isLocalProperty() {
boolean isPropertyCommand =
is(SvnCommandName.proplist) || is(SvnCommandName.propget) || is(SvnCommandName.propset) || is(SvnCommandName.propdel);
return isPropertyCommand && hasLocalTarget() && isLocal(getRevision());
}
public boolean isLocalCat() {
return is(SvnCommandName.cat) && hasLocalTarget() && isLocal(getRevision());
}
@Nullable
private SVNRevision getRevision() {
int index = myParameters.indexOf("--revision");
return index >= 0 && index + 1 < myParameters.size() ? SVNRevision.parse(myParameters.get(index + 1)) : null;
}
public boolean is(@NotNull SvnCommandName name) {
return name.equals(myName);
}
private boolean hasLocalTarget() {
return myTarget.isFile() && isLocal(myTarget.getPegRevision());
}
private static boolean isLocal(@Nullable SVNRevision revision) {
return revision == null ||
SVNRevision.UNDEFINED.equals(revision) ||
SVNRevision.BASE.equals(revision) ||
SVNRevision.WORKING.equals(revision);
}
}