public void AllFilesMissingThrows() { var merger = new XmlMerger(new NullMergeSituation()); Assert.Throws<InvalidOperationException>(() => merger.MergeFiles(null, null, null)); }
/// <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); } } }
public void AncestorIsEmptyFileAndWeBothAddedDifferentContentWithTheyWinHasOneConflictReport() { const string data = @"<?xml version='1.0' encoding='utf-8'?> <data />"; using (var ancestor = new TempFile()) using (var ours = new TempFile()) using (var theirs = new TempFile()) { File.WriteAllText(ancestor.Path, ""); File.WriteAllText(ours.Path, data.Replace("<data />", "<data>our addition</data>")); File.WriteAllText(theirs.Path, data.Replace("<data />", "<data>their addition</data>")); var listener = new ListenerForUnitTests(); var merger = new XmlMerger(new NullMergeSituationTheyWin()) { EventListener = listener }; var result = merger.MergeFiles(ours.Path, theirs.Path, ancestor.Path); Assert.IsNotNull(result); listener.AssertExpectedChangesCount(0); listener.AssertExpectedConflictCount(1); listener.AssertFirstConflictType<BothAddedMainElementButWithDifferentContentConflict>(); Assert.IsTrue(result.MergedNode.OuterXml.Contains("their addition")); } }
public void AncestorIsNotXmlThrows() { const string data = @"<?xml version='1.0' encoding='utf-8'?> <data />"; using (var ancestor = new TempFile()) using (var ours = new TempFile()) using (var theirs = new TempFile()) { File.WriteAllText(ancestor.Path, "Not xml stuff."); File.WriteAllText(ours.Path, data); File.WriteAllText(theirs.Path, data); var merger = new XmlMerger(new NullMergeSituation()); Assert.Throws<XmlException>(() => merger.MergeFiles(ours.Path, theirs.Path, ancestor.Path)); } }
public void AncestorIsEmptyFileAndBothAddedSameThingHasOneChangeReport() { const string data = @"<?xml version='1.0' encoding='utf-8'?> <data />"; using (var ancestor = new TempFile()) using (var ours = new TempFile()) using (var theirs = new TempFile()) { File.WriteAllText(ancestor.Path, ""); File.WriteAllText(ours.Path, data); File.WriteAllText(theirs.Path, data); var listener = new ListenerForUnitTests(); var merger = new XmlMerger(new NullMergeSituation()) { EventListener = listener }; var result = merger.MergeFiles(ours.Path, theirs.Path, ancestor.Path); Assert.IsNotNull(result); listener.AssertExpectedChangesCount(1); listener.AssertFirstChangeType<XmlBothAddedSameChangeReport>(); listener.AssertExpectedConflictCount(0); } }
public void WeChangedTheyDeletedFileHasOneConflictReport() { const string data = @"<?xml version='1.0' encoding='utf-8'?> <data />"; using (var ancestor = new TempFile()) using (var ours = new TempFile()) using (var theirs = new TempFile()) { File.WriteAllText(ancestor.Path, data); File.WriteAllText(ours.Path, data.Replace("<data />", "<data>our change</data>")); File.WriteAllText(theirs.Path, ""); var listener = new ListenerForUnitTests(); var merger = new XmlMerger(new NullMergeSituation()) { EventListener = listener }; var result = merger.MergeFiles(ours.Path, theirs.Path, ancestor.Path); Assert.IsNotNull(result); listener.AssertExpectedChangesCount(0); listener.AssertExpectedConflictCount(1); listener.AssertFirstConflictType<EditedVsRemovedElementConflict>(); Assert.IsTrue(result.MergedNode.OuterXml.Contains("our change")); } }
/// <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"); PreMergeFile(mergeOrder); var merger = new XmlMerger(mergeOrder.MergeSituation); SetupElementStrategies(merger); merger.EventListener = mergeOrder.EventListener; 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("fw", "urn://fieldworks.sil.org/ldmlExtensions/v1"); var readerSettings = CanonicalXmlSettings.CreateXmlReaderSettings(ConformanceLevel.Auto); readerSettings.NameTable = nameSpaceManager.NameTable; readerSettings.XmlResolver = null; readerSettings.ProhibitDtd = false; using (var nodeReader = XmlReader.Create(new MemoryStream(Encoding.UTF8.GetBytes(result.MergedNode.OuterXml)), readerSettings)) { writer.WriteNode(nodeReader, false); } } }
/// <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); } } }