diff options
author | Eike Stepper | 2016-10-10 13:53:52 +0000 |
---|---|---|
committer | Eike Stepper | 2016-10-10 13:53:52 +0000 |
commit | c15fd3efd477d5336cde2ef3eee6cd40c58f59c2 (patch) | |
tree | 0816294b4795d2cb27ea31d9ee0f2f85d3b0e947 /plugins/org.eclipse.emf.cdo.server | |
parent | da400648e8fe23899619769629dabc8123490e96 (diff) | |
download | cdo-c15fd3efd477d5336cde2ef3eee6cd40c58f59c2.tar.gz cdo-c15fd3efd477d5336cde2ef3eee6cd40c58f59c2.tar.xz cdo-c15fd3efd477d5336cde2ef3eee6cd40c58f59c2.zip |
[505654] Support automatic remerging / multiple merges from the same branch
https://bugs.eclipse.org/bugs/show_bug.cgi?id=505654
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server')
2 files changed, 76 insertions, 6 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java index 972e43c30b..4a83ddcd6a 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java @@ -1575,13 +1575,54 @@ public class Repository extends Container<Object> implements InternalRepository, } else { - CDORevisionAvailabilityInfo sourceBaseInfoToUse = sourceBaseInfo == null ? targetBaseInfo : sourceBaseInfo; + CDOChangeSetSegment[] targetSegments; + CDOChangeSetSegment[] sourceSegments; - ids.addAll(accessor.readChangeSet(monitor.fork(), - CDOChangeSetSegment.createFrom(targetBaseInfo.getBranchPoint(), target))); + if (targetBaseInfo.getBranchPoint() == CDOBranchUtil.AUTO_BRANCH_POINT) + { + CDOBranchPoint ancestor = CDOBranchUtil.getAncestor(target, source); + targetSegments = CDOChangeSetSegment.createFrom(ancestor, target); + sourceSegments = CDOChangeSetSegment.createFrom(ancestor, source); + + for (int i = targetSegments.length - 1; i >= 0; --i) + { + CDOChangeSetSegment targetSegment = targetSegments[i]; + CDOBranch branch = targetSegment.getBranch(); + long startTime = targetSegment.getTimeStamp(); + long endTime = targetSegment.getEndTime(); + + while (endTime > startTime || endTime == CDOBranchPoint.UNSPECIFIED_DATE) + { + CDOCommitInfo commitInfo = commitInfoManager.getCommitInfo(branch, endTime, false); + if (commitInfo == null) + { + break; + } + + CDOBranchPoint mergeSource = commitInfo.getMergeSource(); + if (mergeSource != null && CDOChangeSetSegment.contains(sourceSegments, mergeSource)) + { + targetSegments = CDOChangeSetSegment.createFrom(commitInfo, target); + sourceSegments = CDOChangeSetSegment.createFrom(mergeSource, source); + break; + } + + endTime = commitInfo.getTimeStamp() - 1; + } + } + + targetBaseInfo.setBranchPoint(CDOBranchUtil.copyBranchPoint(targetSegments[0])); + sourceBaseInfo.setBranchPoint(CDOBranchUtil.copyBranchPoint(sourceSegments[0])); + } + else + { + CDORevisionAvailabilityInfo sourceBaseInfoToUse = sourceBaseInfo == null ? targetBaseInfo : sourceBaseInfo; + targetSegments = CDOChangeSetSegment.createFrom(targetBaseInfo.getBranchPoint(), target); + sourceSegments = CDOChangeSetSegment.createFrom(sourceBaseInfoToUse.getBranchPoint(), source); + } - ids.addAll(accessor.readChangeSet(monitor.fork(), - CDOChangeSetSegment.createFrom(sourceBaseInfoToUse.getBranchPoint(), source))); + ids.addAll(accessor.readChangeSet(monitor.fork(), targetSegments)); + ids.addAll(accessor.readChangeSet(monitor.fork(), sourceSegments)); } loadMergeData(ids, targetInfo, monitor.fork()); @@ -1592,7 +1633,7 @@ public class Repository extends Container<Object> implements InternalRepository, loadMergeData(ids, targetBaseInfo, monitor.fork()); } - if (sourceBaseInfo != null) + if (sourceBaseInfo != null && !targetBaseInfo.getBranchPoint().equals(sourceBaseInfo.getBranchPoint())) { loadMergeData(ids, sourceBaseInfo, monitor.fork()); } diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerBrowser.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerBrowser.java index 69db5f356d..3cf63642d4 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerBrowser.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerBrowser.java @@ -10,7 +10,10 @@ */ package org.eclipse.emf.cdo.server; +import org.eclipse.emf.cdo.common.CDOCommonRepository; +import org.eclipse.emf.cdo.common.CDOCommonRepository.CommitInfoStorage; import org.eclipse.emf.cdo.common.branch.CDOBranch; +import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; import org.eclipse.emf.cdo.common.branch.CDOBranchVersion; import org.eclipse.emf.cdo.common.commit.CDOCommitInfo; import org.eclipse.emf.cdo.common.commit.CDOCommitInfoHandler; @@ -1307,6 +1310,12 @@ public class CDOServerBrowser extends Worker out.print("<td valign=\"top\">Branch</td>\r\n"); out.print("<td valign=\"top\">User</td>\r\n"); out.print("<td valign=\"top\">Comment</td>\r\n"); + + if (repository.getCommitInfoStorage() == CommitInfoStorage.WITH_MERGE_SOURCE) + { + out.print("<td valign=\"top\">Merge</td>\r\n"); + } + out.print("</tr>\r\n"); final CDOCommitInfo[] details = { null }; @@ -1387,6 +1396,26 @@ public class CDOServerBrowser extends Worker out.print(StringUtil.isEmpty(comment) ? " " : browser.escape(comment)); out.print("</td>\r\n"); + CDOCommonRepository repository = commitInfo.getCommitInfoManager().getRepository(); + if (repository.getCommitInfoStorage() == CommitInfoStorage.WITH_MERGE_SOURCE) + { + out.print("<td valign=\"top\">\r\n"); + + CDOBranchPoint mergeSource = commitInfo.getMergeSource(); + if (mergeSource == null) + { + out.print(" "); + } + else + { + String mergeSourceLabel = browser.escape(mergeSource.getBranch().getPathName()) + " - " + + formatTimeStamp(mergeSource.getTimeStamp()); + out.print(browser.href(mergeSourceLabel, getName(), "time", String.valueOf(mergeSource.getTimeStamp()))); + } + + out.print("</td>\r\n"); + } + out.print("</tr>\r\n"); return selected; } |