From 8e8c018f093bedcd491cc30a794c50abb139c054 Mon Sep 17 00:00:00 2001 From: Boming Zhang Date: Tue, 25 Mar 2025 07:30:17 -0400 Subject: [PATCH] fix(parser/diff): only run myers diff on shown part --- internal/parser/diff/diff.go | 1 + internal/parser/diff/parser.go | 24 +++++++++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/internal/parser/diff/diff.go b/internal/parser/diff/diff.go index a16aaaf..6179082 100644 --- a/internal/parser/diff/diff.go +++ b/internal/parser/diff/diff.go @@ -52,6 +52,7 @@ func isWhitespace(b byte) bool { // myersDiff computes the Myers' diff between two slices of strings. // src: https://github.com/cj1128/myers-diff/blob/master/main.go +// TODO: it has O(n^2) time complexity func myersDiff(src, dst []string, compareSpace bool) []operation { n := len(src) m := len(dst) diff --git a/internal/parser/diff/parser.go b/internal/parser/diff/parser.go index aed0324..71e174a 100644 --- a/internal/parser/diff/parser.go +++ b/internal/parser/diff/parser.go @@ -74,20 +74,26 @@ func (*Diff) Run(results []stage.ExecutorResult, confAny any) ( comment += fmt.Sprintf("Difference found in `%s`\n", output.FileName) if !output.AlwaysHide { - // Convert answer to string and split by lines - stdoutLines := strings.Split(string(answer), "\n") - resultLines := strings.Split( - result.Files[output.FileName], "\n") - - // Generate Myers diff - diffOps := myersDiff(stdoutLines, resultLines, - output.CompareSpace) if output.MaxDiffLength == 0 { // real default value output.MaxDiffLength = 2048 } + // Convert answer to string and split by lines + answerStr := string(answer) + resultStr := result.Files[output.FileName] + if len(answerStr) > output.MaxDiffLength { + answerStr = answerStr[:output.MaxDiffLength] + } + if len(resultStr) > output.MaxDiffLength { + resultStr = resultStr[:output.MaxDiffLength] + } + answerLines := strings.Split(answerStr, "\n") + resultLines := strings.Split(resultStr, "\n") + // Generate Myers diff + diffOps := myersDiff(answerLines, resultLines, + output.CompareSpace) // Generate diff block with surrounding context diffOutput := generateDiffWithContext( - stdoutLines, + answerLines, resultLines, diffOps, output.MaxDiffLength,