コード例 #1
0
ファイル: XmlMergeService.cs プロジェクト: regnrand/chorus
        private static void ReportEditVsDeleteConflicts(MergeOrder mergeOrder, IMergeStrategy mergeStrategy,
														IDictionary<string, XmlNode> fluffedUpWinnerNodes,
														IDictionary<string, string> allWinnerData,
														string winnerId,
														IEnumerable<string> allDeletedByLoserButEditedByWinnerIds,
														IDictionary<string, string> allCommonAncestorData,
														IDictionary<string, XmlNode> fluffedUpAncestorNodes,
														string pathToWinner)
        {
            foreach (var allDeletedByLoserButEditedByWinnerId in allDeletedByLoserButEditedByWinnerIds)
            {
                // Report winner edited vs loser deleted
                XmlNode commonNode;
                if (!fluffedUpAncestorNodes.TryGetValue(allDeletedByLoserButEditedByWinnerId, out commonNode))
                {
                    commonNode = XmlUtilities.GetDocumentNodeFromRawXml(allCommonAncestorData[allDeletedByLoserButEditedByWinnerId],
                                                                        new XmlDocument());
                    fluffedUpAncestorNodes.Add(allDeletedByLoserButEditedByWinnerId, commonNode);
                }
                XmlNode winnerNode;
                if (!fluffedUpWinnerNodes.TryGetValue(allDeletedByLoserButEditedByWinnerId, out winnerNode))
                {
                    winnerNode = XmlUtilities.GetDocumentNodeFromRawXml(allWinnerData[allDeletedByLoserButEditedByWinnerId],
                                                                        new XmlDocument());
                    fluffedUpWinnerNodes.Add(allDeletedByLoserButEditedByWinnerId, winnerNode);
                }
                var elementStrategy = mergeStrategy.GetElementStrategy(winnerNode);
                var generator = elementStrategy.ContextDescriptorGenerator;
                if (generator != null)
                {
                    mergeOrder.EventListener.EnteringContext(generator.GenerateContextDescriptor(allWinnerData[allDeletedByLoserButEditedByWinnerId],
                                                                                                 pathToWinner));
                }
                AddConflictToListener(
                    mergeOrder.EventListener,
                    new EditedVsRemovedElementConflict(commonNode.Name, winnerNode, null, commonNode, mergeOrder.MergeSituation,
                                                       mergeStrategy.GetElementStrategy(commonNode), winnerId),
                    winnerNode, null, commonNode, generator as IGenerateHtmlContext ?? new SimpleHtmlGenerator());
            }
        }
コード例 #2
0
ファイル: XmlMergeService.cs プロジェクト: regnrand/chorus
        private static void ReportEditConflictsForBothAddedNewObjectsWithDifferentContent(
			MergeOrder mergeOrder, IMergeStrategy mergeStrategy,
			string pathToWinner,
			IDictionary<string, string> allLoserData, IDictionary<string, XmlNode> fluffedUpLoserNodes,
			IEnumerable<string> allNewIdsFromBothWithSameData, IEnumerable<string> allNewIdsFromBoth,
			IDictionary<string, string> allWinnerData, IDictionary<string, XmlNode> fluffedUpWinnerNodes)
        {
            foreach (var identifier in allNewIdsFromBoth.Except(allNewIdsFromBothWithSameData))
            {
                //// These were added by both, but they do not have the same content.
                XmlNode winnerNode;
                if (!fluffedUpWinnerNodes.TryGetValue(identifier, out winnerNode))
                {
                    winnerNode = XmlUtilities.GetDocumentNodeFromRawXml(allWinnerData[identifier], new XmlDocument());
                    fluffedUpWinnerNodes.Add(identifier, winnerNode);
                }
                XmlNode loserNode;
                if (!fluffedUpLoserNodes.TryGetValue(identifier, out loserNode))
                {
                    loserNode = XmlUtilities.GetDocumentNodeFromRawXml(allLoserData[identifier], new XmlDocument());
                    fluffedUpLoserNodes.Add(identifier, loserNode);
                }

                var elementStrategy = mergeStrategy.GetElementStrategy(winnerNode);
                var generator = elementStrategy.ContextDescriptorGenerator;
                if (generator != null)
                {
                    mergeOrder.EventListener.EnteringContext(generator.GenerateContextDescriptor(allWinnerData[identifier],
                                                                                                 pathToWinner));
                }
                var mergedResult = mergeStrategy.MakeMergedEntry(
                    mergeOrder.EventListener,
                    mergeOrder.MergeSituation.ConflictHandlingMode == MergeOrder.ConflictHandlingModeChoices.WeWin
                        ? winnerNode
                        : loserNode,
                    mergeOrder.MergeSituation.ConflictHandlingMode == MergeOrder.ConflictHandlingModeChoices.WeWin
                        ? loserNode
                        : winnerNode,
                    null);
                allWinnerData[identifier] = mergedResult;
                fluffedUpWinnerNodes.Remove(identifier);
                allLoserData[identifier] = mergedResult;
                    // They really are the same now, but is it a good idea to make them the same?
                fluffedUpLoserNodes.Remove(identifier);
            }
        }