예제 #1
0
파일: Merge.cs 프로젝트: nuxleus/Nuxleus
 internal Hunk (Merge merge, Diff.Hunk [][] hunks, int start, int count, bool same)
 {
     this.merge = merge;
     this.hunks = hunks;
     this.start = start;
     this.count = count;
     this.same = same;
                     
     int ct = 0;
     foreach (Diff.Hunk[] hh in hunks) {
         foreach (Diff.Hunk h in hh) {
             if (!h.Same) {
                 ct++;
                 break;
             }
         }
     }
     conflict = (ct > 1);
 }
예제 #2
0
        public static void MergeLists(IList original, IList user, IList newgen, out Queue<Conflict> conflicts, out Queue<ExtendedRange> ranges)
        {
            Merge m = new Merge(original, new []{user, newgen});

            conflicts = new Queue<Conflict>();
            ranges = new Queue<ExtendedRange>();

            foreach (Hunk h in m)
            {
                // Indicate conflict
                if (!h.IsSame(UserIndex) && !h.IsSame(NewGenIndex))
                    conflicts.Enqueue(new Conflict(new []{h.Changes(UserIndex), h.Changes(NewGenIndex), h.Original()}));

                // If one list has changes, take them
                else if (!h.IsSame(UserIndex))
                    ranges.Enqueue(new ExtendedRange(h.Original(), h.Changes(UserIndex), ChangeType.User));

                else if (!h.IsSame(NewGenIndex))
                    ranges.Enqueue(new ExtendedRange(h.Original(), h.Changes(NewGenIndex), ChangeType.Template));
                // If there were no differences in this region, take the original.
                else
                    ranges.Enqueue(new ExtendedRange(h.Original(), h.Original(), ChangeType.None));
            }
        }
예제 #3
0
파일: Merge.cs 프로젝트: nuxleus/Nuxleus
 public static IList MergeLists (IList original, IList [] changed, IComparer comparer, IHashCodeProvider hashcoder)
 {
     Merge m = new Merge (original, changed, comparer, hashcoder);
     ArrayList ret = new ArrayList ();
     ArrayList newlines = new ArrayList ();
     foreach (Hunk h in m) {
         newlines.Clear ();
                         
         for (int i = 0; i < changed.Length; i++)
             if (!h.IsSame (i))
                 newlines.Add (h.Changes (i));
                         
         // If there were no differences in this region, take the original.
         if (newlines.Count == 0)
             ret.AddRange (h.Original ());
                         
                         // If one list has changes, take them
         else if (newlines.Count == 1)
             ret.AddRange ((Range) newlines [0]);
                         
                         // Indicate conflict
         else
             ret.Add (new Conflict ((Range []) newlines.ToArray (typeof(Range))));
     }
     return ret;
 }
예제 #4
0
        private void ProcessConflict(Merge.Conflict conflict)
        {
            string[] userLines = SlyceMerge.GetLinesFromRange(user, conflict.Ranges[Merge.UserIndex]);
            string[] newgenLines = SlyceMerge.GetLinesFromRange(newgen, conflict.Ranges[Merge.NewGenIndex]);

            if (userLines.Length == 0 && newgenLines.Length == 0)
            {
                // user and template have both deleted some lines. Add them in as virtual lines.
                foreach (string line in SlyceMerge.GetLinesFromRange(prevgen, conflict.Ranges[Merge.PrevGenIndex]))
                {
                    vdo.AddLineToLeft(line, ChangeType.UserAndTemplate);
                }

                return;
            }

            Diff diff = new Diff(userLines, newgenLines, true, true);

            foreach (Diff.Hunk hunk in diff)
            {
                if (hunk.Same)
                {
                    foreach (string line in hunk.Original())
                    {
                        vdo.AddLine(line, ChangeType.None);
                    }
                    continue;
                }

                // Conflict
                VisualDiffOutput.ConflictRange crange = new VisualDiffOutput.ConflictRange();
                crange.StartLineIndex = vdo.LeftLines.Count;
                for (int i = hunk.Left.Start; i <= hunk.Left.End; i++)
                {
                    vdo.LeftLines.Add(new DiffLine(userLines[i], ChangeType.User));
                    vdo.RightLines.Add(new DiffLine("", ChangeType.User, true));
                }
                for (int i = hunk.Right.Start; i <= hunk.Right.End; i++)
                {
                    vdo.LeftLines.Add(new DiffLine(newgenLines[i], ChangeType.Template));
                    vdo.RightLines.Add(new DiffLine("", ChangeType.Template, true));
                }
                crange.EndLineIndex = vdo.LeftLines.Count;
                vdo.ConflictRanges.Add(crange);
                vdo.DiffType = TypeOfDiff.Conflict;
            }
        }