Esempio n. 1
0
        public static List <Diff> GenerateDiffCache(string textA, string textB)
        {
            diff_match_patch dmp = new diff_match_patch();

            (string chars1, string chars2, List <string> lines)a = dmp.diff_linesToChars(textA, textB);

            List <Diff> diffs = dmp.diff_main(a.chars1, a.chars2, true);

            // Convert the diff back to original text.
            dmp.diff_charsToLines(diffs, a.lines);

            // Eliminate freak matches (e.g. blank lines)
            // dmp.diff_cleanupSemantic(diffs);

            return(diffs);
        }
Esempio n. 2
0
        public static string GetDiffMessage(object currentSnapshot, object newSnapshot)
        {
            var currentSnapshotJObject = JObjectHelper.FromObject(currentSnapshot);
            var newSnapshotJObject     = JObjectHelper.FromObject(newSnapshot);

            var dmp       = new diff_match_patch();
            var a         = dmp.diff_linesToChars(currentSnapshotJObject.ToString(), newSnapshotJObject.ToString());
            var lineText1 = (string)a[0];
            var lineText2 = (string)a[1];
            var lineArray = (List <string>)a[2];
            var diffs     = dmp.diff_main(lineText1, lineText2, false);

            dmp.diff_charsToLines(diffs, lineArray);
            dmp.diff_cleanupEfficiency(diffs);

            var builder = new StringBuilder(Environment.NewLine);

            builder.AppendLine("Snapshots do not match");
            builder.AppendLine(RemovedLegendString);
            builder.AppendLine(AddedLegendString);
            builder.AppendLine(Environment.NewLine);

            for (var i = 0; i < diffs.Count; i++)
            {
                var diff = diffs[i];

                var lines = GetLines(diff.text);

                switch (diff.operation)
                {
                case Operation.DELETE:
                    lines.ForEach(l => builder.AppendLine($"-  {l}"));
                    break;

                case Operation.INSERT:
                    lines.ForEach(l => builder.AppendLine($"+  {l}"));
                    break;

                case Operation.EQUAL:
                    GetEqualLines(lines, i == 0, i == diffs.Count - 1).ForEach(l => builder.AppendLine(l));
                    break;
                }
            }

            return(builder.ToString());
        }
Esempio n. 3
0
        private void ShowDifferencesInBrowser(string build1Text, string build2Text)
        {
            var diff        = new diff_match_patch();
            var linesResult = diff.diff_linesToChars(build1Text, build2Text);
            var lineText1   = linesResult[0];
            var lineText2   = linesResult[1];
            var lineArray   = linesResult[2] as List <string>;
            var diffs       = diff.diff_main(lineText1.ToString(), lineText2.ToString(), true);

            diff.diff_charsToLines(diffs, lineArray);

            var diffPrettyHtml = diff.diff_prettyHtmlSidebySide(diffs);

            var mydocpath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

            using (var outputFile = new StreamWriter(mydocpath + @"\CompareBuilds.html")) { outputFile.WriteLine(diffPrettyHtml); }

            Process.Start("IExplore.exe", mydocpath + @"\CompareBuilds.html");
        }
Esempio n. 4
0
        private void GenerateDiff(MarkdownPage page, string newPage)
        {
            var diffEngine = new diff_match_patch();

            var a         = diffEngine.diff_linesToChars(page.Content, newPage);
            var text1     = (string)a[0];
            var text2     = (string)a[1];
            var lineArray = (List <string>)a[2];


            var diff = diffEngine.diff_main(text1, text2, false);

            diffEngine.diff_charsToLines(diff, lineArray);

            diffEngine.diff_cleanupSemantic(diff);

            var htmlDiff = diffEngine.diff_prettyHtml(diff);

            Frame.Navigate(typeof(ImportDiffPage), Tuple.Create(diff, Page.Id));
        }
