Ejemplo n.º 1
0
        private void ProcessConflicts(List <IDiffItem> ret, List <IDiffOrderedCollectionItem> left, List <IDiffOrderedCollectionItem> right, IConflictContainer conflicts)
        {
            List <IDiffOrderedCollectionItem> addedLeft;
            List <IDiffOrderedCollectionItem> addedRight;

            IDiffOrderedCollectionItem otherLeft;
            IDiffOrderedCollectionItem otherRight;

            this.SepareAdditions(left, out addedLeft, out otherLeft);
            this.SepareAdditions(right, out addedRight, out otherRight);

            if (addedRight != null && addedLeft != null)
            {
                if (addedLeft.Count == addedRight.Count && addedLeft.Zip(addedRight, (a, b) => a.IsSame(b)).All(x => x))
                {
                    ret.AddRange(addedLeft);
                }
                else
                {
                    DiffAnyConflicted conflict = new DiffAnyConflicted(addedLeft, addedRight);
                    ret.Add(conflict);
                    conflicts.RegisterConflict(conflict);
                }
            }
            else if (addedLeft != null)
            {
                ret.AddRange(addedLeft);
            }
            else if (addedRight != null)
            {
                ret.AddRange(addedRight);
            }

            if (otherLeft != null && otherRight != null)
            {
                ret.Add(this.ProcessConflict(otherLeft, otherRight, conflicts));
            }
            else if (otherLeft != null)
            {
                ret.Add(otherLeft);
            }
            else if (otherRight != null)
            {
                ret.Add(otherRight);
            }
        }
Ejemplo n.º 2
0
        private IDiffItem ProcessConflict(IDiffOrderedCollectionItem left, IDiffOrderedCollectionItem right, IConflictContainer conflicts)
        {
            if (left is IDiffItemChanged && right is IDiffItemChanged)
            {
                IDiff <TItemType> diff = this.aMergeItemsDiffs.MergeDiffs(
                    ((IDiffItemChanged <TItemType>)left).ValueDiff,
                    ((IDiffItemChanged <TItemType>)right).ValueDiff,
                    conflicts
                    );

                return(new DiffOrderedCollectionChanged <TItemType>(left.ItemIndex, diff));
            }
            else if (left.IsSame(right))
            {
                return(left);
            }

            DiffAnyConflicted conflict = new DiffAnyConflicted(left, right);

            conflicts.RegisterConflict(conflict);
            return(conflict);
        }
        private void ProcessConflict(TIdType id, IDiffUnorderedCollectionItem leftItem, IDiffUnorderedCollectionItem rightItem, List <IDiffItem> ret, IConflictContainer conflicts)
        {
            if (leftItem is IDiffItemAdded && rightItem is IDiffItemAdded && leftItem.IsSame(rightItem))
            {
                ret.Add(leftItem);
            }
            else if (leftItem is IDiffItemRemoved && rightItem is IDiffItemRemoved)
            {
                ret.Add(leftItem);
            }
            else if (leftItem is IDiffItemChanged && rightItem is IDiffItemChanged)
            {
                IDiff <TItemType> diffLeft  = ((IDiffItemChanged <TItemType>)leftItem).ValueDiff;
                IDiff <TItemType> diffRight = ((IDiffItemChanged <TItemType>)rightItem).ValueDiff;

                IDiff <TItemType> result = this.aMergeItemsDiffs.MergeDiffs(diffLeft, diffRight, conflicts);

                ret.Add(new DiffUnorderedCollectionChanged <TIdType, TItemType>(id, result));
            }
            else if (leftItem is IDiffItemReplaced && rightItem is IDiffItemReplaced && leftItem.IsSame(rightItem))
            {
                ret.Add(leftItem);
            }
            else if (leftItem is IDiffItemUnchanged)
            {
                ret.Add(rightItem);
            }
            else if (rightItem is IDiffItemUnchanged)
            {
                ret.Add(leftItem);
            }
            else
            {
                DiffAnyConflicted conflict = new DiffAnyConflicted(leftItem, rightItem);
                ret.Add(conflict);
                conflicts.RegisterConflict(conflict);
            }
        }