/// <summary> /// Do a 3-file merge, placing the result over the "ours" file and returning an error status /// </summary> /// <remarks>Implementations can exit with an exception, which the caller will catch and deal with. /// The must not have any UI, no interaction with the user.</remarks> public void Do3WayMerge(MergeOrder mergeOrder) { Guard.AgainstNull(mergeOrder, "mergeOrder"); if (mergeOrder == null) { throw new ArgumentNullException("mergeOrder"); } var merger = new XmlMerger(mergeOrder.MergeSituation); SetupElementStrategies(merger); merger.EventListener = mergeOrder.EventListener; using (var oursXml = new HtmlFileForMerging(mergeOrder.pathToOurs)) using (var theirsXml = new HtmlFileForMerging(mergeOrder.pathToTheirs)) using (var ancestorXml = new HtmlFileForMerging(mergeOrder.pathToCommonAncestor)) { var result = merger.MergeFiles(oursXml.GetPathToXHtml(), theirsXml.GetPathToXHtml(), ancestorXml.GetPathToXHtml()); CarefullyWriteOutResultingXml(oursXml, result); //now convert back to html oursXml.SaveHtml(); } }
/// <summary> /// Do a 3-file merge, placing the result over the "ours" file and returning an error status /// </summary> /// <remarks>Implementations can exit with an exception, which the caller will catch and deal with. /// The must not have any UI, no interaction with the user.</remarks> public void Do3WayMerge(MergeOrder mergeOrder) { if (mergeOrder == null) { throw new ArgumentNullException("mergeOrder"); } bool addedCollationAttr; PreMergeFile(mergeOrder, out addedCollationAttr); var merger = new XmlMerger(mergeOrder.MergeSituation); SetupElementStrategies(merger); merger.EventListener = mergeOrder.EventListener; XmlMergeService.RemoveAmbiguousChildNodes = true; var result = merger.MergeFiles(mergeOrder.pathToOurs, mergeOrder.pathToTheirs, mergeOrder.pathToCommonAncestor); using (var writer = XmlWriter.Create(mergeOrder.pathToOurs, CanonicalXmlSettings.CreateXmlWriterSettings())) { var readerSettings = CanonicalXmlSettings.CreateXmlReaderSettings(ConformanceLevel.Auto); readerSettings.XmlResolver = null; readerSettings.ProhibitDtd = false; using (var nodeReader = XmlReader.Create(new MemoryStream(Encoding.UTF8.GetBytes(result.MergedNode.OuterXml)), readerSettings)) { writer.WriteNode(nodeReader, false); } } }
public void Do3WayMerge(MetadataCache mdc, MergeOrder mergeOrder) { var merger = new XmlMerger(mergeOrder.MergeSituation) { EventListener = mergeOrder.EventListener }; var rootStrategy = ElementStrategy.CreateSingletonElement(); rootStrategy.IsAtomic = true; merger.MergeStrategies.SetStrategy("DictionaryConfiguration", rootStrategy); var mergeResults = merger.MergeFiles(mergeOrder.pathToOurs, mergeOrder.pathToTheirs, mergeOrder.pathToCommonAncestor); // Write merged data File.WriteAllText(mergeOrder.pathToOurs, mergeResults.MergedNode.OuterXml, Encoding.UTF8); }
/// <summary> /// Do a 3-file merge, placing the result over the "ours" file and returning an error status /// </summary> /// <remarks>Implementations can exit with an exception, which the caller will catch and deal with. /// The must not have any UI, no interaction with the user.</remarks> public void Do3WayMerge(MergeOrder mergeOrder) { if (mergeOrder == null) { throw new ArgumentNullException("mergeOrder"); } bool addedCollationAttr; PreMergeFile(mergeOrder, out addedCollationAttr); var merger = new XmlMerger(mergeOrder.MergeSituation); SetupElementStrategies(merger); merger.EventListener = mergeOrder.EventListener; XmlMergeService.RemoveAmbiguousChildNodes = true; var result = merger.MergeFiles(mergeOrder.pathToOurs, mergeOrder.pathToTheirs, mergeOrder.pathToCommonAncestor); using (var writer = XmlWriter.Create(mergeOrder.pathToOurs, CanonicalXmlSettings.CreateXmlWriterSettings())) { var nameSpaceManager = new XmlNamespaceManager(new NameTable()); nameSpaceManager.AddNamespace("palaso", "urn://palaso.org/ldmlExtensions/v1"); nameSpaceManager.AddNamespace("palaso2", "urn://palaso.org/ldmlExtensions/v2"); nameSpaceManager.AddNamespace("fw", "urn://fieldworks.sil.org/ldmlExtensions/v1"); nameSpaceManager.AddNamespace("sil", "urn://www.sil.org/ldml/0.1"); var readerSettings = CanonicalXmlSettings.CreateXmlReaderSettings(ConformanceLevel.Auto); readerSettings.NameTable = nameSpaceManager.NameTable; readerSettings.XmlResolver = null; readerSettings.ProhibitDtd = false; if (addedCollationAttr) { // Remove the optional 'key' attr we added. var adjustedCollation = result.MergedNode.SelectSingleNode("collations") .SelectNodes("collation") .Cast <XmlNode>().FirstOrDefault(collation => collation.Attributes["type"].Value == "standard"); if (adjustedCollation != null) { adjustedCollation.Attributes.Remove(adjustedCollation.Attributes["type"]); } } using (var nodeReader = XmlReader.Create(new MemoryStream(Encoding.UTF8.GetBytes(result.MergedNode.OuterXml)), readerSettings)) { writer.WriteNode(nodeReader, false); } } }