Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephan Seifermann2016-09-25 08:21:19 +0000
committerEike Stepper2016-09-25 08:23:04 +0000
commitca3dc4959d1439c96e85a1d1c64c8debd8480686 (patch)
treec6e852b67e982284fcc9f178fa26ce227010e6e9 /plugins/org.eclipse.emf.cdo/src
parentb94d1f1df2e55062401a1dbe39a26c80e34c0ede (diff)
downloadcdo-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')
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java9
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOTransaction.java6
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java48
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java39
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOSession.java70
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOTransaction.java6
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

Back to the top