VOL-1174: Ported transaction support to go data model

Change-Id: I4cabefac36c95f690aa121c71f36b6aaf41180b0
diff --git a/db/model/merge.go b/db/model/merge.go
index 97257b4..ef490d8 100644
--- a/db/model/merge.go
+++ b/db/model/merge.go
@@ -76,7 +76,7 @@
 		}
 	}
 	for v, _ := range changes.KeyMap1 {
-		if _, ok := changes.KeyMap2[v]; ok && lst1[changes.KeyMap1[v]].GetHash() != lst1[changes.KeyMap2[v]].GetHash() {
+		if _, ok := changes.KeyMap2[v]; ok && lst1[changes.KeyMap1[v]].GetHash() != lst2[changes.KeyMap2[v]].GetHash() {
 			changes.ChangedKeys[v] = struct{}{}
 		}
 	}
@@ -100,7 +100,7 @@
 		configChanged = true
 	}
 
-	newChildren := reflect.ValueOf(dstRev.GetChildren()).Elem().Interface().(map[string][]Revision)
+	newChildren := reflect.ValueOf(dstRev.GetChildren()).Interface().(map[string][]Revision)
 	childrenFields := ChildrenFields(forkRev.GetData())
 
 	for fieldName, field := range childrenFields {
@@ -108,7 +108,7 @@
 		srcList := srcRev.GetChildren()[fieldName]
 		dstList := dstRev.GetChildren()[fieldName]
 
-		if revisionsAreEqual(forkList, srcList) {
+		if revisionsAreEqual(dstList, srcList) {
 			for _, rev := range srcList {
 				mergeChildFunc(rev)
 			}
@@ -126,7 +126,7 @@
 					if field.IsContainer {
 						changes = append(
 							changes, ChangeTuple{POST_LISTCHANGE,
-							NewOperationContext("", nil, fieldName, "")},
+								NewOperationContext("", nil, fieldName, "")},
 						)
 					}
 				}
@@ -139,23 +139,30 @@
 			if revisionsAreEqual(dstList, forkList) {
 				src := newChangeAnalysis(forkList, srcList, field.Key)
 
-				newList := reflect.ValueOf(srcList).Elem().Interface().([]Revision)
+				newList := reflect.ValueOf(srcList).Interface().([]Revision)
 
 				for key, _ := range src.AddedKeys {
-					idx := src.KeyMap1[key]
+					idx := src.KeyMap2[key]
 					newRev := mergeChildFunc(newList[idx])
-					newList[idx] = newRev
 
-					changes = append(changes, ChangeTuple{POST_ADD,newRev.GetData()})
+					// FIXME: newRev may come back as nil... exclude those entries for now
+					if newRev != nil {
+						newList[idx] = newRev
+						changes = append(changes, ChangeTuple{POST_ADD, newRev.GetData()})
+					}
 				}
 				for key, _ := range src.RemovedKeys {
 					oldRev := forkList[src.KeyMap1[key]]
-					changes = append(changes, ChangeTuple{POST_REMOVE,oldRev.GetData()})
+					changes = append(changes, ChangeTuple{POST_REMOVE, oldRev.GetData()})
 				}
 				for key, _ := range src.ChangedKeys {
 					idx := src.KeyMap2[key]
 					newRev := mergeChildFunc(newList[idx])
-					newList[idx] = newRev
+
+					// FIXME: newRev may come back as nil... exclude those entries for now
+					if newRev != nil {
+						newList[idx] = newRev
+					}
 				}
 
 				newChildren[fieldName] = newList
@@ -163,7 +170,7 @@
 				src := newChangeAnalysis(forkList, srcList, field.Key)
 				dst := newChangeAnalysis(forkList, dstList, field.Key)
 
-				newList := reflect.ValueOf(dstList).Elem().Interface().([]Revision)
+				newList := reflect.ValueOf(dstList).Interface().([]Revision)
 
 				for key, _ := range src.AddedKeys {
 					if _, exists := dst.AddedKeys[key]; exists {
@@ -177,7 +184,7 @@
 					} else {
 						newRev := mergeChildFunc(srcList[src.KeyMap2[key]])
 						newList = append(newList, newRev)
-						changes = append(changes, ChangeTuple{POST_ADD,newRev.GetData()})
+						changes = append(changes, ChangeTuple{POST_ADD, newRev.GetData()})
 					}
 				}
 				for key, _ := range src.ChangedKeys {
@@ -213,7 +220,7 @@
 						newList[len(newList)-1] = nil
 						newList = newList[:len(newList)-1]
 
-						changes = append(changes, ChangeTuple{POST_REMOVE,oldRev.GetData()})
+						changes = append(changes, ChangeTuple{POST_REMOVE, oldRev.GetData()})
 					}
 				}
 
@@ -233,10 +240,11 @@
 		rev = rev.UpdateAllChildren(newChildren, dstRev.GetBranch())
 
 		if configChanged {
-			changes = append(changes, ChangeTuple{POST_UPDATE,rev.GetData()})
+			changes = append(changes, ChangeTuple{POST_UPDATE, rev.GetData()})
 		}
 		return rev, changes
-	}
+	} else {
+		return nil, nil
 
-	return nil, nil
+	}
 }