Package org.eclipse.jgit.merge
Class RecursiveMerger
java.lang.Object
org.eclipse.jgit.merge.Merger
org.eclipse.jgit.merge.ThreeWayMerger
org.eclipse.jgit.merge.ResolveMerger
org.eclipse.jgit.merge.RecursiveMerger
A three-way merger performing a content-merge if necessary across multiple
bases using recursion
This merger extends the resolve merger and does several things differently:
- allow more than one merge base, up to a maximum
- uses "Lists" instead of Arrays for chained types
- recursively merges the merge bases together to compute a usable base
- Since:
- 3.0
-
Nested Class Summary
Nested classes/interfaces inherited from class org.eclipse.jgit.merge.ResolveMerger
ResolveMerger.MergeFailureReason -
Field Summary
FieldsFields inherited from class org.eclipse.jgit.merge.ResolveMerger
builder, commitNames, dircache, enterSubtree, failingPaths, implicitDirCache, inCore, mergeAlgorithm, mergeResults, modifiedFiles, resultTree, T_BASE, T_FILE, T_INDEX, T_OURS, T_THEIRS, toBeCheckedOut, toBeDeleted, tw, unmergedPaths, workingTreeIterator, workingTreeOptionsFields inherited from class org.eclipse.jgit.merge.Merger
db, monitor, reader, sourceCommits, sourceObjects, sourceTrees, walk -
Constructor Summary
ConstructorsModifierConstructorDescriptionprotectedRecursiveMerger(ObjectInserter inserter, Config config) Normal recursive merge, implies inCore.protectedRecursiveMerger(Repository local) Normal recursive merge, implies not inCoreprotectedRecursiveMerger(Repository local, boolean inCore) Normal recursive merge when you want a choice of DirCache placement inCore -
Method Summary
Modifier and TypeMethodDescriptionprivate RevCommitcreateCommitForTree(ObjectId tree, List<RevCommit> parents) Create a new commit by explicitly specifying the content tree and the parents.protected RevCommitgetBaseCommit(RevCommit a, RevCommit b) Return the merge base of two commits.protected RevCommitgetBaseCommit(RevCommit a, RevCommit b, int callDepth) Get a single base commit for two given commits.private static PersonIdentmockAuthor(List<RevCommit> parents) Methods inherited from class org.eclipse.jgit.merge.ResolveMerger
addCheckoutMetadata, addDeletion, addToCheckout, cleanUp, failed, getCommitNames, getContentMergeStrategy, getFailingPaths, getMergeResults, getModifiedFiles, getResultTreeId, getToBeCheckedOut, getUnmergedPaths, mergeImpl, mergeTrees, mergeTreeWalk, processEntry, setCommitNames, setContentMergeStrategy, setDirCache, setWorkingTreeIteratorMethods inherited from class org.eclipse.jgit.merge.ThreeWayMerger
getBaseCommitId, merge, mergeBase, setBaseMethods inherited from class org.eclipse.jgit.merge.Merger
getObjectInserter, getRepository, merge, nonNullRepo, openTree, setObjectInserter, setProgressMonitor
-
Field Details
-
MAX_BASES
public final int MAX_BASESThe maximum number of merge bases. This merge will stop when the number of merge bases exceeds this value- See Also:
-
-
Constructor Details
-
RecursiveMerger
Normal recursive merge when you want a choice of DirCache placement inCore- Parameters:
local- aRepositoryobject.inCore- a boolean.
-
RecursiveMerger
Normal recursive merge, implies not inCore- Parameters:
local- aRepositoryobject.
-
RecursiveMerger
Normal recursive merge, implies inCore.- Parameters:
inserter- anObjectInserterobject.config- the repository configuration- Since:
- 4.8
-
-
Method Details
-
getBaseCommit
protected RevCommit getBaseCommit(RevCommit a, RevCommit b) throws IncorrectObjectTypeException, IOException Return the merge base of two commits.Get a single base commit for two given commits. If the two source commits have more than one base commit recursively merge the base commits together until you end up with a single base commit.
- Overrides:
getBaseCommitin classMerger- Parameters:
a- the first commit inMerger.sourceObjects.b- the second commit inMerger.sourceObjects.- Returns:
- the merge base of two commits
- Throws:
IncorrectObjectTypeException- one of the input objects is not a commit.IOException- objects are missing or multiple merge bases were found.
-
getBaseCommit
Get a single base commit for two given commits. If the two source commits have more than one base commit recursively merge the base commits together until a virtual common base commit has been found.- Parameters:
a- the first commit to be mergedb- the second commit to be mergedcallDepth- the callDepth when this method is called recursively- Returns:
- the merge base of two commits. If a criss-cross merge required a synthetic merge base this commit is visible only the merger's RevWalk and will not be in the repository.
- Throws:
IOExceptionIncorrectObjectTypeException- one of the input objects is not a commit.NoMergeBaseException- too many merge bases are found or the computation of a common merge base failed (e.g. because of a conflict).
-
createCommitForTree
Create a new commit by explicitly specifying the content tree and the parents. The commit message is not set and author/committer are set to the current user.- Parameters:
tree- the tree this commit should captureparents- the list of parent commits- Returns:
- a new commit visible only within this merger's RevWalk.
- Throws:
IOException
-
mockAuthor
-