Exemplo n.º 1
0
//
//        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);
        }
Exemplo n.º 2
0
        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)));
        }
Exemplo n.º 3
0
        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
        }
Exemplo n.º 4
0
        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);
 }
Exemplo n.º 6
0
        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));
        }
Exemplo n.º 7
0
        //
        //        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;
        }
Exemplo n.º 8
0
        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);
        }
Exemplo n.º 9
0
        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);
        }
Exemplo n.º 10
0
        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;
        }
Exemplo n.º 11
0
        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)
 {
 }
Exemplo n.º 13
0
 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;
 }
Exemplo n.º 16
0
        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&amp;database=current&amp;server=&amp;tool=default&amp;guid=bab7776e-531b-4ce1-997f-fa638c09e381&amp;tag=&amp;label=Entry &quot;pintu&quot;'
            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='&lt;head&gt;&lt;style type='text/css'&gt;&lt;/style&gt;&lt;/head&gt;&lt;body&gt;&lt;div class='description'&gt;Entry &quot;pintu&quot;: user57@tpad2 deleted this element, while user57 edited it. The automated merger kept the change made by user57.&lt;/div&gt;&lt;div class='alternative'&gt;user57's changes: &amp;lt;LexEntry guid=&quot;bab7776e-531b-4ce1-997f-fa638c09e381&quot;&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;DateCreated val=&quot;2012-7-20 13:46:3.625&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;DateModified val=&quot;2012-7-20 &lt;span style=&quot;text-decoration: line-through; color: red&quot;&gt;13:46:3.625&lt;/span&gt;&lt;span style=&quot;background: Yellow&quot;&gt;14:14:20.218&lt;/span&gt;&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;DoNotUseForParsing val=&quot;False&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;HomographNumber val=&quot;0&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;LexemeForm&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MoStemAllomorph guid=&quot;556f6e08-0fb2-4171-82e0-6dcdddf9490b&quot;&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Form&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;AUni ws=&quot;id&quot;&gt;pintu&amp;lt;/AUni&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Form&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;IsAbstract val=&quot;False&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MorphType&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;objsur guid=&quot;d7f713e8-e8cf-11d3-9764-00c04f186933&quot; t=&quot;r&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MorphType&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MoStemAllomorph&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/LexemeForm&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;MorphoSyntaxAnalyses&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MoStemMsa guid=&quot;f63e03f0-ac9d-4b1b-980f-316bbb741f70&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/MorphoSyntaxAnalyses&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Senses&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ownseq class=&quot;LexSense&quot; guid=&quot;dad069de-dfad-45f6-a5d2-449265adbc3a&quot;&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background: Yellow&quot;&gt;&amp;lt;Definition&gt;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background: Yellow&quot;&gt;&amp;lt;AStr&lt;/span&gt; &lt;span style=&quot;background: Yellow&quot;&gt;ws=&quot;en&quot;&gt;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background: Yellow&quot;&gt;&amp;lt;Run&lt;/span&gt; &lt;span style=&quot;background: Yellow&quot;&gt;ws=&quot;en&quot;&gt;a&lt;/span&gt; &lt;span style=&quot;background: Yellow&quot;&gt;door&lt;/span&gt;&lt;span style=&quot;background: Yellow&quot;&gt;&amp;lt;/Run&gt;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background: Yellow&quot;&gt;&amp;lt;/AStr&gt;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background: Yellow&quot;&gt;&amp;lt;/Definition&gt;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Gloss&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;AUni ws=&quot;en&quot;&gt;door&amp;lt;/AUni&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Gloss&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MorphoSyntaxAnalysis&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;objsur guid=&quot;f63e03f0-ac9d-4b1b-980f-316bbb741f70&quot; t=&quot;r&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MorphoSyntaxAnalysis&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ownseq&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/Senses&gt;&lt;br/&gt;&amp;lt;/LexEntry&gt;&lt;/div&gt;&lt;div class='alternative'&gt;user57@tpad2's changes: &amp;lt;LexEntry guid=&quot;bab7776e-531b-4ce1-997f-fa638c09e381&quot;&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;DateCreated val=&quot;2012-7-20 13:46:3.625&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;DateModified val=&quot;2012-7-20 13:46:3.625&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;DoNotUseForParsing val=&quot;False&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;HomographNumber val=&quot;0&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;LexemeForm&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MoStemAllomorph guid=&quot;556f6e08-0fb2-4171-82e0-6dcdddf9490b&quot;&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Form&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;AUni ws=&quot;id&quot;&gt;pintu&amp;lt;/AUni&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Form&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;IsAbstract val=&quot;False&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MorphType&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;objsur guid=&quot;d7f713e8-e8cf-11d3-9764-00c04f186933&quot; t=&quot;r&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MorphType&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MoStemAllomorph&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/LexemeForm&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;MorphoSyntaxAnalyses&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MoStemMsa guid=&quot;f63e03f0-ac9d-4b1b-980f-316bbb741f70&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/MorphoSyntaxAnalyses&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Senses&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ownseq class=&quot;LexSense&quot; guid=&quot;dad069de-dfad-45f6-a5d2-449265adbc3a&quot;&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Gloss&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;AUni ws=&quot;en&quot;&gt;door&amp;lt;/AUni&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Gloss&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MorphoSyntaxAnalysis&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;objsur guid=&quot;f63e03f0-ac9d-4b1b-980f-316bbb741f70&quot; t=&quot;r&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MorphoSyntaxAnalysis&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ownseq&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/Senses&gt;&lt;br/&gt;&amp;lt;/LexEntry&gt;&lt;/div&gt;&lt;div class='mergechoice'&gt;The merger kept the change made by user57&lt;/div&gt;&lt;/body&gt;'
            contextPath='silfw://localhost/link?app=flex&amp;database=current&amp;server=&amp;tool=default&amp;guid=bab7776e-531b-4ce1-997f-fa638c09e381&amp;tag=&amp;label=Entry &quot;pintu&quot;'
            contextDataLabel='Entry &quot;pintu&quot;'>
            <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&amp;database=current&amp;server=&amp;tool=default&amp;guid=bab7776e-531b-4ce1-997f-fa638c09e381&amp;tag=&amp;label=Entry &quot;pintu&quot;'
            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='&lt;head&gt;&lt;style type='text/css'&gt;&lt;/style&gt;&lt;/head&gt;&lt;body&gt;&lt;div class='description'&gt;Entry &quot;pintu&quot;: user57@tpad2 deleted this element, while user57 edited it. The automated merger kept the change made by user57.&lt;/div&gt;&lt;div class='alternative'&gt;user57's changes: &amp;lt;LexEntry guid=&quot;bab7776e-531b-4ce1-997f-fa638c09e381&quot;&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;DateCreated val=&quot;2012-7-20 13:46:3.625&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;DateModified val=&quot;2012-7-20 &lt;span style=&quot;text-decoration: line-through; color: red&quot;&gt;13:46:3.625&lt;/span&gt;&lt;span style=&quot;background: Yellow&quot;&gt;14:14:20.218&lt;/span&gt;&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;DoNotUseForParsing val=&quot;False&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;HomographNumber val=&quot;0&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;LexemeForm&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MoStemAllomorph guid=&quot;556f6e08-0fb2-4171-82e0-6dcdddf9490b&quot;&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Form&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;AUni ws=&quot;id&quot;&gt;pintu&amp;lt;/AUni&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Form&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;IsAbstract val=&quot;False&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MorphType&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;objsur guid=&quot;d7f713e8-e8cf-11d3-9764-00c04f186933&quot; t=&quot;r&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MorphType&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MoStemAllomorph&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/LexemeForm&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;MorphoSyntaxAnalyses&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MoStemMsa guid=&quot;f63e03f0-ac9d-4b1b-980f-316bbb741f70&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/MorphoSyntaxAnalyses&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Senses&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ownseq class=&quot;LexSense&quot; guid=&quot;dad069de-dfad-45f6-a5d2-449265adbc3a&quot;&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background: Yellow&quot;&gt;&amp;lt;Definition&gt;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background: Yellow&quot;&gt;&amp;lt;AStr&lt;/span&gt; &lt;span style=&quot;background: Yellow&quot;&gt;ws=&quot;en&quot;&gt;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background: Yellow&quot;&gt;&amp;lt;Run&lt;/span&gt; &lt;span style=&quot;background: Yellow&quot;&gt;ws=&quot;en&quot;&gt;a&lt;/span&gt; &lt;span style=&quot;background: Yellow&quot;&gt;door&lt;/span&gt;&lt;span style=&quot;background: Yellow&quot;&gt;&amp;lt;/Run&gt;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background: Yellow&quot;&gt;&amp;lt;/AStr&gt;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background: Yellow&quot;&gt;&amp;lt;/Definition&gt;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Gloss&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;AUni ws=&quot;en&quot;&gt;door&amp;lt;/AUni&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Gloss&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MorphoSyntaxAnalysis&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;objsur guid=&quot;f63e03f0-ac9d-4b1b-980f-316bbb741f70&quot; t=&quot;r&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MorphoSyntaxAnalysis&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ownseq&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/Senses&gt;&lt;br/&gt;&amp;lt;/LexEntry&gt;&lt;/div&gt;&lt;div class='alternative'&gt;user57@tpad2's changes: &amp;lt;LexEntry guid=&quot;bab7776e-531b-4ce1-997f-fa638c09e381&quot;&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;DateCreated val=&quot;2012-7-20 13:46:3.625&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;DateModified val=&quot;2012-7-20 13:46:3.625&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;DoNotUseForParsing val=&quot;False&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;HomographNumber val=&quot;0&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;LexemeForm&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MoStemAllomorph guid=&quot;556f6e08-0fb2-4171-82e0-6dcdddf9490b&quot;&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Form&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;AUni ws=&quot;id&quot;&gt;pintu&amp;lt;/AUni&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Form&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;IsAbstract val=&quot;False&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MorphType&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;objsur guid=&quot;d7f713e8-e8cf-11d3-9764-00c04f186933&quot; t=&quot;r&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MorphType&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MoStemAllomorph&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/LexemeForm&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;MorphoSyntaxAnalyses&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MoStemMsa guid=&quot;f63e03f0-ac9d-4b1b-980f-316bbb741f70&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/MorphoSyntaxAnalyses&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Senses&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ownseq class=&quot;LexSense&quot; guid=&quot;dad069de-dfad-45f6-a5d2-449265adbc3a&quot;&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Gloss&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;AUni ws=&quot;en&quot;&gt;door&amp;lt;/AUni&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Gloss&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MorphoSyntaxAnalysis&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;objsur guid=&quot;f63e03f0-ac9d-4b1b-980f-316bbb741f70&quot; t=&quot;r&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MorphoSyntaxAnalysis&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ownseq&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/Senses&gt;&lt;br/&gt;&amp;lt;/LexEntry&gt;&lt;/div&gt;&lt;div class='mergechoice'&gt;The merger kept the change made by user57&lt;/div&gt;&lt;/body&gt;'
            contextPath='silfw://localhost/link?app=flex&amp;database=current&amp;server=&amp;tool=default&amp;guid=bab7776e-531b-4ce1-997f-fa638c09e381&amp;tag=&amp;label=Entry &quot;pintu&quot;'
            contextDataLabel='Entry &quot;pintu&quot;'>
            <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&amp;database=current&amp;server=&amp;tool=default&amp;guid=bab7776e-531b-4ce1-997f-fa638c09e381&amp;tag=&amp;label=Entry &quot;pintu&quot;'
            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='&lt;head&gt;&lt;style type='text/css'&gt;&lt;/style&gt;&lt;/head&gt;&lt;body&gt;&lt;div class='description'&gt;Entry &quot;pintu&quot;: user57@tpad2 deleted this element, while user57 edited it. The automated merger kept the change made by user57.&lt;/div&gt;&lt;div class='alternative'&gt;user57's changes: &amp;lt;LexEntry guid=&quot;bab7776e-531b-4ce1-997f-fa638c09e381&quot;&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;DateCreated val=&quot;2012-7-20 13:46:3.625&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;DateModified val=&quot;2012-7-20 &lt;span style=&quot;text-decoration: line-through; color: red&quot;&gt;13:46:3.625&lt;/span&gt;&lt;span style=&quot;background: Yellow&quot;&gt;14:14:20.218&lt;/span&gt;&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;DoNotUseForParsing val=&quot;False&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;HomographNumber val=&quot;0&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;LexemeForm&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MoStemAllomorph guid=&quot;556f6e08-0fb2-4171-82e0-6dcdddf9490b&quot;&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Form&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;AUni ws=&quot;id&quot;&gt;pintu&amp;lt;/AUni&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Form&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;IsAbstract val=&quot;False&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MorphType&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;objsur guid=&quot;d7f713e8-e8cf-11d3-9764-00c04f186933&quot; t=&quot;r&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MorphType&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MoStemAllomorph&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/LexemeForm&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;MorphoSyntaxAnalyses&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MoStemMsa guid=&quot;f63e03f0-ac9d-4b1b-980f-316bbb741f70&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/MorphoSyntaxAnalyses&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Senses&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ownseq class=&quot;LexSense&quot; guid=&quot;dad069de-dfad-45f6-a5d2-449265adbc3a&quot;&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background: Yellow&quot;&gt;&amp;lt;Definition&gt;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background: Yellow&quot;&gt;&amp;lt;AStr&lt;/span&gt; &lt;span style=&quot;background: Yellow&quot;&gt;ws=&quot;en&quot;&gt;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background: Yellow&quot;&gt;&amp;lt;Run&lt;/span&gt; &lt;span style=&quot;background: Yellow&quot;&gt;ws=&quot;en&quot;&gt;a&lt;/span&gt; &lt;span style=&quot;background: Yellow&quot;&gt;door&lt;/span&gt;&lt;span style=&quot;background: Yellow&quot;&gt;&amp;lt;/Run&gt;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background: Yellow&quot;&gt;&amp;lt;/AStr&gt;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background: Yellow&quot;&gt;&amp;lt;/Definition&gt;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Gloss&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;AUni ws=&quot;en&quot;&gt;door&amp;lt;/AUni&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Gloss&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MorphoSyntaxAnalysis&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;objsur guid=&quot;f63e03f0-ac9d-4b1b-980f-316bbb741f70&quot; t=&quot;r&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MorphoSyntaxAnalysis&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ownseq&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/Senses&gt;&lt;br/&gt;&amp;lt;/LexEntry&gt;&lt;/div&gt;&lt;div class='alternative'&gt;user57@tpad2's changes: &amp;lt;LexEntry guid=&quot;bab7776e-531b-4ce1-997f-fa638c09e381&quot;&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;DateCreated val=&quot;2012-7-20 13:46:3.625&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;DateModified val=&quot;2012-7-20 13:46:3.625&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;DoNotUseForParsing val=&quot;False&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;HomographNumber val=&quot;0&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;LexemeForm&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MoStemAllomorph guid=&quot;556f6e08-0fb2-4171-82e0-6dcdddf9490b&quot;&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Form&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;AUni ws=&quot;id&quot;&gt;pintu&amp;lt;/AUni&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Form&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;IsAbstract val=&quot;False&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MorphType&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;objsur guid=&quot;d7f713e8-e8cf-11d3-9764-00c04f186933&quot; t=&quot;r&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MorphType&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MoStemAllomorph&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/LexemeForm&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;MorphoSyntaxAnalyses&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MoStemMsa guid=&quot;f63e03f0-ac9d-4b1b-980f-316bbb741f70&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/MorphoSyntaxAnalyses&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Senses&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ownseq class=&quot;LexSense&quot; guid=&quot;dad069de-dfad-45f6-a5d2-449265adbc3a&quot;&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Gloss&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;AUni ws=&quot;en&quot;&gt;door&amp;lt;/AUni&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Gloss&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MorphoSyntaxAnalysis&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;objsur guid=&quot;f63e03f0-ac9d-4b1b-980f-316bbb741f70&quot; t=&quot;r&quot; /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MorphoSyntaxAnalysis&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ownseq&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/Senses&gt;&lt;br/&gt;&amp;lt;/LexEntry&gt;&lt;/div&gt;&lt;div class='mergechoice'&gt;The merger kept the change made by user57&lt;/div&gt;&lt;/body&gt;'
            contextPath='silfw://localhost/link?app=flex&amp;database=current&amp;server=&amp;tool=default&amp;guid=bab7776e-531b-4ce1-997f-fa638c09e381&amp;tag=&amp;label=Entry &quot;pintu&quot;'
            contextDataLabel='Entry &quot;pintu&quot;'>
            <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));
            }
        }
Exemplo n.º 18
0
        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;
        }
Exemplo n.º 20
0
 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);
        }
Exemplo n.º 22
0
 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);
        }
Exemplo n.º 24
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);
        }