Class RecursiveMerger


public class RecursiveMerger extends ResolveMerger
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
  • Field Details

    • MAX_BASES

      public final int MAX_BASES
      The maximum number of merge bases. This merge will stop when the number of merge bases exceeds this value
      See Also:
  • Constructor Details

    • RecursiveMerger

      protected RecursiveMerger(Repository local, boolean inCore)
      Normal recursive merge when you want a choice of DirCache placement inCore
      Parameters:
      local - a Repository object.
      inCore - a boolean.
    • RecursiveMerger

      protected RecursiveMerger(Repository local)
      Normal recursive merge, implies not inCore
      Parameters:
      local - a Repository object.
    • RecursiveMerger

      protected RecursiveMerger(ObjectInserter inserter, Config config)
      Normal recursive merge, implies inCore.
      Parameters:
      inserter - an ObjectInserter object.
      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:
      getBaseCommit in class Merger
      Parameters:
      a - the first commit in Merger.sourceObjects.
      b - the second commit in Merger.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

      protected RevCommit getBaseCommit(RevCommit a, RevCommit b, int callDepth) throws IOException
      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 merged
      b - the second commit to be merged
      callDepth - 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:
      IOException
      IncorrectObjectTypeException - 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

      private RevCommit createCommitForTree(ObjectId tree, List<RevCommit> parents) throws IOException
      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 capture
      parents - the list of parent commits
      Returns:
      a new commit visible only within this merger's RevWalk.
      Throws:
      IOException
    • mockAuthor

      private static PersonIdent mockAuthor(List<RevCommit> parents)