Esempio n. 5
0
        private static string GetDiffMessage(JToken old, JToken @new)
        {
            var dmp       = new diff_match_patch();
            var a         = dmp.diff_linesToChars(old.ToString(), @new.ToString());
            var lineText1 = (string)a[0];
            var lineText2 = (string)a[1];
            var lineArray = (List <string>)a[2];
            var diffs     = dmp.diff_main(lineText1, lineText2, false);

            dmp.diff_charsToLines(diffs, lineArray);
            dmp.diff_cleanupEfficiency(diffs);

            var builder = new StringBuilder("\n");

            builder.AppendLine("- Snapshot");
            builder.AppendLine("+ Receieved\n\n");

            for (var i = 0; i < diffs.Count; i++)
            {
                var diff = diffs[i];

                var lines = GetLines(diff.text);

                switch (diff.operation)
                {
                case Operation.DELETE:
                    lines.ForEach(l => builder.AppendLine($"-  {l}"));
                    break;

                case Operation.INSERT:
                    lines.ForEach(l => builder.AppendLine($"+  {l}"));
                    break;

                case Operation.EQUAL:
                    GetEqualLines(lines, i == 0, i == diffs.Count - 1).ForEach(l => builder.AppendLine(l));
                    break;
                }
            }

            return(builder.ToString());
        }
Esempio n. 6
0
        /// <summary>
        /// The compare.
        /// </summary>
        /// <param name="leftString">
        /// The left string.
        /// </param>
        /// <param name="rightString">
        /// The right string.
        /// </param>
        private static void Compare(ref string leftString, ref string rightString)
        {
            var diffMatchPatchWorker = new diff_match_patch();
            var result     = diffMatchPatchWorker.diff_linesToChars(leftString, rightString);
            var stringHash = result[2] as List <string>;
            var diffs      = diffMatchPatchWorker.diff_main(result[0] as string, result[1] as string, false);

            leftString  = string.Empty;
            rightString = string.Empty;

            // white space to patch
            int whiteSpaceCountToPatch = 0;

            // insert delete or delete insert match
            bool nextDiffMatch = false;

            for (int i = 0; i < diffs.Count; i++)
            {
                var diff = diffs[i];

                char[] indexArray = diff.text.ToCharArray();

                if (diff.operation == Operation.INSERT)
                {
                    if (nextDiffMatch)
                    {
                        AddStringAndPatch(0 - whiteSpaceCountToPatch, ref rightString, ref leftString, indexArray, stringHash);
                        nextDiffMatch = false;
                    }
                    else
                    {
                        whiteSpaceCountToPatch = indexArray.Length;
                        Diff nextDiffer = null;
                        if (i + 1 < diffs.Count)
                        {
                            nextDiffer = diffs[i + 1];
                        }

                        if (null != nextDiffer)
                        {
                            // next if delete
                            if (nextDiffer.operation == Operation.DELETE)
                            {
                                var nextIndexArray = nextDiffer.text.ToCharArray();
                                whiteSpaceCountToPatch = indexArray.Length - nextIndexArray.Length;
                                nextDiffMatch          = true;
                            }
                        }

                        AddStringAndPatch(whiteSpaceCountToPatch, ref rightString, ref leftString, indexArray, stringHash);
                    }
                }

                if (diff.operation == Operation.EQUAL)
                {
                    whiteSpaceCountToPatch = 0;

                    foreach (var index in indexArray)
                    {
                        if (stringHash != null)
                        {
                            leftString  += stringHash[index];
                            rightString += stringHash[index];
                        }
                    }
                }

                if (diff.operation == Operation.DELETE)
                {
                    if (nextDiffMatch)
                    {
                        AddStringAndPatch(0 - whiteSpaceCountToPatch, ref leftString, ref rightString, indexArray, stringHash);
                        nextDiffMatch = false;
                    }
                    else
                    {
                        whiteSpaceCountToPatch = indexArray.Length;
                        Diff nextDiffer = null;
                        if (i + 1 < diffs.Count)
                        {
                            nextDiffer = diffs[i + 1];
                        }

                        if (null != nextDiffer)
                        {
                            // next if delete
                            if (nextDiffer.operation == Operation.INSERT)
                            {
                                var nextIndexArray = nextDiffer.text.ToCharArray();
                                whiteSpaceCountToPatch = indexArray.Length - nextIndexArray.Length;
                                nextDiffMatch          = true;
                            }
                        }

                        AddStringAndPatch(whiteSpaceCountToPatch, ref leftString, ref rightString, indexArray, stringHash);
                    }
                }
            }
        }