package org.eclipse.jgit.diff;
+import java.text.MessageFormat;
+
+import org.eclipse.jgit.JGitText;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.Config.SectionParser;
+import org.eclipse.jgit.util.StringUtils;
/** Keeps track of diff related configuration options. */
public class DiffConfig {
}
};
+ /** Permissible values for {@code diff.renames}. */
+ public static enum RenameDetectionType {
+ /** Rename detection is disabled. */
+ FALSE,
+
+ /** Rename detection is enabled. */
+ TRUE,
+
+ /** Copies should be detected too. */
+ COPY
+ }
+
private final boolean noPrefix;
- private final boolean renames;
+ private final RenameDetectionType renameDetectionType;
private final int renameLimit;
private DiffConfig(final Config rc) {
noPrefix = rc.getBoolean("diff", "noprefix", false);
- renames = rc.getBoolean("diff", "renames", false);
+ renameDetectionType = parseRenameDetectionType(rc.getString("diff",
+ null, "renames"));
renameLimit = rc.getInt("diff", "renamelimit", 200);
}
/** @return true if rename detection is enabled by default. */
public boolean isRenameDetectionEnabled() {
- return renames;
+ return renameDetectionType != RenameDetectionType.FALSE;
+ }
+
+ /** @return type of rename detection to perform. */
+ public RenameDetectionType getRenameDetectionType() {
+ return renameDetectionType;
}
/** @return limit on number of paths to perform inexact rename detection. */
public int getRenameLimit() {
return renameLimit;
}
+
+ private static RenameDetectionType parseRenameDetectionType(
+ final String renameString) {
+ if (renameString == null)
+ return RenameDetectionType.FALSE;
+ else if (StringUtils.equalsIgnoreCase("copy", renameString)
+ || StringUtils.equalsIgnoreCase("copies", renameString))
+ return RenameDetectionType.COPY;
+ else {
+ final Boolean renameBoolean = StringUtils
+ .toBooleanOrNull(renameString);
+ if (renameBoolean == null)
+ throw new IllegalArgumentException(MessageFormat.format(
+ JGitText.get().enumValueNotSupported2, "diff",
+ "renames", renameString));
+ else if (renameBoolean.booleanValue())
+ return RenameDetectionType.TRUE;
+ else
+ return RenameDetectionType.FALSE;
+ }
+ }
}
return true;
}
+ /**
+ * Parse a string as a standard Git boolean value. See
+ * {@link #toBooleanOrNull(String)}.
+ *
+ * @param stringValue
+ * the string to parse.
+ * @return the boolean interpretation of {@code value}.
+ * @throws IllegalArgumentException
+ * if {@code value} is not recognized as one of the standard
+ * boolean names.
+ */
+ public static boolean toBoolean(final String stringValue) {
+ if (stringValue == null)
+ throw new NullPointerException(JGitText.get().expectedBooleanStringValue);
+
+ final Boolean bool = toBooleanOrNull(stringValue);
+ if (bool == null)
+ throw new IllegalArgumentException(MessageFormat.format(JGitText.get().notABoolean, stringValue));
+
+ return bool.booleanValue();
+ }
+
/**
* Parse a string as a standard Git boolean value.
* <p>
*
* @param stringValue
* the string to parse.
- * @return the boolean interpretation of {@code value}.
- * @throws IllegalArgumentException
- * if {@code value} is not recognized as one of the standard
- * boolean names.
+ * @return the boolean interpretation of {@code value} or null in case the
+ * string does not represent a boolean value
*/
- public static boolean toBoolean(final String stringValue) {
+ public static Boolean toBooleanOrNull(final String stringValue) {
if (stringValue == null)
- throw new NullPointerException(JGitText.get().expectedBooleanStringValue);
+ return null;
if (equalsIgnoreCase("yes", stringValue)
|| equalsIgnoreCase("true", stringValue)
|| equalsIgnoreCase("1", stringValue)
- || equalsIgnoreCase("on", stringValue)) {
- return true;
-
- } else if (equalsIgnoreCase("no", stringValue)
+ || equalsIgnoreCase("on", stringValue))
+ return Boolean.TRUE;
+ else if (equalsIgnoreCase("no", stringValue)
|| equalsIgnoreCase("false", stringValue)
|| equalsIgnoreCase("0", stringValue)
- || equalsIgnoreCase("off", stringValue)) {
- return false;
-
- } else {
- throw new IllegalArgumentException(MessageFormat.format(JGitText.get().notABoolean, stringValue));
- }
+ || equalsIgnoreCase("off", stringValue))
+ return Boolean.FALSE;
+ else
+ return null;
}
/**