diff options
author | Stephan Seifermann | 2016-09-25 08:21:19 +0000 |
---|---|---|
committer | Eike Stepper | 2016-09-25 08:23:04 +0000 |
commit | ca3dc4959d1439c96e85a1d1c64c8debd8480686 (patch) | |
tree | c6e852b67e982284fcc9f178fa26ce227010e6e9 /plugins/org.eclipse.emf.cdo/src | |
parent | b94d1f1df2e55062401a1dbe39a26c80e34c0ede (diff) | |
download | cdo-ca3dc4959d1439c96e85a1d1c64c8debd8480686.tar.gz cdo-ca3dc4959d1439c96e85a1d1c64c8debd8480686.tar.xz cdo-ca3dc4959d1439c96e85a1d1c64c8debd8480686.zip |
[397999] Multiple merges between branches fail
https://bugs.eclipse.org/bugs/show_bug.cgi?id=397999
Signed-off-by: Stephan Seifermann <seifermann@fzi.de>
Signed-off-by: Eike Stepper <stepper@esc-net.de>
Change-Id: Ic834c983b930f186861a73d7ce9042d845d0e86f
Diffstat (limited to 'plugins/org.eclipse.emf.cdo/src')
6 files changed, 135 insertions, 43 deletions
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java index 29e092a51d..1178ed7cfe 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java @@ -844,6 +844,15 @@ public class CDOPushTransaction extends Notifier implements CDOTransaction } /** + * @since 4.6 + */ + public CDOChangeSetData merge(CDOBranchPoint source, CDOBranchPoint sourceBase, CDOBranchPoint targetBase, + CDOMerger merger) + { + return delegate.merge(sourceBase, sourceBase, targetBase, merger); + } + + /** * @since 4.0 */ public CDOChangeSetData compareRevisions(CDOBranchPoint source) diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOTransaction.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOTransaction.java index 2ed5ff400e..6fa3aed770 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOTransaction.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOTransaction.java @@ -78,6 +78,12 @@ public interface CDOTransaction extends CDOView, CDOCommonTransaction, CDOUserTr public CDOChangeSetData merge(CDOBranchPoint source, CDOBranchPoint sourceBase, CDOMerger merger); /** + * @since 4.6 + */ + public CDOChangeSetData merge(CDOBranchPoint source, CDOBranchPoint sourceBase, CDOBranchPoint targetBase, + CDOMerger merger); + + /** * @since 4.0 */ public CDOResourceFolder createResourceFolder(String path); diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java index 036dcc37e2..576281409c 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java @@ -1192,38 +1192,62 @@ public abstract class CDOSessionImpl extends CDOTransactionContainerImpl public MergeData getMergeData(CDOBranchPoint target, CDOBranchPoint source, CDOBranchPoint sourceBase, boolean computeChangeSets) { - CDOBranchPoint ancestor = CDOBranchUtil.getAncestor(target, source); + return getMergeData(target, source, null, sourceBase, computeChangeSets); + } + + public MergeData getMergeData(CDOBranchPoint target, CDOBranchPoint source, CDOBranchPoint targetBase, + CDOBranchPoint sourceBase, boolean computeChangeSets) + { + CDOBranchPoint ancestor = null; + + if (sourceBase == null) + { + ancestor = CDOBranchUtil.getAncestor(target, source); + sourceBase = ancestor; + } + + if (targetBase == null) + { + if (ancestor == null) + { + ancestor = CDOBranchUtil.getAncestor(target, source); + } + + targetBase = ancestor; + } + + boolean sameBase = sourceBase.equals(targetBase); - CDORevisionAvailabilityInfo ancestorInfo = createRevisionAvailabilityInfo2(ancestor); CDORevisionAvailabilityInfo targetInfo = createRevisionAvailabilityInfo2(target); CDORevisionAvailabilityInfo sourceInfo = createRevisionAvailabilityInfo2(source); - CDORevisionAvailabilityInfo baseInfo = sourceBase != null ? createRevisionAvailabilityInfo2(sourceBase) : null; + CDORevisionAvailabilityInfo targetBaseInfo = createRevisionAvailabilityInfo2(targetBase); + CDORevisionAvailabilityInfo sourceBaseInfo = sameBase ? null : createRevisionAvailabilityInfo2(sourceBase); - Set<CDOID> ids = sessionProtocol.loadMergeData(targetInfo, sourceInfo, ancestorInfo, baseInfo); + Set<CDOID> ids = sessionProtocol.loadMergeData(targetInfo, sourceInfo, targetBaseInfo, sourceBaseInfo); cacheRevisions2(targetInfo); cacheRevisions2(sourceInfo); - cacheRevisions2(ancestorInfo); + cacheRevisions2(targetBaseInfo); - if (baseInfo != null) + if (sameBase) { - cacheRevisions2(baseInfo); + sourceBaseInfo = targetBaseInfo; } else { - baseInfo = ancestorInfo; + cacheRevisions2(sourceBaseInfo); } CDOChangeSet targetChanges = null; CDOChangeSet sourceChanges = null; if (computeChangeSets) { - targetChanges = createChangeSet(ids, ancestorInfo, targetInfo); - sourceChanges = createChangeSet(ids, baseInfo, sourceInfo); + targetChanges = createChangeSet(ids, targetBaseInfo, targetInfo); + sourceChanges = createChangeSet(ids, sourceBaseInfo, sourceInfo); } - return new MergeData(target, source, sourceBase, ancestor, targetInfo, sourceInfo, baseInfo, ancestorInfo, ids, - targetChanges, sourceChanges); + return new MergeData(target, source, sourceBase, targetBase, targetInfo, sourceInfo, sourceBaseInfo, targetBaseInfo, + ids, targetChanges, sourceChanges); } @Deprecated diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java index dde21feec4..5323472d1f 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java @@ -548,6 +548,12 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa public CDOChangeSetData merge(CDOBranchPoint source, CDOBranchPoint sourceBase, CDOMerger merger) { + return merge(source, sourceBase, null, merger); + } + + public CDOChangeSetData merge(CDOBranchPoint source, CDOBranchPoint sourceBase, CDOBranchPoint targetBase, + CDOMerger merger) + { synchronized (getViewMonitor()) { lockView(); @@ -577,8 +583,13 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa throw new IllegalArgumentException("Source base is not contained in " + source); } + if (targetBase != null && !CDOBranchUtil.isContainedBy(targetBase, target)) + { + throw new IllegalArgumentException("Target base is not contained in " + target); + } + InternalCDOSession session = getSession(); - MergeData mergeData = session.getMergeData(target, source, sourceBase, true); + MergeData mergeData = session.getMergeData(target, source, targetBase, sourceBase, true); CDOChangeSet targetChanges = mergeData.getTargetChanges(); CDOChangeSet sourceChanges = mergeData.getSourceChanges(); @@ -588,9 +599,9 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa return null; } - CDORevisionAvailabilityInfo ancestorInfo = mergeData.getAncestorInfo(); + CDORevisionAvailabilityInfo targetBaseInfo = mergeData.getTargetBaseInfo(); CDORevisionAvailabilityInfo targetInfo = mergeData.getTargetInfo(); - ApplyChangeSetResult changeSet = applyChangeSet(result, ancestorInfo, targetInfo, source, false); + ApplyChangeSetResult changeSet = applyChangeSet(result, targetBaseInfo, targetInfo, source, false); return changeSet.getChangeSetData(); } finally @@ -602,12 +613,12 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa @Deprecated public Pair<CDOChangeSetData, Pair<Map<CDOID, CDOID>, List<CDOID>>> applyChangeSetData(CDOChangeSetData changeSetData, - CDORevisionProvider ancestorProvider, CDORevisionProvider targetProvider, CDOBranchPoint source) + CDORevisionProvider targetBaseProvider, CDORevisionProvider targetProvider, CDOBranchPoint source) { throw new UnsupportedOperationException(); } - public ApplyChangeSetResult applyChangeSet(CDOChangeSetData changeSetData, CDORevisionProvider ancestorProvider, + public ApplyChangeSetResult applyChangeSet(CDOChangeSetData changeSetData, CDORevisionProvider targetBaseProvider, CDORevisionProvider targetProvider, CDOBranchPoint source, boolean keepVersions) throws ChangeSetOutdatedException { synchronized (getViewMonitor()) @@ -636,7 +647,7 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa // Changed objects Map<CDOID, InternalCDORevision> oldRevisions = applyChangedObjects(changeSetData.getChangedObjects(), - ancestorProvider, targetProvider, keepVersions, resultData.getChangedObjects()); + targetBaseProvider, targetProvider, keepVersions, resultData.getChangedObjects()); // Delta notifications Collection<CDORevisionDelta> notificationDeltas = lastSavepoint.getRevisionDeltas2().values(); @@ -753,7 +764,7 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa } private Map<CDOID, InternalCDORevision> applyChangedObjects(List<CDORevisionKey> changedObjects, - CDORevisionProvider ancestorProvider, CDORevisionProvider targetProvider, boolean keepVersions, + CDORevisionProvider targetBaseProvider, CDORevisionProvider targetProvider, boolean keepVersions, List<CDORevisionKey> result) throws ChangeSetOutdatedException { Map<CDOID, InternalCDORevision> oldRevisions = CDOIDUtil.createMap(); @@ -764,10 +775,10 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa for (CDORevisionKey key : changedObjects) { - InternalCDORevisionDelta ancestorGoalDelta = (InternalCDORevisionDelta)key; - ancestorGoalDelta.setTarget(null); - CDOID id = ancestorGoalDelta.getID(); - InternalCDORevision ancestorRevision = (InternalCDORevision)ancestorProvider.getRevision(id); + InternalCDORevisionDelta targetBaseGoalDelta = (InternalCDORevisionDelta)key; + targetBaseGoalDelta.setTarget(null); + CDOID id = targetBaseGoalDelta.getID(); + InternalCDORevision targetBaseRevision = (InternalCDORevision)targetBaseProvider.getRevision(id); InternalCDOObject object = getObject(id); boolean revisionChanged = false; @@ -782,7 +793,7 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa oldRevisions.put(id, targetRevision); - InternalCDORevision goalRevision = ancestorRevision.copy(); + InternalCDORevision goalRevision = targetBaseRevision.copy(); goalRevision.setBranchPoint(this); if (!keepVersions) { @@ -790,14 +801,14 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa } goalRevision.setRevised(UNSPECIFIED_DATE); - ancestorGoalDelta.applyTo(goalRevision); + targetBaseGoalDelta.applyTo(goalRevision); InternalCDORevisionDelta targetGoalDelta = goalRevision.compare(targetRevision); targetGoalDelta.setTarget(null); if (!targetGoalDelta.isEmpty()) { - if (keepVersions && targetGoalDelta.getVersion() != ancestorRevision.getVersion()) + if (keepVersions && targetGoalDelta.getVersion() != targetBaseRevision.getVersion()) { throw new ChangeSetOutdatedException(); } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOSession.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOSession.java index 7794917985..e4a678b2f6 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOSession.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOSession.java @@ -319,6 +319,12 @@ public interface InternalCDOSession boolean computeChangeSets); /** + * @since 4.6 + */ + public MergeData getMergeData(CDOBranchPoint target, CDOBranchPoint source, CDOBranchPoint targetBase, + CDOBranchPoint sourceBase, boolean computeChangeSets); + + /** * @author Eike Stepper * @since 4.5 */ @@ -477,15 +483,15 @@ public interface InternalCDOSession private final CDOBranchPoint sourceBase; - private final CDOBranchPoint ancestor; + private final CDOBranchPoint targetBase; private final CDORevisionAvailabilityInfo targetInfo; private final CDORevisionAvailabilityInfo sourceInfo; - private final CDORevisionAvailabilityInfo baseInfo; + private final CDORevisionAvailabilityInfo sourceBaseInfo; - private final CDORevisionAvailabilityInfo ancestorInfo; + private final CDORevisionAvailabilityInfo targetBaseInfo; private final Set<CDOID> ids; @@ -493,19 +499,19 @@ public interface InternalCDOSession private final CDOChangeSet sourceChanges; - public MergeData(CDOBranchPoint target, CDOBranchPoint source, CDOBranchPoint sourceBase, CDOBranchPoint ancestor, + public MergeData(CDOBranchPoint target, CDOBranchPoint source, CDOBranchPoint sourceBase, CDOBranchPoint targetBase, CDORevisionAvailabilityInfo targetInfo, CDORevisionAvailabilityInfo sourceInfo, - CDORevisionAvailabilityInfo baseInfo, CDORevisionAvailabilityInfo ancestorInfo, Set<CDOID> ids, + CDORevisionAvailabilityInfo sourceBaseInfo, CDORevisionAvailabilityInfo targetBaseInfo, Set<CDOID> ids, CDOChangeSet targetChanges, CDOChangeSet sourceChanges) { this.target = target; this.source = source; this.sourceBase = sourceBase; - this.ancestor = ancestor; + this.targetBase = targetBase; this.targetInfo = targetInfo; this.sourceInfo = sourceInfo; - this.baseInfo = baseInfo; - this.ancestorInfo = ancestorInfo; + this.sourceBaseInfo = sourceBaseInfo; + this.targetBaseInfo = targetBaseInfo; this.ids = ids; this.targetChanges = targetChanges; this.sourceChanges = sourceChanges; @@ -526,9 +532,12 @@ public interface InternalCDOSession return sourceBase; } - public CDOBranchPoint getAncestor() + /** + * @since 4.6 + */ + public CDOBranchPoint getTargetBase() { - return ancestor; + return targetBase; } public CDORevisionAvailabilityInfo getTargetInfo() @@ -541,14 +550,20 @@ public interface InternalCDOSession return sourceInfo; } - public CDORevisionAvailabilityInfo getBaseInfo() + /** + * @since 4.6 + */ + public CDORevisionAvailabilityInfo getSourceBaseInfo() { - return baseInfo; + return sourceBaseInfo; } - public CDORevisionAvailabilityInfo getAncestorInfo() + /** + * @since 4.6 + */ + public CDORevisionAvailabilityInfo getTargetBaseInfo() { - return ancestorInfo; + return targetBaseInfo; } public Set<CDOID> getIDs() @@ -565,5 +580,32 @@ public interface InternalCDOSession { return sourceChanges; } + + /** + * @deprecated As of 4.6 use {@link #getTargetBase()}. + */ + @Deprecated + public CDOBranchPoint getAncestor() + { + return getTargetBase(); + } + + /** + * @deprecated As of 4.6 use {@link #getSourceBaseInfo()}. + */ + @Deprecated + public CDORevisionAvailabilityInfo getBaseInfo() + { + return getSourceBaseInfo(); + } + + /** + * @deprecated As of 4.6 use {@link #getTargetBaseInfo()}. + */ + @Deprecated + public CDORevisionAvailabilityInfo getAncestorInfo() + { + return getTargetBaseInfo(); + } } } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOTransaction.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOTransaction.java index 66741d1d59..f71a612328 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOTransaction.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOTransaction.java @@ -150,7 +150,7 @@ public interface InternalCDOTransaction extends CDOTransaction, InternalCDOUserT */ @Deprecated public Pair<CDOChangeSetData, Pair<Map<CDOID, CDOID>, List<CDOID>>> applyChangeSetData(CDOChangeSetData changeSetData, - CDORevisionProvider ancestorProvider, CDORevisionProvider targetProvider, CDOBranchPoint source); + CDORevisionProvider targetBaseProvider, CDORevisionProvider targetProvider, CDOBranchPoint source); /** * @param source @@ -159,9 +159,9 @@ public interface InternalCDOTransaction extends CDOTransaction, InternalCDOUserT * a {@link CDOBranch#isLocal() local} branch. * @since 4.1 */ - public ApplyChangeSetResult applyChangeSet(CDOChangeSetData changeSetData, CDORevisionProvider ancestorProvider, + public ApplyChangeSetResult applyChangeSet(CDOChangeSetData changeSetData, CDORevisionProvider targetBaseProvider, CDORevisionProvider targetProvider, CDOBranchPoint source, boolean keepVersions) - throws ChangeSetOutdatedException; + throws ChangeSetOutdatedException; /** * @since 4.0 |