List of usage examples for org.eclipse.jgit.merge ResolveMerger getUnmergedPaths
public List<String> getUnmergedPaths()
From source file:jetbrains.buildServer.buildTriggers.vcs.git.GitMergeSupport.java
License:Apache License
@NotNull public Map<MergeTask, MergeResult> tryMerge(@NotNull VcsRoot root, @NotNull List<MergeTask> tasks, @NotNull MergeOptions options) throws VcsException { Map<MergeTask, MergeResult> mergeResults = new HashMap<MergeTask, MergeResult>(); OperationContext context = myVcs.createContext(root, "merge"); try {/* w ww .java 2s. c om*/ Repository db = context.getRepository(); for (MergeTask t : tasks) { ObjectId src = ObjectId.fromString(t.getSourceRevision()); ObjectId dst = ObjectId.fromString(t.getDestinationRevision()); ResolveMerger merger = (ResolveMerger) MergeStrategy.RECURSIVE.newMerger(db, true); try { boolean success = merger.merge(dst, src); if (success) { mergeResults.put(t, MergeResult.createMergeSuccessResult()); } else { mergeResults.put(t, MergeResult.createMergeError(merger.getUnmergedPaths())); } } catch (IOException mergeException) { mergeResults.put(t, MergeResult.createMergeError(mergeException.getMessage())); } } } catch (Exception e) { throw context.wrapException(e); } finally { context.close(); } return mergeResults; }
From source file:jetbrains.buildServer.buildTriggers.vcs.git.GitMergeSupport.java
License:Apache License
@NotNull private ObjectId mergeCommits(@NotNull GitVcsRoot gitRoot, @NotNull Repository db, @NotNull RevCommit srcCommit, @NotNull RevCommit dstCommit, @NotNull String message, @NotNull MergeOptions options) throws IOException, MergeFailedException { if (!alwaysCreateMergeCommit(options)) { RevWalk walk = new RevWalk(db); try {/* ww w.j a v a 2 s . c o m*/ if (walk.isMergedInto(walk.parseCommit(dstCommit), walk.parseCommit(srcCommit))) { LOG.debug("Commit " + srcCommit.name() + " already merged into " + dstCommit + ", skip the merge"); return srcCommit; } } finally { walk.release(); } } if (tryRebase(options)) { LOG.debug("Run rebase, root " + gitRoot + ", revision " + srcCommit.name() + ", destination " + dstCommit.name()); try { return rebase(gitRoot, db, srcCommit, dstCommit); } catch (MergeFailedException e) { if (enforceLinearHistory(options)) { LOG.debug("Rebase failed, root " + gitRoot + ", revision " + srcCommit.name() + ", destination " + dstCommit.name(), e); throw e; } } catch (IOException e) { if (enforceLinearHistory(options)) { LOG.debug("Rebase failed, root " + gitRoot + ", revision " + srcCommit.name() + ", destination " + dstCommit.name(), e); throw e; } } } ResolveMerger merger = (ResolveMerger) MergeStrategy.RECURSIVE.newMerger(db, true); boolean mergeSuccessful = merger.merge(dstCommit, srcCommit); if (!mergeSuccessful) { List<String> conflicts = merger.getUnmergedPaths(); Collections.sort(conflicts); LOG.debug("Merge failed with conflicts, root " + gitRoot + ", revision " + srcCommit.name() + ", destination " + dstCommit.name() + ", conflicts " + conflicts); throw new MergeFailedException(conflicts); } ObjectInserter inserter = db.newObjectInserter(); DirCache dc = DirCache.newInCore(); DirCacheBuilder dcb = dc.builder(); dcb.addTree(new byte[] {}, 0, db.getObjectDatabase().newReader(), merger.getResultTreeId()); inserter.flush(); dcb.finish(); ObjectId writtenTreeId = dc.writeTree(inserter); CommitBuilder commitBuilder = new CommitBuilder(); commitBuilder.setCommitter(gitRoot.getTagger(db)); commitBuilder.setAuthor(gitRoot.getTagger(db)); commitBuilder.setMessage(message); commitBuilder.addParentId(dstCommit); commitBuilder.addParentId(srcCommit); commitBuilder.setTreeId(writtenTreeId); ObjectId commitId = inserter.insert(commitBuilder); inserter.flush(); return commitId; }
From source file:jetbrains.buildServer.buildTriggers.vcs.git.GitMergeSupport.java
License:Apache License
@NotNull private ObjectId rebaseCommit(@NotNull GitVcsRoot gitRoot, @NotNull Repository db, @NotNull ObjectInserter inserter, @NotNull RevCommit original, @NotNull RevCommit base) throws IOException, MergeFailedException { final RevCommit parentCommit = original.getParent(0); if (base.equals(parentCommit)) return original; ResolveMerger merger = (ResolveMerger) MergeStrategy.RECURSIVE.newMerger(db, true); merger.setBase(parentCommit);// w w w .j a va 2s .co m merger.merge(original, base); if (merger.getResultTreeId() == null) throw new MergeFailedException(merger.getUnmergedPaths()); if (base.getTree().getId().equals(merger.getResultTreeId())) return base; final CommitBuilder cb = new CommitBuilder(); cb.setTreeId(merger.getResultTreeId()); cb.setParentId(base); cb.setAuthor(GitServerUtil.getAuthorIdent(original)); cb.setCommitter(gitRoot.getTagger(db)); cb.setMessage(GitServerUtil.getFullMessage(original)); final ObjectId objectId = inserter.insert(cb); inserter.flush(); return objectId; }
From source file:org.jboss.forge.addon.git.GitUtilsImpl.java
License:Open Source License
@Override public CherryPickResult cherryPickNoMerge(final Git git, Ref src) throws GitAPIException, CantMergeCommitException { // Does the same as the original git-cherryPick // except commiting after running merger Repository repo = git.getRepository(); RevCommit newHead = null;/*from w w w.j a v a2s . co m*/ List<Ref> cherryPickedRefs = new LinkedList<Ref>(); try (RevWalk revWalk = new RevWalk(repo)) { // get the head commit Ref headRef = repo.findRef(Constants.HEAD); if (headRef == null) throw new NoHeadException(JGitText.get().commitOnRepoWithoutHEADCurrentlyNotSupported); RevCommit headCommit = revWalk.parseCommit(headRef.getObjectId()); newHead = headCommit; // get the commit to be cherry-picked // handle annotated tags ObjectId srcObjectId = src.getPeeledObjectId(); if (srcObjectId == null) srcObjectId = src.getObjectId(); RevCommit srcCommit = revWalk.parseCommit(srcObjectId); // get the parent of the commit to cherry-pick if (srcCommit.getParentCount() == 0) throw new CantMergeCommitException("Commit with zero parents cannot be merged"); if (srcCommit.getParentCount() > 1) throw new MultipleParentsNotAllowedException( MessageFormat.format(JGitText.get().canOnlyCherryPickCommitsWithOneParent, srcCommit.name(), Integer.valueOf(srcCommit.getParentCount()))); RevCommit srcParent = srcCommit.getParent(0); revWalk.parseHeaders(srcParent); ResolveMerger merger = (ResolveMerger) MergeStrategy.RESOLVE.newMerger(repo); merger.setWorkingTreeIterator(new FileTreeIterator(repo)); merger.setBase(srcParent.getTree()); if (merger.merge(headCommit, srcCommit)) { DirCacheCheckout dco = new DirCacheCheckout(repo, headCommit.getTree(), repo.lockDirCache(), merger.getResultTreeId()); dco.setFailOnConflict(true); dco.checkout(); cherryPickedRefs.add(src); } else { if (merger.failed()) return new CherryPickResult(merger.getFailingPaths()); // there are merge conflicts String message = new MergeMessageFormatter().formatWithConflicts(srcCommit.getFullMessage(), merger.getUnmergedPaths()); repo.writeCherryPickHead(srcCommit.getId()); repo.writeMergeCommitMsg(message); return CherryPickResult.CONFLICT; } } catch (IOException e) { throw new JGitInternalException( MessageFormat.format(JGitText.get().exceptionCaughtDuringExecutionOfCherryPickCommand, e), e); } return new CherryPickResult(newHead, cherryPickedRefs); }
From source file:org.jboss.forge.git.GitUtils.java
License:Open Source License
public static CherryPickResult cherryPickNoMerge(final Git git, Ref src) throws GitAPIException, CantMergeCommitWithZeroParentsException { // Does the same as the original git-cherryPick // except commiting after running merger Repository repo = git.getRepository(); RevCommit newHead = null;//from w w w . j a v a 2s . com List<Ref> cherryPickedRefs = new LinkedList<Ref>(); RevWalk revWalk = new RevWalk(repo); try { // get the head commit Ref headRef = repo.getRef(Constants.HEAD); if (headRef == null) throw new NoHeadException(JGitText.get().commitOnRepoWithoutHEADCurrentlyNotSupported); RevCommit headCommit = revWalk.parseCommit(headRef.getObjectId()); newHead = headCommit; // get the commit to be cherry-picked // handle annotated tags ObjectId srcObjectId = src.getPeeledObjectId(); if (srcObjectId == null) srcObjectId = src.getObjectId(); RevCommit srcCommit = revWalk.parseCommit(srcObjectId); // get the parent of the commit to cherry-pick if (srcCommit.getParentCount() == 0) throw new CantMergeCommitWithZeroParentsException("Commit with zero parents cannot be merged"); if (srcCommit.getParentCount() > 1) throw new MultipleParentsNotAllowedException( MessageFormat.format(JGitText.get().canOnlyCherryPickCommitsWithOneParent, srcCommit.name(), Integer.valueOf(srcCommit.getParentCount()))); RevCommit srcParent = srcCommit.getParent(0); revWalk.parseHeaders(srcParent); ResolveMerger merger = (ResolveMerger) MergeStrategy.RESOLVE.newMerger(repo); merger.setWorkingTreeIterator(new FileTreeIterator(repo)); merger.setBase(srcParent.getTree()); if (merger.merge(headCommit, srcCommit)) { DirCacheCheckout dco = new DirCacheCheckout(repo, headCommit.getTree(), repo.lockDirCache(), merger.getResultTreeId()); dco.setFailOnConflict(true); dco.checkout(); cherryPickedRefs.add(src); } else { if (merger.failed()) return new CherryPickResult(merger.getFailingPaths()); // there are merge conflicts String message = new MergeMessageFormatter().formatWithConflicts(srcCommit.getFullMessage(), merger.getUnmergedPaths()); repo.writeCherryPickHead(srcCommit.getId()); repo.writeMergeCommitMsg(message); return CherryPickResult.CONFLICT; } } catch (IOException e) { throw new JGitInternalException( MessageFormat.format(JGitText.get().exceptionCaughtDuringExecutionOfCherryPickCommand, e), e); } finally { revWalk.release(); } return new CherryPickResult(newHead, cherryPickedRefs); }
From source file:org.kie.commons.java.nio.fs.jgit.util.JGitUtil.java
License:Apache License
public static MergeResult mergeBranches(final Git git, final String source, final String target) throws Exception { final Repository repo = git.getRepository(); final MergeStrategy mergeStrategy = MergeStrategy.RESOLVE; final List<Ref> commits = new LinkedList<Ref>(); final boolean squash = false; RevWalk revWalk = null;//from w w w . jav a2 s. co m DirCacheCheckout dco = null; try { Ref head = repo.getRef(Constants.HEAD); if (head == null) { throw new NoHeadException(JGitText.get().commitOnRepoWithoutHEADCurrentlyNotSupported); } final StringBuilder refLogMessage = new StringBuilder("merge "); // Check for FAST_FORWARD, ALREADY_UP_TO_DATE revWalk = new RevWalk(repo); // we know for now there is only one commit Ref ref = commits.get(0); refLogMessage.append(ref.getName()); // handle annotated tags ObjectId objectId = ref.getPeeledObjectId(); if (objectId == null) { objectId = ref.getObjectId(); } final RevCommit srcCommit = revWalk.lookupCommit(objectId); ObjectId headId = head.getObjectId(); if (headId == null) { revWalk.parseHeaders(srcCommit); dco = new DirCacheCheckout(repo, repo.lockDirCache(), srcCommit.getTree()); dco.setFailOnConflict(true); dco.checkout(); RefUpdate refUpdate = repo.updateRef(head.getTarget().getName()); refUpdate.setNewObjectId(objectId); refUpdate.setExpectedOldObjectId(null); refUpdate.setRefLogMessage("initial pull", false); if (refUpdate.update() != RefUpdate.Result.NEW) { throw new NoHeadException(JGitText.get().commitOnRepoWithoutHEADCurrentlyNotSupported); } return new MergeResult(srcCommit, srcCommit, new ObjectId[] { null, srcCommit }, MergeStatus.FAST_FORWARD, mergeStrategy, null, null); } final RevCommit headCommit = revWalk.lookupCommit(headId); if (revWalk.isMergedInto(srcCommit, headCommit)) { return new MergeResult(headCommit, srcCommit, new ObjectId[] { headCommit, srcCommit }, ALREADY_UP_TO_DATE, mergeStrategy, null, null); } else if (revWalk.isMergedInto(headCommit, srcCommit)) { // FAST_FORWARD detected: skip doing a real merge but only // update HEAD refLogMessage.append(": " + FAST_FORWARD); dco = new DirCacheCheckout(repo, headCommit.getTree(), repo.lockDirCache(), srcCommit.getTree()); dco.setFailOnConflict(true); dco.checkout(); String msg = null; ObjectId newHead, base = null; final MergeStatus mergeStatus; if (!squash) { updateHead(git, refLogMessage, srcCommit, headId); newHead = base = srcCommit; mergeStatus = FAST_FORWARD; } else { msg = JGitText.get().squashCommitNotUpdatingHEAD; newHead = base = headId; mergeStatus = FAST_FORWARD_SQUASHED; final List<RevCommit> squashedCommits = RevWalkUtils.find(revWalk, srcCommit, headCommit); final String squashMessage = new SquashMessageFormatter().format(squashedCommits, head); repo.writeSquashCommitMsg(squashMessage); } return new MergeResult(newHead, base, new ObjectId[] { headCommit, srcCommit }, mergeStatus, mergeStrategy, null, msg); } else { String mergeMessage = ""; if (!squash) { mergeMessage = new MergeMessageFormatter().format(commits, head); repo.writeMergeCommitMsg(mergeMessage); repo.writeMergeHeads(Arrays.asList(ref.getObjectId())); } else { final List<RevCommit> squashedCommits = RevWalkUtils.find(revWalk, srcCommit, headCommit); final String squashMessage = new SquashMessageFormatter().format(squashedCommits, head); repo.writeSquashCommitMsg(squashMessage); } boolean noProblems; final Merger merger = mergeStrategy.newMerger(repo); final Map<String, org.eclipse.jgit.merge.MergeResult<?>> lowLevelResults; final Map<String, ResolveMerger.MergeFailureReason> failingPaths; final List<String> unmergedPaths; if (merger instanceof ResolveMerger) { ResolveMerger resolveMerger = (ResolveMerger) merger; resolveMerger.setCommitNames(new String[] { "BASE", "HEAD", ref.getName() }); resolveMerger.setWorkingTreeIterator(new FileTreeIterator(repo)); noProblems = merger.merge(headCommit, srcCommit); lowLevelResults = resolveMerger.getMergeResults(); failingPaths = resolveMerger.getFailingPaths(); unmergedPaths = resolveMerger.getUnmergedPaths(); } else { noProblems = merger.merge(headCommit, srcCommit); lowLevelResults = emptyMap(); failingPaths = emptyMap(); unmergedPaths = emptyList(); } refLogMessage.append(": Merge made by "); refLogMessage.append(mergeStrategy.getName()); refLogMessage.append('.'); if (noProblems) { dco = new DirCacheCheckout(repo, headCommit.getTree(), repo.lockDirCache(), merger.getResultTreeId()); dco.setFailOnConflict(true); dco.checkout(); String msg = null; RevCommit newHead = null; MergeStatus mergeStatus = null; if (!squash) { newHead = new Git(repo).commit().setReflogComment(refLogMessage.toString()).call(); mergeStatus = MERGED; } else { msg = JGitText.get().squashCommitNotUpdatingHEAD; newHead = headCommit; mergeStatus = MERGED_SQUASHED; } return new MergeResult(newHead.getId(), null, new ObjectId[] { headCommit.getId(), srcCommit.getId() }, mergeStatus, mergeStrategy, null, msg); } else { if (failingPaths != null && !failingPaths.isEmpty()) { repo.writeMergeCommitMsg(null); repo.writeMergeHeads(null); return new MergeResult(null, merger.getBaseCommit(0, 1), new ObjectId[] { headCommit.getId(), srcCommit.getId() }, FAILED, mergeStrategy, lowLevelResults, failingPaths, null); } else { final String mergeMessageWithConflicts = new MergeMessageFormatter() .formatWithConflicts(mergeMessage, unmergedPaths); repo.writeMergeCommitMsg(mergeMessageWithConflicts); return new MergeResult(null, merger.getBaseCommit(0, 1), new ObjectId[] { headCommit.getId(), srcCommit.getId() }, CONFLICTING, mergeStrategy, lowLevelResults, null); } } } } catch (org.eclipse.jgit.errors.CheckoutConflictException e) { final List<String> conflicts = (dco == null) ? Collections.<String>emptyList() : dco.getConflicts(); throw new CheckoutConflictException(conflicts, e); } catch (java.io.IOException e) { throw new JGitInternalException( MessageFormat.format(JGitText.get().exceptionCaughtDuringExecutionOfMergeCommand, e), e); } finally { if (revWalk != null) { revWalk.release(); } } }