blob: eb2e6cf976cbc21575c931164bb7feade28902e2 [file] [log] [blame]
package org.jetbrains.idea.svn.commandLine;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.util.text.StringUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.svn.api.Depth;
import org.jetbrains.idea.svn.diff.DiffOptions;
import org.jetbrains.idea.svn.status.StatusType;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc2.SvnTarget;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.File;
import java.io.StringReader;
import java.util.List;
/**
* @author Konstantin Kolosovsky.
*/
public class CommandUtil {
/**
* Puts given value to parameters if condition is satisfied
*
* @param parameters
* @param condition
* @param value
*/
public static void put(@NotNull List<String> parameters, boolean condition, @NotNull String value) {
if (condition) {
parameters.add(value);
}
}
public static void put(@NotNull List<String> parameters, @NotNull File path) {
put(parameters, path.getAbsolutePath(), SVNRevision.UNDEFINED);
}
public static void put(@NotNull List<String> parameters, @NotNull File path, boolean usePegRevision) {
if (usePegRevision) {
put(parameters, path);
} else {
parameters.add(path.getAbsolutePath());
}
}
public static void put(@NotNull List<String> parameters, @NotNull File path, @Nullable SVNRevision pegRevision) {
put(parameters, path.getAbsolutePath(), pegRevision);
}
public static void put(@NotNull List<String> parameters, @NotNull String path, @Nullable SVNRevision pegRevision) {
StringBuilder builder = new StringBuilder(path);
boolean hasAtSymbol = path.contains("@");
boolean hasPegRevision = pegRevision != null &&
!SVNRevision.UNDEFINED.equals(pegRevision) &&
!SVNRevision.WORKING.equals(pegRevision) &&
pegRevision.isValid();
if (hasPegRevision || hasAtSymbol) {
// add '@' to correctly handle paths that contain '@' symbol
builder.append("@");
}
if (hasPegRevision) {
builder.append(pegRevision);
}
parameters.add(builder.toString());
}
public static void put(@NotNull List<String> parameters, @NotNull SvnTarget target) {
put(parameters, target.getPathOrUrlString(), target.getPegRevision());
}
public static void put(@NotNull List<String> parameters, @NotNull SvnTarget target, boolean usePegRevision) {
if (usePegRevision) {
put(parameters, target);
} else {
parameters.add(target.getPathOrUrlString());
}
}
public static void put(@NotNull List<String> parameters, @NotNull File... paths) {
for (File path : paths) {
put(parameters, path);
}
}
public static void put(@NotNull List<String> parameters, @Nullable Depth depth) {
put(parameters, depth, false);
}
public static void put(@NotNull List<String> parameters, @Nullable Depth depth, boolean sticky) {
if (depth != null && !Depth.UNKNOWN.equals(depth)) {
parameters.add("--depth");
parameters.add(depth.getName());
if (sticky) {
parameters.add("--set-depth");
parameters.add(depth.getName());
}
}
}
public static void put(@NotNull List<String> parameters, @Nullable SVNRevision revision) {
if (revision != null && !SVNRevision.UNDEFINED.equals(revision) && !SVNRevision.WORKING.equals(revision) && revision.isValid()) {
parameters.add("--revision");
parameters.add(revision.toString());
}
}
public static void put(@NotNull List<String> parameters, @Nullable DiffOptions diffOptions) {
if (diffOptions != null) {
StringBuilder builder = new StringBuilder();
if (diffOptions.isIgnoreAllWhitespace()) {
builder.append(" --ignore-space-change");
}
if (diffOptions.isIgnoreAmountOfWhitespace()) {
builder.append(" --ignore-all-space");
}
if (diffOptions.isIgnoreEOLStyle()) {
builder.append(" --ignore-eol-style");
}
String value = builder.toString().trim();
if (!StringUtil.isEmpty(value)) {
parameters.add("--extensions");
parameters.add(value);
}
}
}
public static void putChangeLists(@NotNull List<String> parameters, @Nullable Iterable<String> changeLists) {
if (changeLists != null) {
for (String changeList : changeLists) {
parameters.add("--cl");
parameters.add(changeList);
}
}
}
public static String escape(@NotNull String path) {
return path.contains("@") ? path + "@" : path;
}
public static <T> T parse(@NotNull String data, @NotNull Class<T> type) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(type);
Unmarshaller unmarshaller = context.createUnmarshaller();
return (T) unmarshaller.unmarshal(new StringReader(data.trim()));
}
@NotNull
public static File getHomeDirectory() {
return new File(PathManager.getHomePath());
}
/**
* Gets svn status represented by single character.
*
* @param type
* @return
*/
public static char getStatusChar(@Nullable String type) {
return !StringUtil.isEmpty(type) ? type.charAt(0) : ' ';
}
@NotNull
public static StatusType getStatusType(@Nullable String type) {
return getStatusType(getStatusChar(type));
}
@NotNull
public static StatusType getStatusType(char first) {
final StatusType contentsStatus;
if ('A' == first) {
contentsStatus = StatusType.STATUS_ADDED;
} else if ('D' == first) {
contentsStatus = StatusType.STATUS_DELETED;
} else if ('U' == first) {
contentsStatus = StatusType.CHANGED;
} else if ('C' == first) {
contentsStatus = StatusType.CONFLICTED;
} else if ('G' == first) {
contentsStatus = StatusType.MERGED;
} else if ('R' == first) {
contentsStatus = StatusType.STATUS_REPLACED;
} else if ('E' == first) {
contentsStatus = StatusType.STATUS_OBSTRUCTED;
} else {
contentsStatus = StatusType.STATUS_NORMAL;
}
return contentsStatus;
}
public static File correctUpToExistingParent(File base) {
while (base != null) {
if (base.exists() && base.isDirectory()) return base;
base = base.getParentFile();
}
return null;
}
}