private static XmlNode HandleOurChildNotPresent(XmlMerger merger, XmlNode ours, XmlNode ancestor, XmlNode theirChild, string pathToFileInRepository, XmlNode ancestorChild, MergeSituation mergeSituation, IElementDescriber mergeStrategyForChild) { if (theirChild == null) { // Both deleted it. merger.EventListener.ChangeOccurred(new XmlBothDeletionChangeReport(pathToFileInRepository, ancestorChild)); } else { if (XmlUtilities.AreXmlElementsEqual(ancestorChild, theirChild)) { // We deleted it. They did nothing. merger.EventListener.ChangeOccurred(new XmlDeletionChangeReport(pathToFileInRepository, ancestor, ancestorChild)); } else { // delete vs edit conflict. merger.ConflictOccurred(new RemovedVsEditedElementConflict(theirChild.Name, theirChild, null, ancestorChild, mergeSituation, mergeStrategyForChild, mergeSituation.BetaUserId)); ours.AppendChild(theirChild); } } return(ours); }
public static string DoMerge( MergeStrategies mergeStrategies, MergeSituation mergeSituation, string ancestorXml, string ourXml, string theirXml, IEnumerable <string> xpathQueriesThatMatchExactlyOneNode, IEnumerable <string> xpathQueriesThatReturnNull, int expectedConflictCount, List <Type> expectedConflictTypes, int expectedChangesCount, List <Type> expectedChangeTypes) { var doc = new XmlDocument(); var ourNode = XmlUtilities.GetDocumentNodeFromRawXml(ourXml, doc); var theirNode = XmlUtilities.GetDocumentNodeFromRawXml(theirXml, doc); var ancestorNode = XmlUtilities.GetDocumentNodeFromRawXml(ancestorXml, doc); var eventListener = new ListenerForUnitTests(); var merger = new XmlMerger(mergeSituation) { MergeStrategies = mergeStrategies }; var retval = merger.Merge(eventListener, ourNode, theirNode, ancestorNode).OuterXml; Assert.AreSame(eventListener, merger.EventListener); // Make sure it never changes it, while we aren't looking, since at least one Merge method does that very thing. CheckMergeResults(retval, eventListener, xpathQueriesThatMatchExactlyOneNode, xpathQueriesThatReturnNull, expectedConflictCount, expectedConflictTypes, expectedChangesCount, expectedChangeTypes); return(retval); }
private static XmlNode HandleOurChildNotPresent(XmlMerger merger, XmlNode ours, XmlNode ancestor, XmlNode theirChild, string pathToFileInRepository, XmlNode ancestorChild, MergeSituation mergeSituation, IElementDescriber mergeStrategyForChild) { if (theirChild == null) { // Both deleted it. merger.EventListener.ChangeOccurred(new XmlBothDeletionChangeReport(pathToFileInRepository, ancestorChild)); } else { if (XmlUtilities.AreXmlElementsEqual(ancestorChild, theirChild)) { // We deleted it. They did nothing. merger.EventListener.ChangeOccurred(new XmlDeletionChangeReport(pathToFileInRepository, ancestor, ancestorChild)); } else { // delete vs edit conflict. merger.ConflictOccurred(new RemovedVsEditedElementConflict(theirChild.Name, theirChild, null, ancestorChild, mergeSituation, mergeStrategyForChild, mergeSituation.BetaUserId)); // ReSharper disable once PossibleNullReferenceException -- if ours.OwnerDocument is null, we have other problems ours.AppendChild(ours.OwnerDocument.ImportNode(theirChild, true)); } } return(ours); }
/// <summary> /// Runs the service for a test case where we expect a successful deletion. /// Deletions only happen where no conflicts are expected, so we verify that. /// Currently we generate no change reports either. /// There might plausibly be a change report generated, probably XmlDeletionChangeReport, /// but we are in the process (at least Randy has started) phasing out change reports, so I didn't /// add one for this case. /// </summary> /// <param name="common"></param> /// <param name="ours"></param> /// <param name="theirs"></param> /// <param name="mergeSituation"></param> private static void RunServiceExpectingDeletion(string common, string ours, string theirs, MergeSituation mergeSituation) { XmlNode ancestorNode; ListenerForUnitTests listener; XmlNode result = RunServiceCore(common, ours, theirs, mergeSituation, out ancestorNode, out listener); Assert.That(result, Is.Null, "Deletion merge failed to delete"); listener.AssertExpectedConflictCount(0); listener.AssertExpectedChangesCount(0); }
/// <summary> /// Sets up everything necessary for a call out to the ChorusMerge executable /// </summary> /// <param name="targetHead"></param> /// <param name="sourceHead"></param> private void PrepareForMergeAttempt(Revision targetHead, Revision sourceHead) { //this is for posterity, on other people's machines, so use the hashes instead of local numbers MergeSituation.PushRevisionsToEnvironmentVariables(targetHead.UserId, targetHead.Number.Hash, sourceHead.UserId, sourceHead.Number.Hash); MergeOrder.PushToEnvironmentVariables(_localRepositoryPath); _progress.WriteMessage("Merging {0} and {1}...", targetHead.UserId, sourceHead.UserId); _progress.WriteVerbose(" Revisions {0}:{1} with {2}:{3}...", targetHead.Number.LocalRevisionNumber, targetHead.Number.Hash, sourceHead.Number.LocalRevisionNumber, sourceHead.Number.Hash); RemoveMergeObstacles(targetHead, sourceHead); }
private static XmlMerger GetMerger(MergeSituation mergeSituation, out ListenerForUnitTests listener) { var elementStrategy = new ElementStrategy(false) { IsAtomic = true }; var merger = new XmlMerger(mergeSituation); merger.MergeStrategies.SetStrategy("topatomic", elementStrategy); listener = new ListenerForUnitTests(); merger.EventListener = listener; return(merger); }
private int DoMerge(GroupOfConflictingLiftFiles group) { MergeSituation.PushRevisionsToEnvironmentVariables("bob", "-123", "sally", "-456"); MergeOrder.PushToEnvironmentVariables(group.Folder.Path); // Change error logging to standard out so that tests which simulate errors don't fail the build Program.ErrorWriter = Console.Out; try { return(Program.Main(new[] { group.BobFile.Path, group.AncestorFile.Path, group.SallyFile.Path })); } finally { Program.ErrorWriter = Console.Error; } }
private static XmlNode DoMerge( string ancestorXml, string ourXml, string theirXml, MergeSituation mergeSituation, IMergeEventListener listener, out XmlNode ours, out XmlNode theirs) { var merger = new XmlMerger(mergeSituation) { EventListener = listener }; XmlNode ancestor; XmlNode ourParent; XmlTestHelper.CreateThreeNodes(ourXml, theirXml, ancestorXml, out ours, out ourParent, out theirs, out ancestor); ImmutableElementMergeService.DoMerge(merger, ourParent, ref ours, theirs, ancestor); return(ours); }
private static XmlNode DoMerge( string ancestorXml, string ourXml, string theirXml, MergeSituation mergeSituation, IMergeEventListener listener, out XmlNode ours, out XmlNode theirs) { var merger = new XmlMerger(mergeSituation) { EventListener = listener }; ours = CreateNode(ourXml); theirs = CreateNode(theirXml); var ancestorNode = CreateNode(ancestorXml); ImmutableElementMergeService.DoMerge(merger, ref ours, theirs, ancestorNode); return(ours); }
private static XmlNode RunServiceCore(string common, string ours, string theirs, MergeSituation mergeSituation, out XmlNode returnAncestorNode, out ListenerForUnitTests listener) { XmlNode ourNode; XmlNode ourParent; XmlNode theirNode; XmlNode ancestorNode; XmlTestHelper.CreateThreeNodes(ours, theirs, common, out ourNode, out ourParent, out theirNode, out ancestorNode); returnAncestorNode = ancestorNode; var merger = GetMerger(mergeSituation, out listener); Assert.DoesNotThrow(() => MergeAtomicElementService.Run(merger, ourParent, ref ourNode, theirNode, ancestorNode)); return(ourNode); }
private static void RunService(string common, string ours, string theirs, MergeSituation mergeSituation, IEnumerable <string> xpathQueriesThatMatchExactlyOneNode, IEnumerable <string> xpathQueriesThatReturnNull, int expectedConflictCount, List <Type> expectedConflictTypes, int expectedChangesCount, List <Type> expectedChangeTypes) { XmlNode ancestorNode; ListenerForUnitTests listener; XmlNode result = RunServiceCore(common, ours, theirs, mergeSituation, out ancestorNode, out listener); var results = result == null ? ancestorNode.OuterXml : result.OuterXml; XmlTestHelper.CheckMergeResults(results, listener, xpathQueriesThatMatchExactlyOneNode, xpathQueriesThatReturnNull, expectedConflictCount, expectedConflictTypes, expectedChangesCount, expectedChangeTypes); }
public void RemovedVsEditedElementConflict_RoundtripThroughXml() { MergeSituation mergesituation = new MergeSituation("path", "x", "1", "y", "2", MergeOrder.ConflictHandlingModeChoices.TheyWin); var c = new RemovedVsEditedElementConflict("testElement", GetNodeFromString("<a>ours</a>"), GetNodeFromString("<a>theirs</a>"), GetNodeFromString("<a>ancestor</a>"), mergesituation, new ElementStrategy(false), "theWinner"); c.Context = new ContextDescriptor("testLabel", "testPath"); string desc = c.GetFullHumanReadableDescription(); var annotationXml = XmlTestHelper.WriteConflictAnnotation(c); var regurgitated = Conflict.CreateFromChorusNotesAnnotation(annotationXml); Assert.AreEqual("path", regurgitated.RelativeFilePath); Assert.AreEqual(desc, regurgitated.GetFullHumanReadableDescription()); Assert.AreEqual(c.Context.PathToUserUnderstandableElement, regurgitated.Context.PathToUserUnderstandableElement); Assert.AreEqual(c.Context.DataLabel, regurgitated.Context.DataLabel); }
public void BothEditedTextConflict_RoundtripThroughXml() { MergeSituation mergesituation = new MergeSituation("path", "x", "1", "y", "2", MergeOrder.ConflictHandlingModeChoices.TheyWin); var c = new BothEditedTextConflict( GetNodeFromString("<a>y</a>"), //NB: since "y" is the "alpha-dog" under "TheyWin" policy, it is the 1st parameter GetNodeFromString("<a>x</a>"), GetNodeFromString("<a>ancestor</a>"), mergesituation, "theWinner"); c.Context = new ContextDescriptor("testLabel", "testPath"); c.HtmlDetails = "<body>this is a conflict</body>"; string desc = c.GetFullHumanReadableDescription(); var annotationXml = XmlTestHelper.WriteConflictAnnotation(c); var regurgitated = Conflict.CreateFromChorusNotesAnnotation(annotationXml); Assert.AreEqual("path", regurgitated.RelativeFilePath); Assert.AreEqual(desc, regurgitated.GetFullHumanReadableDescription()); Assert.AreEqual(c.Context.PathToUserUnderstandableElement, regurgitated.Context.PathToUserUnderstandableElement); Assert.AreEqual(c.Context.DataLabel, regurgitated.Context.DataLabel); Assert.That(regurgitated.HtmlDetails, Is.EqualTo(c.HtmlDetails)); }
public void GetRecord_GoodRecordInfo_ReturnsRecord() { var docA = new XmlDocument(); docA.LoadXml(@"<doc><test id='2'>a</test></doc>"); var docX = new XmlDocument(); docX.LoadXml(@"<doc><test id='2'>x</test></doc>"); var docY = new XmlDocument(); docY.LoadXml(@"<doc><test id='2'>y</test></doc>"); var situation = new MergeSituation("ARelativePath", "x", "x1", "y", "y1", MergeOrder.ConflictHandlingModeChoices.WeWin); var conflict = new BothEditedTextConflict(docX.SelectSingleNode("doc/test"), docY.SelectSingleNode("doc/test"), docA.SelectSingleNode("doc/test"), situation, "theWinner"); conflict.Context = new ContextDescriptor("dummy", "//test[@id='2']"); var retriever = new DummyXmlRetriever(docA, docX, docY); var result = conflict.GetConflictingRecordOutOfSourceControl(retriever, ThreeWayMergeSources.Source.UserX); Assert.AreEqual("<test id=\"2\">x</test>", result); }
public void Main_Utf8FilePaths_FileNamesOk() { using (var e = new TemporaryFolder("ChorusMergeTest")) using (var p = new TemporaryFolder(e, "ไก่ projéct")) { var filePath1 = Path.Combine(p.Path, "aaa.chorusTest"); File.WriteAllText(filePath1, @"aaa"); var filePath2 = Path.Combine(e.Path, "aaa.chorusTest"); File.WriteAllText(filePath2, @"aaa"); var filePath3 = Path.Combine(e.Path, "aaa.chorusTest"); File.WriteAllText(filePath3, @"aaa"); var encoding = Encoding.GetEncoding(1252); string filePath1Cp1252 = encoding.GetString(Encoding.UTF8.GetBytes(filePath1)); string filePath2Cp1252 = encoding.GetString(Encoding.UTF8.GetBytes(filePath2)); string filePath3Cp1252 = encoding.GetString(Encoding.UTF8.GetBytes(filePath3)); MergeSituation.PushRevisionsToEnvironmentVariables("bob", "-123", "sally", "-456"); MergeOrder.PushToEnvironmentVariables(p.Path); var result = Program.Main(new[] { filePath1Cp1252, filePath2Cp1252, filePath3Cp1252 }); Assert.That(result, Is.EqualTo(0)); } }
public XmlMerger(MergeSituation mergeSituation) { MergeSituation = mergeSituation; EventListener = new NullMergeEventListener(); MergeStrategies = new MergeStrategies(); }
public void EnsureMergedCData_IsRetained() { using (var common = TempFile.WithFilename("common.ChorusNotes")) using (var ours = TempFile.WithFilename("ours.ChorusNotes")) using (var theirs = TempFile.WithFilename("theirs.ChorusNotes")) { const string commonData = @"<?xml version='1.0' encoding='utf-8'?> <notes version='0'> <annotation class='mergeConflict' ref='silfw://localhost/link?app=flex&database=current&server=&tool=default&guid=bab7776e-531b-4ce1-997f-fa638c09e381&tag=&label=Entry "pintu"' guid='1cb66d60-90d5-4367-95b1-b7b41eb8986d'> <message author='merger' status='open' guid='ef89b532-5441-48a8-aea9-065b6ab5cfbd' date='2012-07-20T14:18:35Z'>Entry 'pintu': user57@tpad2 deleted this element, while user57 edited it. The automated merger kept the change made by user57.<![CDATA[<conflict typeGuid='3d9ba4ac-4a25-11df-9879-0800200c9a66' class='Chorus.merge.xml.generic.EditedVsRemovedElementConflict' relativeFilePath='Linguistics\Lexicon\Lexicon.lexdb' type='Removed Vs Edited Element Conflict' guid='ef89b532-5441-48a8-aea9-065b6ab5cfbd' date='2012-07-20T14:18:35Z' whoWon='user57' htmlDetails='<head><style type='text/css'></style></head><body><div class='description'>Entry "pintu": user57@tpad2 deleted this element, while user57 edited it. The automated merger kept the change made by user57.</div><div class='alternative'>user57's changes: &lt;LexEntry guid="bab7776e-531b-4ce1-997f-fa638c09e381"><br/>&nbsp;&nbsp;&lt;DateCreated val="2012-7-20 13:46:3.625" /><br/>&nbsp;&nbsp;&lt;DateModified val="2012-7-20 <span style="text-decoration: line-through; color: red">13:46:3.625</span><span style="background: Yellow">14:14:20.218</span>" /><br/>&nbsp;&nbsp;&lt;DoNotUseForParsing val="False" /><br/>&nbsp;&nbsp;&lt;HomographNumber val="0" /><br/>&nbsp;&nbsp;&lt;LexemeForm><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;MoStemAllomorph guid="556f6e08-0fb2-4171-82e0-6dcdddf9490b"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Form><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;AUni ws="id">pintu&lt;/AUni><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Form><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;IsAbstract val="False" /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;MorphType><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;objsur guid="d7f713e8-e8cf-11d3-9764-00c04f186933" t="r" /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/MorphType><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/MoStemAllomorph><br/>&nbsp;&nbsp;&lt;/LexemeForm><br/>&nbsp;&nbsp;&lt;MorphoSyntaxAnalyses><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;MoStemMsa guid="f63e03f0-ac9d-4b1b-980f-316bbb741f70" /><br/>&nbsp;&nbsp;&lt;/MorphoSyntaxAnalyses><br/>&nbsp;&nbsp;&lt;Senses><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;ownseq class="LexSense" guid="dad069de-dfad-45f6-a5d2-449265adbc3a"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background: Yellow">&lt;Definition></span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background: Yellow">&lt;AStr</span> <span style="background: Yellow">ws="en"></span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background: Yellow">&lt;Run</span> <span style="background: Yellow">ws="en">a</span> <span style="background: Yellow">door</span><span style="background: Yellow">&lt;/Run></span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background: Yellow">&lt;/AStr></span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background: Yellow">&lt;/Definition></span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Gloss><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;AUni ws="en">door&lt;/AUni><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Gloss><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;MorphoSyntaxAnalysis><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;objsur guid="f63e03f0-ac9d-4b1b-980f-316bbb741f70" t="r" /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/MorphoSyntaxAnalysis><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ownseq><br/>&nbsp;&nbsp;&lt;/Senses><br/>&lt;/LexEntry></div><div class='alternative'>user57@tpad2's changes: &lt;LexEntry guid="bab7776e-531b-4ce1-997f-fa638c09e381"><br/>&nbsp;&nbsp;&lt;DateCreated val="2012-7-20 13:46:3.625" /><br/>&nbsp;&nbsp;&lt;DateModified val="2012-7-20 13:46:3.625" /><br/>&nbsp;&nbsp;&lt;DoNotUseForParsing val="False" /><br/>&nbsp;&nbsp;&lt;HomographNumber val="0" /><br/>&nbsp;&nbsp;&lt;LexemeForm><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;MoStemAllomorph guid="556f6e08-0fb2-4171-82e0-6dcdddf9490b"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Form><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;AUni ws="id">pintu&lt;/AUni><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Form><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;IsAbstract val="False" /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;MorphType><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;objsur guid="d7f713e8-e8cf-11d3-9764-00c04f186933" t="r" /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/MorphType><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/MoStemAllomorph><br/>&nbsp;&nbsp;&lt;/LexemeForm><br/>&nbsp;&nbsp;&lt;MorphoSyntaxAnalyses><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;MoStemMsa guid="f63e03f0-ac9d-4b1b-980f-316bbb741f70" /><br/>&nbsp;&nbsp;&lt;/MorphoSyntaxAnalyses><br/>&nbsp;&nbsp;&lt;Senses><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;ownseq class="LexSense" guid="dad069de-dfad-45f6-a5d2-449265adbc3a"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Gloss><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;AUni ws="en">door&lt;/AUni><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Gloss><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;MorphoSyntaxAnalysis><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;objsur guid="f63e03f0-ac9d-4b1b-980f-316bbb741f70" t="r" /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/MorphoSyntaxAnalysis><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ownseq><br/>&nbsp;&nbsp;&lt;/Senses><br/>&lt;/LexEntry></div><div class='mergechoice'>The merger kept the change made by user57</div></body>' contextPath='silfw://localhost/link?app=flex&database=current&server=&tool=default&guid=bab7776e-531b-4ce1-997f-fa638c09e381&tag=&label=Entry "pintu"' contextDataLabel='Entry "pintu"'> <MergeSituation alphaUserId='user57' betaUserId='user57@tpad2' alphaUserRevision='306520fcc148' betaUserRevision='5aa248710fbc' path='Linguistics\Lexicon\Lexicon.lexdb' conflictHandlingMode='WeWin' /> </conflict>]]></message> <message author='user57' status='closed' date='2012-07-20T22:49:03Z' guid='bf43783e-eca1-4b0f-bacd-6fe168d7d616'></message> </annotation> </notes>"; File.WriteAllText(common.Path, commonData); const string ourData = @"<?xml version='1.0' encoding='utf-8'?> <notes version='0'> <annotation class='mergeConflict' ref='silfw://localhost/link?app=flex&database=current&server=&tool=default&guid=bab7776e-531b-4ce1-997f-fa638c09e381&tag=&label=Entry "pintu"' guid='1cb66d60-90d5-4367-95b1-b7b41eb8986d'> <message author='merger' status='open' guid='ef89b532-5441-48a8-aea9-065b6ab5cfbd' date='2012-07-20T14:18:35Z'>Entry 'pintu': user57@tpad2 deleted this element, while user57 edited it. The automated merger kept the change made by user57.<![CDATA[<conflict typeGuid='3d9ba4ac-4a25-11df-9879-0800200c9a66' class='Chorus.merge.xml.generic.EditedVsRemovedElementConflict' relativeFilePath='Linguistics\Lexicon\Lexicon.lexdb' type='Removed Vs Edited Element Conflict' guid='ef89b532-5441-48a8-aea9-065b6ab5cfbd' date='2012-07-20T14:18:35Z' whoWon='user57' htmlDetails='<head><style type='text/css'></style></head><body><div class='description'>Entry "pintu": user57@tpad2 deleted this element, while user57 edited it. The automated merger kept the change made by user57.</div><div class='alternative'>user57's changes: &lt;LexEntry guid="bab7776e-531b-4ce1-997f-fa638c09e381"><br/>&nbsp;&nbsp;&lt;DateCreated val="2012-7-20 13:46:3.625" /><br/>&nbsp;&nbsp;&lt;DateModified val="2012-7-20 <span style="text-decoration: line-through; color: red">13:46:3.625</span><span style="background: Yellow">14:14:20.218</span>" /><br/>&nbsp;&nbsp;&lt;DoNotUseForParsing val="False" /><br/>&nbsp;&nbsp;&lt;HomographNumber val="0" /><br/>&nbsp;&nbsp;&lt;LexemeForm><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;MoStemAllomorph guid="556f6e08-0fb2-4171-82e0-6dcdddf9490b"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Form><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;AUni ws="id">pintu&lt;/AUni><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Form><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;IsAbstract val="False" /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;MorphType><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;objsur guid="d7f713e8-e8cf-11d3-9764-00c04f186933" t="r" /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/MorphType><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/MoStemAllomorph><br/>&nbsp;&nbsp;&lt;/LexemeForm><br/>&nbsp;&nbsp;&lt;MorphoSyntaxAnalyses><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;MoStemMsa guid="f63e03f0-ac9d-4b1b-980f-316bbb741f70" /><br/>&nbsp;&nbsp;&lt;/MorphoSyntaxAnalyses><br/>&nbsp;&nbsp;&lt;Senses><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;ownseq class="LexSense" guid="dad069de-dfad-45f6-a5d2-449265adbc3a"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background: Yellow">&lt;Definition></span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background: Yellow">&lt;AStr</span> <span style="background: Yellow">ws="en"></span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background: Yellow">&lt;Run</span> <span style="background: Yellow">ws="en">a</span> <span style="background: Yellow">door</span><span style="background: Yellow">&lt;/Run></span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background: Yellow">&lt;/AStr></span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background: Yellow">&lt;/Definition></span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Gloss><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;AUni ws="en">door&lt;/AUni><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Gloss><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;MorphoSyntaxAnalysis><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;objsur guid="f63e03f0-ac9d-4b1b-980f-316bbb741f70" t="r" /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/MorphoSyntaxAnalysis><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ownseq><br/>&nbsp;&nbsp;&lt;/Senses><br/>&lt;/LexEntry></div><div class='alternative'>user57@tpad2's changes: &lt;LexEntry guid="bab7776e-531b-4ce1-997f-fa638c09e381"><br/>&nbsp;&nbsp;&lt;DateCreated val="2012-7-20 13:46:3.625" /><br/>&nbsp;&nbsp;&lt;DateModified val="2012-7-20 13:46:3.625" /><br/>&nbsp;&nbsp;&lt;DoNotUseForParsing val="False" /><br/>&nbsp;&nbsp;&lt;HomographNumber val="0" /><br/>&nbsp;&nbsp;&lt;LexemeForm><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;MoStemAllomorph guid="556f6e08-0fb2-4171-82e0-6dcdddf9490b"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Form><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;AUni ws="id">pintu&lt;/AUni><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Form><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;IsAbstract val="False" /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;MorphType><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;objsur guid="d7f713e8-e8cf-11d3-9764-00c04f186933" t="r" /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/MorphType><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/MoStemAllomorph><br/>&nbsp;&nbsp;&lt;/LexemeForm><br/>&nbsp;&nbsp;&lt;MorphoSyntaxAnalyses><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;MoStemMsa guid="f63e03f0-ac9d-4b1b-980f-316bbb741f70" /><br/>&nbsp;&nbsp;&lt;/MorphoSyntaxAnalyses><br/>&nbsp;&nbsp;&lt;Senses><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;ownseq class="LexSense" guid="dad069de-dfad-45f6-a5d2-449265adbc3a"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Gloss><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;AUni ws="en">door&lt;/AUni><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Gloss><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;MorphoSyntaxAnalysis><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;objsur guid="f63e03f0-ac9d-4b1b-980f-316bbb741f70" t="r" /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/MorphoSyntaxAnalysis><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ownseq><br/>&nbsp;&nbsp;&lt;/Senses><br/>&lt;/LexEntry></div><div class='mergechoice'>The merger kept the change made by user57</div></body>' contextPath='silfw://localhost/link?app=flex&database=current&server=&tool=default&guid=bab7776e-531b-4ce1-997f-fa638c09e381&tag=&label=Entry "pintu"' contextDataLabel='Entry "pintu"'> <MergeSituation alphaUserId='user57' betaUserId='user57@tpad2' alphaUserRevision='306520fcc148' betaUserRevision='5aa248710fbc' path='Linguistics\Lexicon\Lexicon.lexdb' conflictHandlingMode='WeWin' /> </conflict>]]></message> <message author='user57' status='closed' date='2012-07-20T22:49:03Z' guid='bf43783e-eca1-4b0f-bacd-6fe168d7d616'></message> <message author='user57' status='open' date='2012-07-20T23:11:24Z' guid='524786f4-8e27-4ebf-b7ea-02846723c2d8'>Chorus seems to have chosen the better gloss anyway.</message> </annotation> </notes>"; File.WriteAllText(ours.Path, ourData); const string theirData = @"<?xml version='1.0' encoding='utf-8'?> <notes version='0'> <annotation class='mergeConflict' ref='silfw://localhost/link?app=flex&database=current&server=&tool=default&guid=bab7776e-531b-4ce1-997f-fa638c09e381&tag=&label=Entry "pintu"' guid='1cb66d60-90d5-4367-95b1-b7b41eb8986d'> <message author='merger' status='open' guid='ef89b532-5441-48a8-aea9-065b6ab5cfbd' date='2012-07-20T14:18:35Z'>Entry 'pintu': user57@tpad2 deleted this element, while user57 edited it. The automated merger kept the change made by user57.<![CDATA[<conflict typeGuid='3d9ba4ac-4a25-11df-9879-0800200c9a66' class='Chorus.merge.xml.generic.EditedVsRemovedElementConflict' relativeFilePath='Linguistics\Lexicon\Lexicon.lexdb' type='Removed Vs Edited Element Conflict' guid='ef89b532-5441-48a8-aea9-065b6ab5cfbd' date='2012-07-20T14:18:35Z' whoWon='user57' htmlDetails='<head><style type='text/css'></style></head><body><div class='description'>Entry "pintu": user57@tpad2 deleted this element, while user57 edited it. The automated merger kept the change made by user57.</div><div class='alternative'>user57's changes: &lt;LexEntry guid="bab7776e-531b-4ce1-997f-fa638c09e381"><br/>&nbsp;&nbsp;&lt;DateCreated val="2012-7-20 13:46:3.625" /><br/>&nbsp;&nbsp;&lt;DateModified val="2012-7-20 <span style="text-decoration: line-through; color: red">13:46:3.625</span><span style="background: Yellow">14:14:20.218</span>" /><br/>&nbsp;&nbsp;&lt;DoNotUseForParsing val="False" /><br/>&nbsp;&nbsp;&lt;HomographNumber val="0" /><br/>&nbsp;&nbsp;&lt;LexemeForm><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;MoStemAllomorph guid="556f6e08-0fb2-4171-82e0-6dcdddf9490b"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Form><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;AUni ws="id">pintu&lt;/AUni><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Form><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;IsAbstract val="False" /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;MorphType><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;objsur guid="d7f713e8-e8cf-11d3-9764-00c04f186933" t="r" /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/MorphType><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/MoStemAllomorph><br/>&nbsp;&nbsp;&lt;/LexemeForm><br/>&nbsp;&nbsp;&lt;MorphoSyntaxAnalyses><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;MoStemMsa guid="f63e03f0-ac9d-4b1b-980f-316bbb741f70" /><br/>&nbsp;&nbsp;&lt;/MorphoSyntaxAnalyses><br/>&nbsp;&nbsp;&lt;Senses><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;ownseq class="LexSense" guid="dad069de-dfad-45f6-a5d2-449265adbc3a"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background: Yellow">&lt;Definition></span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background: Yellow">&lt;AStr</span> <span style="background: Yellow">ws="en"></span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background: Yellow">&lt;Run</span> <span style="background: Yellow">ws="en">a</span> <span style="background: Yellow">door</span><span style="background: Yellow">&lt;/Run></span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background: Yellow">&lt;/AStr></span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background: Yellow">&lt;/Definition></span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Gloss><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;AUni ws="en">door&lt;/AUni><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Gloss><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;MorphoSyntaxAnalysis><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;objsur guid="f63e03f0-ac9d-4b1b-980f-316bbb741f70" t="r" /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/MorphoSyntaxAnalysis><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ownseq><br/>&nbsp;&nbsp;&lt;/Senses><br/>&lt;/LexEntry></div><div class='alternative'>user57@tpad2's changes: &lt;LexEntry guid="bab7776e-531b-4ce1-997f-fa638c09e381"><br/>&nbsp;&nbsp;&lt;DateCreated val="2012-7-20 13:46:3.625" /><br/>&nbsp;&nbsp;&lt;DateModified val="2012-7-20 13:46:3.625" /><br/>&nbsp;&nbsp;&lt;DoNotUseForParsing val="False" /><br/>&nbsp;&nbsp;&lt;HomographNumber val="0" /><br/>&nbsp;&nbsp;&lt;LexemeForm><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;MoStemAllomorph guid="556f6e08-0fb2-4171-82e0-6dcdddf9490b"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Form><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;AUni ws="id">pintu&lt;/AUni><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Form><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;IsAbstract val="False" /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;MorphType><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;objsur guid="d7f713e8-e8cf-11d3-9764-00c04f186933" t="r" /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/MorphType><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/MoStemAllomorph><br/>&nbsp;&nbsp;&lt;/LexemeForm><br/>&nbsp;&nbsp;&lt;MorphoSyntaxAnalyses><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;MoStemMsa guid="f63e03f0-ac9d-4b1b-980f-316bbb741f70" /><br/>&nbsp;&nbsp;&lt;/MorphoSyntaxAnalyses><br/>&nbsp;&nbsp;&lt;Senses><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;ownseq class="LexSense" guid="dad069de-dfad-45f6-a5d2-449265adbc3a"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Gloss><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;AUni ws="en">door&lt;/AUni><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Gloss><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;MorphoSyntaxAnalysis><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;objsur guid="f63e03f0-ac9d-4b1b-980f-316bbb741f70" t="r" /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/MorphoSyntaxAnalysis><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ownseq><br/>&nbsp;&nbsp;&lt;/Senses><br/>&lt;/LexEntry></div><div class='mergechoice'>The merger kept the change made by user57</div></body>' contextPath='silfw://localhost/link?app=flex&database=current&server=&tool=default&guid=bab7776e-531b-4ce1-997f-fa638c09e381&tag=&label=Entry "pintu"' contextDataLabel='Entry "pintu"'> <MergeSituation alphaUserId='user57' betaUserId='user57@tpad2' alphaUserRevision='306520fcc148' betaUserRevision='5aa248710fbc' path='Linguistics\Lexicon\Lexicon.lexdb' conflictHandlingMode='WeWin' /> </conflict>]]></message> <message author='user57' status='closed' date='2012-07-20T22:49:03Z' guid='bf43783e-eca1-4b0f-bacd-6fe168d7d616'></message> <message author='user57' status='closed' date='2012-07-20T23:11:27Z' guid='a0481907-3fff-45a2-bb1c-961c3198c86a'></message> </annotation> </notes>"; File.WriteAllText(theirs.Path, theirData); // Do it the new way. _chorusNotesFileHandler.Do3WayMerge(new MergeOrder(ours.Path, common.Path, theirs.Path, new NullMergeSituation())); var newWayResult = File.ReadAllText(ours.Path); CheckResults(false, ourData, newWayResult); // Do it the old way via XmlMerge. var mergeSit = new MergeSituation(ours.Path, "Me", "8", "You", "9", MergeOrder.ConflictHandlingModeChoices.WeWin); var merger = new XmlMerger(mergeSit); var listener = new ListenerForUnitTests(); merger.MergeStrategies.SetStrategy("annotation", ElementStrategy.CreateForKeyedElement("guid", false)); var messageStrategy = ElementStrategy.CreateForKeyedElement("guid", false); messageStrategy.IsImmutable = true; merger.MergeStrategies.SetStrategy("message", messageStrategy); merger.EventListener = listener; var ourDataNode = XmlUtilities.GetDocumentNodeFromRawXml(ourData.Replace("<?xml version='1.0' encoding='utf-8'?>", null).Trim(), new XmlDocument()); var mergeResult = merger.Merge( ourDataNode.ParentNode, ourDataNode, XmlUtilities.GetDocumentNodeFromRawXml(theirData.Replace("<?xml version='1.0' encoding='utf-8'?>", null).Trim(), new XmlDocument()), XmlUtilities.GetDocumentNodeFromRawXml(commonData.Replace("<?xml version='1.0' encoding='utf-8'?>", null).Trim(), new XmlDocument())); var oldWayResult = mergeResult.MergedNode.OuterXml; CheckResults(false, ourData, oldWayResult); // Compare old and new results. CheckResults(true, newWayResult, oldWayResult); using (var log = new ChorusNotesMergeEventListener(ours.Path)) { // The purpose here is to make sure that the listener works correctly regarding maintaining CData. // I (RandyR) saw a merged data set where the CData material was not maintained. } var result = File.ReadAllText(ours.Path); CheckResults(true, newWayResult, result); var doc = new XmlDocument(); doc.Load(ours.Path); // This is how the AnnotationRepository class writes out an updated ChorusNotes file. using (var writer = XmlWriter.Create(ours.Path, CanonicalXmlSettings.CreateXmlWriterSettings())) { doc.Save(writer); } CheckResults(true, result, File.ReadAllText(ours.Path)); } }
private static XmlNode HandleOurChildNotPresent(XmlMerger merger, XmlNode ours, XmlNode ancestor, XmlNode theirChild, string pathToFileInRepository, XmlNode ancestorChild, MergeSituation mergeSituation, IElementDescriber mergeStrategyForChild) { if (theirChild == null) { // Both deleted it. merger.EventListener.ChangeOccurred(new XmlBothDeletionChangeReport(pathToFileInRepository, ancestorChild)); } else { if (XmlUtilities.AreXmlElementsEqual(ancestorChild, theirChild)) { // We deleted it. They did nothing. merger.EventListener.ChangeOccurred(new XmlDeletionChangeReport(pathToFileInRepository, ancestor, ancestorChild)); } else { // delete vs edit conflict. merger.ConflictOccurred(new RemovedVsEditedElementConflict(theirChild.Name, theirChild, null, ancestorChild, mergeSituation, mergeStrategyForChild, mergeSituation.BetaUserId)); ours.AppendChild(theirChild); } } return ours; }
private int DoMerge(GroupOfConflictingLiftFiles group) { MergeSituation.PushRevisionsToEnvironmentVariables("bob", "-123", "sally", "-456"); MergeOrder.PushToEnvironmentVariables(group.Folder.Path); return(Program.Main(new[] { group.BobFile.Path, group.AncestorFile.Path, group.SallyFile.Path })); }
private static XmlNode HandleTheirChildNotPresent(XmlMerger merger, XmlNode ours, XmlNode ancestor, XmlNode ancestorChild, XmlNode ourChild, MergeSituation mergeSituation, IElementDescriber mergeStrategyForChild, string pathToFileInRepository) { if (XmlUtilities.AreXmlElementsEqual(ancestorChild, ourChild)) { // They deleted it. We did nothing. merger.EventListener.ChangeOccurred(new XmlDeletionChangeReport(pathToFileInRepository, ancestor, ancestorChild)); } else { // edit vs delete conflict. merger.ConflictOccurred(new EditedVsRemovedElementConflict(ourChild.Name, ourChild, null, ancestorChild, mergeSituation, mergeStrategyForChild, mergeSituation.AlphaUserId)); } return ours; }
public DemoConflict(MergeSituation situation) : base(situation) { }
public DemoConflict(MergeSituation situation, string whoWon) : base(situation, whoWon) { }
private static XmlNode HandleTheirChildNotPresent(XmlMerger merger, XmlNode ours, XmlNode ancestor, XmlNode ancestorChild, XmlNode ourChild, MergeSituation mergeSituation, IElementDescriber mergeStrategyForChild, string pathToFileInRepository) { if (XmlUtilities.AreXmlElementsEqual(ancestorChild, ourChild)) { // They deleted it. We did nothing. merger.EventListener.ChangeOccurred(new XmlDeletionChangeReport(pathToFileInRepository, ancestor, ancestorChild)); } else { // edit vs delete conflict. merger.ConflictOccurred(new EditedVsRemovedElementConflict(ourChild.Name, ourChild, null, ancestorChild, mergeSituation, mergeStrategyForChild, mergeSituation.AlphaUserId)); } return(ours); }