remove/restore of child vertices when switching mine/theirs

This commit is contained in:
Bryan Housel
2015-02-21 00:02:46 -05:00
parent 0730e0432b
commit 72e5c3dce1
+41 -23
View File
@@ -6,25 +6,6 @@ iD.actions.MergeRemoteChanges = function(id, localGraph, remoteGraph, formatUser
return _.isFunction(formatUser) ? formatUser(d) : d;
}
function mergeChildNodes(target, children, replacements) {
var ccount = conflicts.length;
for (var i = 0; i < children.length; i++) {
var localNode = children[i],
remoteNode = remoteGraph.hasEntity(localNode.id);
if (!remoteNode) continue;
var targetNode = iD.Entity(localNode, { version: remoteNode.version });
targetNode = mergeLocation(remoteNode, targetNode);
if (conflicts.length !== ccount) break;
replacements.push(targetNode);
}
return target;
}
function mergeLocation(remote, target) {
function pointEqual(a, b) {
@@ -82,6 +63,40 @@ iD.actions.MergeRemoteChanges = function(id, localGraph, remoteGraph, formatUser
}
function mergeChildNodes(target, children, updates, graph) {
var ccount = conflicts.length;
for (var i = 0; i < children.length; i++) {
var id = children[i],
node = graph.hasEntity(id);
// remove unwanted.
if (target.nodes.indexOf(id) === -1) {
if (node && !node.hasInterestingTags()) updates.removeIds.push(id);
continue;
}
var localNode = localGraph.hasEntity(id),
remoteNode = remoteGraph.hasEntity(id);
// restore wanted..
if (remoteNode && option === 'force_remote') {
updates.replacements.push(remoteNode);
} else if (localNode && option === 'force_local') {
updates.replacements.push(localNode);
} else if (localNode && remoteNode) {
var targetNode = iD.Entity(localNode, { version: remoteNode.version });
targetNode = mergeLocation(remoteNode, targetNode);
if (conflicts.length !== ccount) break;
updates.replacements.push(targetNode);
}
}
return target;
}
function mergeMembers(remote, target) {
if (option === 'force_local' || _.isEqual(target.members, remote.members)) {
return target;
@@ -147,15 +162,15 @@ iD.actions.MergeRemoteChanges = function(id, localGraph, remoteGraph, formatUser
local = localGraph.entity(id),
remote = remoteGraph.entity(id),
target = iD.Entity(local, { version: remote.version }),
replacements = [];
updates = { replacements: [], removeIds: [] };
if (target.type === 'node') {
target = mergeLocation(remote, target);
} else if (target.type === 'way') {
// pull in any child nodes that may not be present locally..
graph.rebase(remoteGraph.childNodes(remote), [graph], false);
target = mergeChildNodes(target, graph.childNodes(local), replacements);
target = mergeNodes(base, remote, target);
target = mergeChildNodes(target, _.union(local.nodes, remote.nodes), updates, graph);
} else if (target.type === 'relation') {
target = mergeMembers(remote, target);
}
@@ -164,8 +179,11 @@ iD.actions.MergeRemoteChanges = function(id, localGraph, remoteGraph, formatUser
if (!conflicts.length) {
graph = graph.replace(target);
for (var i = 0; i < replacements.length; i++) {
graph = graph.replace(replacements[i]);
for (var i = 0; i < updates.replacements.length; i++) {
graph = graph.replace(updates.replacements[i]);
}
if (updates.removeIds.length) {
graph = iD.actions.DeleteMultiple(updates.removeIds)(graph);
}
}