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;
}
public void Test2() { // Test case 2 - merge with conflicting edits var rootNode1 = new Node("docId","data",0); rootNode1.addVersion("data1",1); rootNode1.addVersion("data2",2); //Console.WriteLine(rootNode1.toString()); var rootNode2 = new Node("docId2", "data",3); rootNode2.addVersion("data1",4); rootNode2.addVersion("rootnode2-data2",5); rootNode2.addVersion("rootnode2-data3",6); //Console.WriteLine(rootNode2.toString()); List<Node> conflicts = rootNode1.merge(rootNode2); Console.WriteLine(); Console.WriteLine("Conflicts"); Console.WriteLine("========="); foreach (Node node in conflicts) { Console.WriteLine(node.rev_id); } Console.WriteLine(); Console.WriteLine("Result"); Console.WriteLine("======"); //Console.WriteLine(rootNode1.toString()); Console.WriteLine(new[] { 1, 2, 3 }.ToJson()); Console.WriteLine(rootNode1.revision.ToJson<Dictionary<string, Node>>()); //Console.WriteLine(rootNode1.ToString()); }