Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java')
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java53
1 files changed, 47 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());
}

Back to the top