From 72e5c3dce167ba413764ae6c3f50993f6469d694 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 21 Feb 2015 00:02:46 -0500 Subject: [PATCH] remove/restore of child vertices when switching mine/theirs --- js/id/actions/merge_remote_changes.js | 64 +++++++++++++++++---------- 1 file changed, 41 insertions(+), 23 deletions(-) diff --git a/js/id/actions/merge_remote_changes.js b/js/id/actions/merge_remote_changes.js index b6e72f362..c954fc59e 100644 --- a/js/id/actions/merge_remote_changes.js +++ b/js/id/actions/merge_remote_changes.js @@ -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); } }