Merge "Make 'inCoreLimit' of LocalFile used in ResolveMerger configurable"

This commit is contained in:
Shawn Pearce 2017-07-22 18:45:56 -04:00 committed by Gerrit Code Review @ Eclipse.org
commit ad269ae426
2 changed files with 23 additions and 2 deletions

View File

@ -370,6 +370,13 @@ public class ConfigConstants {
*/ */
public static final String CONFIG_KEY_RENAMES = "renames"; public static final String CONFIG_KEY_RENAMES = "renames";
/**
* The "inCoreLimit" key in the "merge section". It's a size limit (bytes) used to
* control a file to be stored in {@code Heap} or {@code LocalFile} during the merge.
* @since 4.9
*/
public static final String CONFIG_KEY_IN_CORE_LIMIT = "inCoreLimit";
/** /**
* The "prune" key * The "prune" key
* @since 3.3 * @since 3.3

View File

@ -85,6 +85,7 @@
import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.errors.NoWorkTreeException; import org.eclipse.jgit.errors.NoWorkTreeException;
import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.ObjectInserter;
@ -272,6 +273,12 @@ public enum MergeFailureReason {
*/ */
protected MergeAlgorithm mergeAlgorithm; protected MergeAlgorithm mergeAlgorithm;
/**
* The size limit (bytes) which controls a file to be stored in {@code Heap} or
* {@code LocalFile} during the merge.
*/
private int inCoreLimit;
private static MergeAlgorithm getMergeAlgorithm(Config config) { private static MergeAlgorithm getMergeAlgorithm(Config config) {
SupportedAlgorithm diffAlg = config.getEnum( SupportedAlgorithm diffAlg = config.getEnum(
CONFIG_DIFF_SECTION, null, CONFIG_KEY_ALGORITHM, CONFIG_DIFF_SECTION, null, CONFIG_KEY_ALGORITHM,
@ -279,6 +286,11 @@ private static MergeAlgorithm getMergeAlgorithm(Config config) {
return new MergeAlgorithm(DiffAlgorithm.getAlgorithm(diffAlg)); return new MergeAlgorithm(DiffAlgorithm.getAlgorithm(diffAlg));
} }
private static int getInCoreLimit(Config config) {
return config.getInt(
ConfigConstants.CONFIG_MERGE_SECTION, ConfigConstants.CONFIG_KEY_IN_CORE_LIMIT, 10 << 20);
}
private static String[] defaultCommitNames() { private static String[] defaultCommitNames() {
return new String[] { "BASE", "OURS", "THEIRS" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ return new String[] { "BASE", "OURS", "THEIRS" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
} }
@ -289,7 +301,9 @@ private static String[] defaultCommitNames() {
*/ */
protected ResolveMerger(Repository local, boolean inCore) { protected ResolveMerger(Repository local, boolean inCore) {
super(local); super(local);
mergeAlgorithm = getMergeAlgorithm(local.getConfig()); Config config = local.getConfig();
mergeAlgorithm = getMergeAlgorithm(config);
inCoreLimit = getInCoreLimit(config);
commitNames = defaultCommitNames(); commitNames = defaultCommitNames();
this.inCore = inCore; this.inCore = inCore;
@ -835,7 +849,7 @@ private File writeMergedFile(MergeResult<RawText> result)
private ObjectId insertMergeResult(MergeResult<RawText> result) private ObjectId insertMergeResult(MergeResult<RawText> result)
throws IOException { throws IOException {
TemporaryBuffer.LocalFile buf = new TemporaryBuffer.LocalFile( TemporaryBuffer.LocalFile buf = new TemporaryBuffer.LocalFile(
db != null ? nonNullRepo().getDirectory() : null, 10 << 20); db != null ? nonNullRepo().getDirectory() : null, inCoreLimit);
try { try {
new MergeFormatter().formatMerge(buf, result, new MergeFormatter().formatMerge(buf, result,
Arrays.asList(commitNames), CHARACTER_ENCODING); Arrays.asList(commitNames), CHARACTER_ENCODING);