// Merge this revision tree with the one passed in as rootNode
// This implementation overwrites local nodes with the supplied version
public List <Node> merge(Node rootNode)
{
List <Node> conflicts = new List <Node>();
bool finished = false;
int currentVersion = 1;
Console.WriteLine("Starting merge: ");
do
{
Console.WriteLine("Merge version: " + Convert.ToString(currentVersion));
Node node = rootNode.getVersion(Convert.ToString(currentVersion));
if (node == null)
{
Console.WriteLine("Merge complete..");
finished = true;
}
else
{
if (revision.ContainsKey(Convert.ToString(currentVersion)))
{
Console.WriteLine("Target contains same version as source ...");
Console.WriteLine("Source contains: " + revision[Convert.ToString(currentVersion)].rev_id);
Console.WriteLine("Target contains: " + node.rev_id);
if (revision[Convert.ToString(currentVersion)].rev_id != node.rev_id)
{
// Conflict - two version of the same value exist
Console.WriteLine("Conflict detected: " + node.rev_id);
// work out which has the longer tail - this will take priority
conflicts.Add(node);
}
}
else
{
// Version does not exist - add the whole subtree (potentially)
Console.WriteLine("New version being added: " + node.rev_id);
this.addVersion(Convert.ToString(currentVersion - 1), node);
}
}
currentVersion++;
} while (!finished);
return(conflicts);
}