diff --git a/diffmatchpatch/diff.go b/diffmatchpatch/diff.go index 0f0f88f..6c5383e 100644 --- a/diffmatchpatch/diff.go +++ b/diffmatchpatch/diff.go @@ -1338,19 +1338,23 @@ func (dmp *DiffMatchPatch) diffLinesToStrings(text1, text2 string) (string, stri // So we'll insert a junk entry to avoid generating a null character. lineArray := []string{""} // e.g. lineArray[4] == 'Hello\n' + lineHash := make(map[string]int) // Each string has the index of lineArray which it points to - strIndexArray1 := dmp.diffLinesToStringsMunge(text1, &lineArray) - strIndexArray2 := dmp.diffLinesToStringsMunge(text2, &lineArray) + strIndexArray1 := dmp.diffLinesToStringsMunge(text1, &lineArray, lineHash) + strIndexArray2 := dmp.diffLinesToStringsMunge(text2, &lineArray, lineHash) return intArrayToString(strIndexArray1), intArrayToString(strIndexArray2), lineArray } // diffLinesToStringsMunge splits a text into an array of strings, and reduces the texts to a []string. -func (dmp *DiffMatchPatch) diffLinesToStringsMunge(text string, lineArray *[]string) []uint32 { +func (dmp *DiffMatchPatch) diffLinesToStringsMunge( + text string, + lineArray *[]string, + lineHash map[string]int, +) []uint32 { // Walk the text, pulling out a substring for each line. text.split('\n') // would would temporarily double our memory footprint. // Modifying text would create many large strings to garbage collect. - lineHash := map[string]int{} // e.g. lineHash['Hello\n'] == 4 lineStart := 0 lineEnd := -1 strs := []uint32{} diff --git a/diffmatchpatch/diff_test.go b/diffmatchpatch/diff_test.go index f8f7982..dbabb2f 100644 --- a/diffmatchpatch/diff_test.go +++ b/diffmatchpatch/diff_test.go @@ -306,6 +306,8 @@ func TestDiffLinesToChars(t *testing.T) { {"a", "b", "1", "2", []string{"", "a", "b"}}, // Omit final newline. {"alpha\nbeta\nalpha", "", "1,2,3", "", []string{"", "alpha\n", "beta\n", "alpha"}}, + // Same lines in Text1 and Text2 + {"abc\ndefg\n12345\n", "abc\ndef\n12345\n678", "1,2,3", "1,4,3,5", []string{"", "abc\n", "defg\n", "12345\n", "def\n", "678"}}, } { actualChars1, actualChars2, actualLines := dmp.DiffLinesToChars(tc.Text1, tc.Text2) assertEqual(t, tc.ExpectedChars1, actualChars1, fmt.Sprintf("Test case #%d, %#v", i, tc))