- Direct Known Subclasses:
RecursiveMerger
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic enumIf the merge fails (means: not stopped because of unresolved conflicts) this enum is used to explain why it failedprotected static classHandles work tree updates on both the checkout and the index. -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected String[]string versions of a list of commit SHA1sprotected DirCacheDirectory cacheprotected booleanUpdated as we merge entries of the tree walk.protected Map<String,ResolveMerger.MergeFailureReason> Paths for which the merge failed altogether.protected booleanSet to true if this merge should work in-memory.protected MergeAlgorithmour merge algorithmprotected Map<String,MergeResult<? extends Sequence>> Low-level textual merge results.Files modified during this operation.protected ObjectIdmerge result as treeprotected static final intIndex of the base tree within thetree walk.protected static final intIndex of the working directory tree within thetree walk.protected static final intIndex of the index tree within thetree walk.protected static final intIndex of our tree in withthetree walk.protected static final intIndex of their tree within thetree walk.protected NameConflictTreeWalkThe tree walk which we'll iterate over to merge entries.Paths that could not be merged by this merger because of an unsolvable conflict.protected WorkingTreeIteratorThe iterator to access the working tree.protected ResolveMerger.WorkTreeUpdaterHandler for repository I/O actions.Fields inherited from class org.eclipse.jgit.merge.Merger
db, monitor, reader, sourceCommits, sourceObjects, sourceTrees, walk -
Constructor Summary
ConstructorsModifierConstructorDescriptionprotectedResolveMerger(ObjectInserter inserter, Config config) Constructor for ResolveMerger.protectedResolveMerger(Repository local) Constructor for ResolveMerger.protectedResolveMerger(Repository local, boolean inCore) Constructor for ResolveMerger. -
Method Summary
Modifier and TypeMethodDescriptionprotected voidaddDeletion(String path, boolean isFile, Attributes attributes) Remember a path for deletion, and remember itsDirCacheCheckout.CheckoutMetadatain case it has to be restored in the cleanUp.protected voidaddToCheckout(String path, DirCacheEntry entry, Attributes[] attributes) Adds aDirCacheEntryfor direct checkout and remembers itsDirCacheCheckout.CheckoutMetadata.booleanfailed()Returns whether this merge failed (i.e.String[]Get the names of the commits as they would appear in conflict markers.Retrieves the content merge strategy for content conflicts.Get list of paths causing this merge to fail (not stopped because of a conflict).Map<String,MergeResult<? extends Sequence>> Get the mergeResultsGet the paths of files which have been modified by this merge.Get resulting tree.Get a map which maps the paths of files which have to be checked out because the merge created new fully-merged content for this file into the index.Get the paths with conflicts.protected booleanExecute the merge.protected booleanmergeTrees(AbstractTreeIterator baseTree, RevTree headTree, RevTree mergeTree, boolean ignoreConflicts) The resolve conflict way of three way mergingprotected booleanmergeTreeWalk(TreeWalk treeWalk, boolean ignoreConflicts) Process the given TreeWalk's entries.protected booleanprocessEntry(CanonicalTreeParser base, CanonicalTreeParser ours, CanonicalTreeParser theirs, DirCacheBuildIterator index, WorkingTreeIterator work, boolean ignoreConflicts, Attributes[] attributes) Processes one path and tries to merge taking git attributes in account.voidsetCommitNames(String[] commitNames) Set the names of the commits as they would appear in conflict markersvoidsetContentMergeStrategy(ContentMergeStrategy strategy) Sets the content merge strategy for content conflicts.voidsetDirCache(DirCache dc) Sets the DirCache which shall be used by this merger.voidsetWorkingTreeIterator(WorkingTreeIterator workingTreeIterator) Sets the WorkingTreeIterator to be used by this merger.Methods inherited from class org.eclipse.jgit.merge.ThreeWayMerger
getBaseCommitId, merge, mergeBase, setBaseMethods inherited from class org.eclipse.jgit.merge.Merger
getBaseCommit, getObjectInserter, getRepository, merge, nonNullRepo, openTree, setObjectInserter, setProgressMonitor
-
Field Details
-
tw
The tree walk which we'll iterate over to merge entries.- Since:
- 3.4
-
commitNames
string versions of a list of commit SHA1s- Since:
- 3.0
-
T_BASE
protected static final int T_BASEIndex of the base tree within thetree walk.- Since:
- 3.4
- See Also:
-
T_OURS
protected static final int T_OURSIndex of our tree in withthetree walk.- Since:
- 3.4
- See Also:
-
T_THEIRS
protected static final int T_THEIRSIndex of their tree within thetree walk.- Since:
- 3.4
- See Also:
-
T_INDEX
protected static final int T_INDEXIndex of the index tree within thetree walk.- Since:
- 3.4
- See Also:
-
T_FILE
protected static final int T_FILEIndex of the working directory tree within thetree walk.- Since:
- 3.4
- See Also:
-
workTreeUpdater
Handler for repository I/O actions.- Since:
- 6.3
-
resultTree
merge result as tree- Since:
- 3.0
-
modifiedFiles
Files modified during this operation. Note this list is only updated after a successful write. -
unmergedPaths
Paths that could not be merged by this merger because of an unsolvable conflict.- Since:
- 3.4
-
mergeResults
Low-level textual merge results. Will be passed on to the callers in case of conflicts.- Since:
- 3.4
-
failingPaths
Paths for which the merge failed altogether.- Since:
- 3.4
-
enterSubtree
protected boolean enterSubtreeUpdated as we merge entries of the tree walk. Tells us whether we should recurse into the entry if it is a subtree.- Since:
- 3.4
-
inCore
protected boolean inCoreSet to true if this merge should work in-memory. The repos dircache and workingtree are not touched by this method. Eventually needed files are created as temporary files and a new empty, in-memory dircache will be used instead the repo's one. Often used for bare repos where the repo doesn't even have a workingtree and dircache.- Since:
- 3.0
-
dircache
Directory cache- Since:
- 3.0
-
workingTreeIterator
The iterator to access the working tree. If set tonullthis merger will not touch the working tree.- Since:
- 3.0
-
mergeAlgorithm
our merge algorithm- Since:
- 3.0
-
-
Constructor Details
-
ResolveMerger
Constructor for ResolveMerger.- Parameters:
local- theRepository.inCore- a boolean.
-
ResolveMerger
Constructor for ResolveMerger.- Parameters:
local- theRepository.
-
ResolveMerger
Constructor for ResolveMerger.- Parameters:
inserter- anObjectInserterobject.config- the repository configuration- Since:
- 4.8
-
-
Method Details
-
getContentMergeStrategy
Retrieves the content merge strategy for content conflicts.- Returns:
- the
ContentMergeStrategyin effect - Since:
- 5.12
-
setContentMergeStrategy
Sets the content merge strategy for content conflicts.- Parameters:
strategy-ContentMergeStrategyto use- Since:
- 5.12
-
mergeImpl
Description copied from class:MergerExecute the merge.This method is called from
Merger.merge(AnyObjectId[])after theMerger.sourceObjects,Merger.sourceCommitsandMerger.sourceTreeshave been populated.- Specified by:
mergeImplin classMerger- Returns:
- true if the merge was completed without conflicts; false if the merge strategy cannot handle this merge or there were conflicts preventing it from automatically resolving all paths.
- Throws:
IncorrectObjectTypeException- one of the input objects is not a commit, but the strategy requires it to be a commit.IOException- one or more sources could not be read, or outputs could not be written to the Repository.
-
addToCheckout
protected void addToCheckout(String path, DirCacheEntry entry, Attributes[] attributes) throws IOException Adds aDirCacheEntryfor direct checkout and remembers itsDirCacheCheckout.CheckoutMetadata.- Parameters:
path- of the entryentry- to addattributes- theAttributesof the trees- Throws:
IOException- if theDirCacheCheckout.CheckoutMetadatacannot be determined- Since:
- 6.1
-
addDeletion
Remember a path for deletion, and remember itsDirCacheCheckout.CheckoutMetadatain case it has to be restored in the cleanUp.- Parameters:
path- of the entryisFile- whether it is a fileattributes- to use for determining theDirCacheCheckout.CheckoutMetadata- Throws:
IOException- if theDirCacheCheckout.CheckoutMetadatacannot be determined- Since:
- 5.1
-
processEntry
protected boolean processEntry(CanonicalTreeParser base, CanonicalTreeParser ours, CanonicalTreeParser theirs, DirCacheBuildIterator index, WorkingTreeIterator work, boolean ignoreConflicts, Attributes[] attributes) throws IOException Processes one path and tries to merge taking git attributes in account. This method will do all trivial (not content) merges and will also detect if a merge will fail. The merge will fail when one of the following is true- the index entry does not match the entry in ours. When merging one branch into the current HEAD, ours will point to HEAD and theirs will point to the other branch. It is assumed that the index matches the HEAD because it will only not match HEAD if it was populated before the merge operation. But the merge commit should not accidentally contain modifications done before the merge. Check the git read-tree documentation for further explanations.
- A conflict was detected and the working-tree file is dirty. When a conflict is detected the content-merge algorithm will try to write a merged version into the working-tree. If the file is dirty we would override unsaved data.
- Parameters:
base- the common base for ours and theirsours- the ours side of the merge. When merging a branch into the HEAD ours will point to HEADtheirs- the theirs side of the merge. When merging a branch into the current HEAD theirs will point to the branch which is merged into HEAD.index- the index entrywork- the file in the working treeignoreConflicts- seemergeTrees(AbstractTreeIterator, RevTree, RevTree, boolean)attributes- theAttributesfor the three trees- Returns:
falseif the merge will fail because the index entry didn't match ours or the working-dir file was dirty and a conflict occurred- Throws:
IOException- if an IO error occurred- Since:
- 6.1
-
getResultTreeId
Description copied from class:MergerGet resulting tree.- Specified by:
getResultTreeIdin classMerger- Returns:
- resulting tree, if
Merger.merge(AnyObjectId[])returned true.
-
setCommitNames
Set the names of the commits as they would appear in conflict markers- Parameters:
commitNames- the names of the commits as they would appear in conflict markers
-
getCommitNames
Get the names of the commits as they would appear in conflict markers.- Returns:
- the names of the commits as they would appear in conflict markers.
-
getUnmergedPaths
Get the paths with conflicts. This is a subset of the files listed bygetModifiedFiles()- Returns:
- the paths with conflicts. This is a subset of the files listed by
getModifiedFiles()
-
getModifiedFiles
Get the paths of files which have been modified by this merge.- Returns:
- the paths of files which have been modified by this merge. A file
will be modified if a content-merge works on this path or if the
merge algorithm decides to take the theirs-version. This is a
superset of the files listed by
getUnmergedPaths().
-
getToBeCheckedOut
Get a map which maps the paths of files which have to be checked out because the merge created new fully-merged content for this file into the index.- Returns:
- a map which maps the paths of files which have to be checked out because the merge created new fully-merged content for this file into the index. This means: the merge wrote a new stage 0 entry for this path.
-
getMergeResults
Get the mergeResults- Returns:
- the mergeResults
-
getFailingPaths
Get list of paths causing this merge to fail (not stopped because of a conflict).- Returns:
- lists paths causing this merge to fail (not stopped because of a
conflict).
nullis returned if this merge didn't fail.
-
failed
public boolean failed()Returns whether this merge failed (i.e. not stopped because of a conflict)- Returns:
trueif a failure occurred,falseotherwise
-
setDirCache
Sets the DirCache which shall be used by this merger. If the DirCache is not set explicitly and if this merger doesn't work in-core, this merger will implicitly get and lock a default DirCache. If the DirCache is explicitly set the caller is responsible to lock it in advance. Finally the merger will callDirCache.commit()which requires that the DirCache is locked. If themergeImpl()returns without throwing an exception the lock will be released. In case of exceptions the caller is responsible to release the lock.- Parameters:
dc- the DirCache to set
-
setWorkingTreeIterator
Sets the WorkingTreeIterator to be used by this merger. If no WorkingTreeIterator is set this merger will ignore the working tree and fail if a content merge is necessary.TODO: enhance WorkingTreeIterator to support write operations. Then this merger will be able to merge with a different working tree abstraction.
- Parameters:
workingTreeIterator- the workingTreeIt to set
-
mergeTrees
protected boolean mergeTrees(AbstractTreeIterator baseTree, RevTree headTree, RevTree mergeTree, boolean ignoreConflicts) throws IOException The resolve conflict way of three way merging- Parameters:
baseTree- aAbstractTreeIteratorobject.headTree- aRevTreeobject.mergeTree- aRevTreeobject.ignoreConflicts- Controls what to do in case a content-merge is done and a conflict is detected. The default setting for this should befalse. In this case the working tree file is filled with new content (containing conflict markers) and the index is filled with multiple stages containing BASE, OURS and THEIRS content. Having such non-0 stages is the sign to git tools that there are still conflicts for that path.If
trueis specified the behavior is different. In case a conflict is detected the working tree file is again filled with new content (containing conflict markers). But also stage 0 of the index is filled with that content. No other stages are filled. Means: there is no conflict on that path but the new content (including conflict markers) is stored as successful merge result. This is needed in the context ofRecursiveMergerwhere when determining merge bases we don't want to deal with content-merge conflicts.- Returns:
- whether the trees merged cleanly
- Throws:
IOException- if an IO error occurred- Since:
- 3.5
-
mergeTreeWalk
Process the given TreeWalk's entries.- Parameters:
treeWalk- The walk to iterate over.ignoreConflicts- seemergeTrees(AbstractTreeIterator, RevTree, RevTree, boolean)- Returns:
- Whether the trees merged cleanly.
- Throws:
IOException- if an IO error occurred- Since:
- 3.5
-