// // public void WriteXml(XmlWriter writer) // { // writer.WriteStartElement("MergeSituation"); // writer.WriteAttributeString("PathToFileInRepository",this.PathToFileInRepository); // writer.WriteEndElement(); // } public static MergeSituation FromXml(XmlNode node) { var modeLabel = node.GetOptionalStringAttribute("conflictHandlingMode", string.Empty); MergeOrder.ConflictHandlingModeChoices mode; try { mode = (MergeOrder.ConflictHandlingModeChoices) Enum.Parse(typeof(MergeOrder.ConflictHandlingModeChoices), modeLabel); } catch (Exception) { mode = MergeOrder.ConflictHandlingModeChoices.Unknown; } //Note, we can't use the normal construtor, because it switches who is alpha/beta //depending on the conflict handling mode. We don't want to switch them again //when we're re-constituting the situation var situation = new MergeSituation(node.GetStringAttribute("path"), mode); situation.AlphaUserId = node.GetStringAttribute("alphaUserId"); situation.AlphaUserRevision = node.GetStringAttribute("alphaUserRevision"); situation.BetaUserId = node.GetStringAttribute("betaUserId"); situation.BetaUserRevision = node.GetStringAttribute("betaUserRevision"); return(situation); }
public static MergeOrder CreateUsingEnvironmentVariables(string pathToOurs, string pathToCommon, string pathToTheirs) { string pathToRepository = Environment.GetEnvironmentVariable(MergeOrder.kPathToRepository); string pathInRepository = pathToOurs.Replace(pathToRepository, "").Trim(new[] { Path.DirectorySeparatorChar }); //REVIEW return(new MergeOrder(pathToOurs, pathToCommon, pathToTheirs, MergeSituation.CreateFromEnvironmentVariables(pathInRepository))); }
public MergeOrder( string pathToOurs, string pathToCommon, string pathToTheirs, MergeSituation situation) { this.pathToOurs = pathToOurs; this.pathToTheirs = pathToTheirs; MergeSituation = situation; pathToCommonAncestor = pathToCommon; // ConflictHandlingMode = mode; EventListener = new NullMergeEventListener();//client can put something useful in if it needs one }
public MergeOrder(string pathToOurs, string pathToCommon, string pathToTheirs, MergeSituation situation) { this.pathToOurs = pathToOurs; this.pathToTheirs = pathToTheirs; MergeSituation = situation; pathToCommonAncestor = pathToCommon; // ConflictHandlingMode = mode; EventListener = new NullMergeEventListener(); //client can put something useful in if it needs one }
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 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 WriteXml(XmlWriter writer) // { // writer.WriteStartElement("MergeSituation"); // writer.WriteAttributeString("PathToFileInRepository",this.PathToFileInRepository); // writer.WriteEndElement(); // } public static MergeSituation FromXml(XmlNode node) { var modeLabel = node.GetOptionalStringAttribute("conflictHandlingMode", string.Empty); MergeOrder.ConflictHandlingModeChoices mode; try { mode = (MergeOrder.ConflictHandlingModeChoices) Enum.Parse(typeof (MergeOrder.ConflictHandlingModeChoices), modeLabel); } catch (Exception) { mode = MergeOrder.ConflictHandlingModeChoices.Unknown; } //Note, we can't use the normal construtor, because it switches who is alpha/beta //depending on the conflict handling mode. We don't want to switch them again //when we're re-constituting the situation var situation = new MergeSituation(node.GetStringAttribute("path"), mode); situation.AlphaUserId = node.GetStringAttribute("alphaUserId"); situation.AlphaUserRevision = node.GetStringAttribute("alphaUserRevision"); situation.BetaUserId = node.GetStringAttribute("betaUserId"); situation.BetaUserRevision = node.GetStringAttribute("betaUserRevision"); return situation; }
public void DefaultHtmlDetails_UsesClientHtmlGenerator() { string ancestor = @"<a key='one'> <b key='one'> <c key='two'>data</c> </b> </a>"; string red = @"<a key='one'> <b key='one'> <c key='two'>change1</c> </b> </a>"; string blue = @"<a key='one'> <b key='one'> <c key='two'>change2</c> </b> </a>"; // blue wins ChangeAndConflictAccumulator r = CheckOneWay(blue, red, ancestor, "a/b[@key='one']/c[@key='two' and text()='change2']"); Assert.AreEqual(typeof(XmlTextBothEditedTextConflict), r.Conflicts[0].GetType()); // red wins var mergeSituation = new MergeSituation("somepath", "red", "some rev", "blue", "another rev", MergeOrder.ConflictHandlingModeChoices.WeWin); var specialStrategies = new Dictionary<string, ElementStrategy>(); var strategy = ElementStrategy.CreateForKeyedElement("key", true); strategy.ContextDescriptorGenerator = new MockContextGenerator2(); specialStrategies.Add("c", strategy); r = CheckOneWay(red, blue, ancestor, mergeSituation, specialStrategies, "a/b[@key='one']/c[@key='two' and text()='change1']"); Assert.AreEqual(typeof(XmlTextBothEditedTextConflict), r.Conflicts[0].GetType()); var c = r.Conflicts[0]; Assert.That(c.HtmlDetails.StartsWith("<head><style type='text/css'>div.myStyle {margin-left: 0.2in}</style>")); Assert.That(c.HtmlDetails, Contains.Substring(c.GetFullHumanReadableDescription())); var ancestorHml = "<div class='test'>" + XmlUtilities.GetXmlForShowingInHtml("<c key='two'>data</c>") + "</div>"; // For now decided that with diffs we don't need the ancestor //Assert.That(c.HtmlDetails, Contains.Substring(ancestorHml)); Assert.That(c.HtmlDetails.EndsWith("</body>")); var oursHtml = "<div class='test'>" + XmlUtilities.GetXmlForShowingInHtml("<c key='two'>change1</c>") + "</div>"; var m = new Rainbow.HtmlDiffEngine.Merger(ancestorHml, oursHtml); Assert.That(c.HtmlDetails, Contains.Substring(m.merge())); var theirsHtml = "<div class='test'>" + XmlUtilities.GetXmlForShowingInHtml("<c key='two'>change2</c>") + "</div>"; m = new Rainbow.HtmlDiffEngine.Merger(ancestorHml, theirsHtml); Assert.That(c.HtmlDetails, Contains.Substring(m.merge())); Assert.That(c.HtmlDetails, Contains.Substring("kept the change made by red")); AssertDivsMatch(c.HtmlDetails); }
public void DefaultHtmlDetails_ReportsOneDeleted() { string ancestor = @"<a key='one'> <b key='one'> <c key='two'>data</c> </b> </a>"; string red = @"<a key='one'> <b key='one'> <c key='two'>change1</c> </b> </a>"; string blue = @"<a key='one'> </a>"; // blue would normally win, but this is a delete vs edit. ChangeAndConflictAccumulator r = CheckOneWay(blue, red, ancestor, "a[@key='one']/b[@key='one']/c[@key='two' and text()='change1']"); Assert.AreEqual(typeof(RemovedVsEditedElementConflict), r.Conflicts[0].GetType()); // red wins var mergeSituation = new MergeSituation("somepath", "red", "some rev", "blue", "another rev", MergeOrder.ConflictHandlingModeChoices.WeWin); r = CheckOneWay(red, blue, ancestor, mergeSituation, null, "a[@key='one']/b[@key='one']/c[@key='two' and text()='change1']"); Assert.AreEqual(typeof(EditedVsRemovedElementConflict), r.Conflicts[0].GetType()); var c = r.Conflicts[0]; Assert.That(c.HtmlDetails.StartsWith("<head>")); Assert.That(c.HtmlDetails, Contains.Substring(c.GetFullHumanReadableDescription())); var ancestorHml = XmlUtilities.GetXmlForShowingInHtml("<c key='two'>data</c>"); // For now decided that with diffs we don't need the ancestor //Assert.That(c.HtmlDetails, Contains.Substring(ancestorHml)); Assert.That(c.HtmlDetails.EndsWith("</body>")); var oursHtml = XmlUtilities.GetXmlForShowingInHtml("<c key='two'>change1</c>"); var m = new Rainbow.HtmlDiffEngine.Merger(ancestorHml, oursHtml); Assert.That(c.HtmlDetails, Contains.Substring(m.merge())); Assert.That(c.HtmlDetails, Contains.Substring("kept the change made by red")); AssertDivsMatch(c.HtmlDetails); }
private ChangeAndConflictAccumulator CheckOneWay(string ours, string theirs, string ancestor, MergeSituation situation, Dictionary<string, ElementStrategy> specialMergeStrategies, Action<string, ElementStrategy> adjustStrategy, params string[] xpaths) { var m = new XmlMerger(situation); AddMergeStrategies(m); if (specialMergeStrategies != null) { foreach (var kvp in specialMergeStrategies) m.MergeStrategies.ElementStrategies[kvp.Key] = kvp.Value; // don't use add, some may replace standard ones. } if (adjustStrategy != null) { foreach (var kvp in m.MergeStrategies.ElementStrategies) adjustStrategy(kvp.Key, kvp.Value); } var result = m.Merge(ours, theirs, ancestor); foreach (string xpath in xpaths) { XmlTestHelper.AssertXPathMatchesExactlyOne(result.MergedNode, xpath); } return result; }
private ChangeAndConflictAccumulator CheckOneWay(string ours, string theirs, string ancestor, MergeSituation situation, Dictionary<string, ElementStrategy> specialMergeStrategies, params string[] xpaths) { return CheckOneWay(ours, theirs, ancestor, situation, specialMergeStrategies, null, xpaths); }
public UnmergableFileTypeConflict(MergeSituation situation ) : base(situation) { }
public DemoConflict(MergeSituation situation) : base(situation) { }
private static XmlNode RunServiceCore(string common, string ours, string theirs, MergeSituation mergeSituation, out XmlNode returnAncestorNode, out ListenerForUnitTests listener) { XmlNode ourNode; XmlNode theirNode; XmlNode ancestorNode; CreateThreeNodes(ours, out ourNode, theirs, out theirNode, common, out ancestorNode); returnAncestorNode = ancestorNode; var merger = GetMerger(mergeSituation, out listener); Assert.DoesNotThrow(() => MergeAtomicElementService.Run(merger, ref ourNode, theirNode, ancestorNode)); return ourNode; }
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; }
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; }
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 mergeResult = merger.Merge( XmlUtilities.GetDocumentNodeFromRawXml(ourData.Replace("<?xml version='1.0' encoding='utf-8'?>", null).Trim(), new XmlDocument()), 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 void DoMergeWithLiftEntryMergingStrategy(string ancestorXml, string ourXml, string theirXml, MergeSituation mergeSituation, IEnumerable<string> xpathQueriesThatMatchExactlyOneNode, IEnumerable<string> xpathQueriesThatReturnNull, int expectedConflictCount, List<Type> expectedConflictTypes, int expectedChangesCount, List<Type> expectedChangeTypes) { var listener = new ListenerForUnitTests(); string result; using (var oursTemp = new TempFile(ourXml)) using (var theirsTemp = new TempFile(theirXml)) using (var ancestorTemp = new TempFile(ancestorXml)) { var mergeOrder = new MergeOrder(oursTemp.Path, ancestorTemp.Path, theirsTemp.Path, mergeSituation) { EventListener = listener }; XmlMergeService.Do3WayMerge(mergeOrder, new LiftEntryMergingStrategy(mergeOrder), false, "header", "entry", "guid"); result = File.ReadAllText(mergeOrder.pathToOurs); } XmlTestHelper.CheckMergeResults(result, listener, xpathQueriesThatMatchExactlyOneNode, xpathQueriesThatReturnNull, expectedConflictCount, expectedConflictTypes, expectedChangesCount, expectedChangeTypes); }
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; }
public DemoConflict(MergeSituation situation, string whoWon) : base(situation, whoWon) { }
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 UnmergableFileTypeConflict(MergeSituation situation) : base(situation) { }
/// <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); }
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); }