From 374378a2033cf4852f41a2b91dae8eafe37d5261 Mon Sep 17 00:00:00 2001 From: Sofiia Tesliuk <33581458+sofiia-tesliuk@users.noreply.github.com> Date: Thu, 5 Nov 2020 19:31:11 +0200 Subject: [PATCH 1/9] Move check if diff is out of content source to process of unchanged/deleted lines; --- patchutils.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/patchutils.go b/patchutils.go index 5222170..86163f9 100644 --- a/patchutils.go +++ b/patchutils.go @@ -312,6 +312,9 @@ func applyDiff(source string, diffFile *diff.FileDiff) (string, error) { if strings.HasPrefix(line, "+") { newBody = append(newBody, line[1:]) } else { + if currentOrgSourceI > int32(len(sourceBody)) { + return "", errors.New("diff content is out of source content") + } if line[1:] != sourceBody[currentOrgSourceI-1] { return "", fmt.Errorf( "line %d in source (%q) and diff (%q): %w", From 4777504951b097cd1a5151ae4e697a5a6f7e1539 Mon Sep 17 00:00:00 2001 From: Sofiia Tesliuk <33581458+sofiia-tesliuk@users.noreply.github.com> Date: Thu, 5 Nov 2020 19:58:12 +0200 Subject: [PATCH 2/9] Used cmp.Equal in tests; --- patchutils_test.go | 51 +++++++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/patchutils_test.go b/patchutils_test.go index bbdd654..29d8001 100644 --- a/patchutils_test.go +++ b/patchutils_test.go @@ -176,19 +176,17 @@ func init() { func TestInterDiffMode(t *testing.T) { for _, tt := range interDiffFileTests { t.Run(tt.resultFile, func(t *testing.T) { - var fileA, errA = os.Open(tt.diffAFile) - var fileB, errB = os.Open(tt.diffBFile) - - if errA != nil { + fileA, err := os.Open(tt.diffAFile) + if err != nil { t.Errorf("Error in opening %s file.", tt.diffAFile) } - - if errB != nil { + + fileB, err := os.Open(tt.diffBFile) + if err != nil { t.Errorf("Error in opening %s file.", tt.diffBFile) } correctResult, err := ioutil.ReadFile(tt.resultFile) - if err != nil { t.Error(err) } @@ -197,11 +195,13 @@ func TestInterDiffMode(t *testing.T) { var readerB io.Reader = fileB currentResult, err := InterDiff(readerA, readerB) - + + want := normalizeNewlines(correctResult) + got := normalizeNewlines([]byte(currentResult)) if (tt.wantErr == nil) && (err == nil) { - if d := cmp.Diff(normalizeNewlines(correctResult), normalizeNewlines([]byte(currentResult))); d != "" { + if !cmp.Equal(want, got){ t.Errorf("File contents mismatch for %s (-want +got):\n%s", - tt.resultFile, d) + tt.resultFile, cmp.Diff(want, got)) } } else if !errors.Is(err, tt.wantErr) { t.Errorf("Interdiff mode for %q: got error %v; want error %v", tt.resultFile, err, tt.wantErr) @@ -234,10 +234,13 @@ func TestApplyDiff(t *testing.T) { } currentResult, err := applyDiff(string(source), d) + + want := normalizeNewlines(correctResult) + got := normalizeNewlines([]byte(currentResult)) if (tt.wantErr == nil) && (err == nil) { - if d := cmp.Diff(normalizeNewlines(correctResult), normalizeNewlines([]byte(currentResult))); d != "" { + if !cmp.Equal(want, got) { t.Errorf("File contents mismatch for %s (-want +got):\n%s", - tt.resultFile, d) + tt.resultFile, cmp.Diff(want, got)) } } else if !errors.Is(err, tt.wantErr) { t.Errorf("Applying diff for %q: got error %v; want error %v", tt.resultFile, err, tt.wantErr) @@ -293,10 +296,12 @@ func TestMixedMode(t *testing.T) { t.Errorf("printing result diff for file %q: %v", tt.resultFile, err) } - - if d := cmp.Diff(normalizeNewlines(correctResult), normalizeNewlines([]byte(currentResult))); d != "" { + + want := normalizeNewlines(correctResult) + got := normalizeNewlines([]byte(currentResult)) + if !cmp.Equal(want, got) { t.Errorf("File contents mismatch for %s (-want +got):\n%s", - tt.resultFile, d) + tt.resultFile, cmp.Diff(want, got)) } }) } @@ -335,10 +340,12 @@ func TestMixedModeFile(t *testing.T) { if err != nil { t.Errorf("Mixed mode for %q: got error %v; want error nil", tt.resultFile, err) } - - if d := cmp.Diff(normalizeNewlines(correctResult), normalizeNewlines([]byte(currentResult))); d != "" { + + want := normalizeNewlines(correctResult) + got := normalizeNewlines([]byte(currentResult)) + if !cmp.Equal(want, got) { t.Errorf("File contents mismatch for %s (-want +got):\n%s", - tt.resultFile, d) + tt.resultFile, cmp.Diff(want, got)) } }) } @@ -370,10 +377,12 @@ func TestMixedModePath(t *testing.T) { if err != nil { t.Errorf("MixedModePath for %q: got error %v; want error nil", tt.resultFile, err) } - - if d := cmp.Diff(normalizeNewlines(correctResult), normalizeNewlines([]byte(currentResult))); d != "" { + + want := normalizeNewlines(correctResult) + got := normalizeNewlines([]byte(currentResult)) + if !cmp.Equal(want, got) { t.Errorf("File contents mismatch for %s (-want +got):\n%s", - tt.resultFile, d) + tt.resultFile, cmp.Diff(want, got)) } } }) From 6e1f7da3cdabfb135e9dcf5dcc7a216459f31b34 Mon Sep 17 00:00:00 2001 From: Sofiia Tesliuk <33581458+sofiia-tesliuk@users.noreply.github.com> Date: Thu, 5 Nov 2020 20:24:53 +0200 Subject: [PATCH 3/9] Add test case with f6; --- patchutils_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/patchutils_test.go b/patchutils_test.go index 29d8001..eb905af 100644 --- a/patchutils_test.go +++ b/patchutils_test.go @@ -127,6 +127,14 @@ var mixedModePathFileTests = []struct { resultFile: "mi_f7_od_nd.diff", wantErr: false, }, + { + oldSource: "mixed_old_source/f6_no_changes_to_olddiff.txt", + oldDiffFile: "mi_f6_os_od.diff", + newSource: "mixed_new_source/f6_no_changes_to_olddiff.txt", + newDiffFile: "mi_f6_ns_nd.diff", + resultFile: "mi_f6_od_nd.diff", + wantErr: false, + }, { oldSource: "mixed_old_source", oldDiffFile: "mi_os_od.diff", From d2b8724eecfb9db3d9c17598ea052193eedb1dbf Mon Sep 17 00:00:00 2001 From: Sofiia Tesliuk <33581458+sofiia-tesliuk@users.noreply.github.com> Date: Fri, 6 Nov 2020 00:57:19 +0200 Subject: [PATCH 4/9] allow processing empty diff files in MixedModePath; --- patchutils.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/patchutils.go b/patchutils.go index 86163f9..60c43f1 100644 --- a/patchutils.go +++ b/patchutils.go @@ -243,8 +243,11 @@ func MixedModePath(oldSourcePath, newSourcePath string, oldDiff, newDiff io.Read // Both sources are files oldD, err := diff.NewFileDiffReader(oldDiff).Read() if err != nil { - return "", fmt.Errorf("parsing oldDiff for %q: %w", - oldSourcePath, err) + if !errors.Is(err, io.EOF){ + return "", fmt.Errorf("parsing oldDiff for %q: %w", + oldSourcePath, err) + } + oldD = nil } if oldSourcePath != oldD.OrigName { @@ -254,8 +257,11 @@ func MixedModePath(oldSourcePath, newSourcePath string, oldDiff, newDiff io.Read newD, err := diff.NewFileDiffReader(newDiff).Read() if err != nil { - return "", fmt.Errorf("parsing newDiff for %q: %w", - newSourcePath, err) + if !errors.Is(err, io.EOF){ + return "", fmt.Errorf("parsing newDiff for %q: %w", + newSourcePath, err) + } + newD = nil } if newSourcePath != newD.OrigName { From ba06094b47485bf90584bd13f62be1757b0d67e6 Mon Sep 17 00:00:00 2001 From: Sofiia Tesliuk <33581458+sofiia-tesliuk@users.noreply.github.com> Date: Fri, 6 Nov 2020 01:33:57 +0200 Subject: [PATCH 5/9] check number of read diff files instead of handling error on read; --- patchutils.go | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/patchutils.go b/patchutils.go index 60c43f1..6800579 100644 --- a/patchutils.go +++ b/patchutils.go @@ -241,34 +241,34 @@ func MixedModePath(oldSourcePath, newSourcePath string, oldDiff, newDiff io.Read switch { case !oldSourceStat.IsDir() && !newSourceStat.IsDir(): // Both sources are files - oldD, err := diff.NewFileDiffReader(oldDiff).Read() + oldDiffs, err := diff.NewFileDiffReader(oldDiff).ReadAllFiles() if err != nil { - if !errors.Is(err, io.EOF){ - return "", fmt.Errorf("parsing oldDiff for %q: %w", - oldSourcePath, err) - } - oldD = nil + return "", fmt.Errorf("parsing oldDiff for %q: %w", + oldSourcePath, err) } - - if oldSourcePath != oldD.OrigName { - return "", fmt.Errorf("filenames mismatch for oldSourcePath: %q and oldDiff: %q", - oldSourcePath, oldD.OrigName) + oldD = nil + if len(oldDiffs) > 0 { + oldD = oldDiffs[0] + if oldSourcePath != oldD.OrigName { + return "", fmt.Errorf("filenames mismatch for oldSourcePath: %q and oldDiff: %q", + oldSourcePath, oldD.OrigName) + } } - - newD, err := diff.NewFileDiffReader(newDiff).Read() + + newDiffs, err := diff.NewFileDiffReader(newDiff).ReadAllFiles() if err != nil { - if !errors.Is(err, io.EOF){ - return "", fmt.Errorf("parsing newDiff for %q: %w", - newSourcePath, err) - } - newD = nil + return "", fmt.Errorf("parsing newDiff for %q: %w", + newSourcePath, err) } - - if newSourcePath != newD.OrigName { - return "", fmt.Errorf("filenames mismatch for newSourcePath: %q and newDiff: %q", - newSourcePath, newD.OrigName) + newD = nil + if len(newDiffs) > 0 { + newD = newDiffs[0] + if newSourcePath != newD.OrigName { + return "", fmt.Errorf("filenames mismatch for newSourcePath: %q and newDiff: %q", + newSourcePath, newD.OrigName) + } } - + resultString, err := mixedModeFilePath(oldSourcePath, newSourcePath, oldD, newD) return resultString, err From 96c3c739d1b1b5b7d5eaa61b426f6b6c03cf41c5 Mon Sep 17 00:00:00 2001 From: Sofiia Tesliuk <33581458+sofiia-tesliuk@users.noreply.github.com> Date: Fri, 6 Nov 2020 01:39:42 +0200 Subject: [PATCH 6/9] changed NewFileDiffReader to NewMultiFileDiffReader; --- patchutils.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/patchutils.go b/patchutils.go index 6800579..6886593 100644 --- a/patchutils.go +++ b/patchutils.go @@ -241,7 +241,7 @@ func MixedModePath(oldSourcePath, newSourcePath string, oldDiff, newDiff io.Read switch { case !oldSourceStat.IsDir() && !newSourceStat.IsDir(): // Both sources are files - oldDiffs, err := diff.NewFileDiffReader(oldDiff).ReadAllFiles() + oldDiffs, err := diff.NewMultiFileDiffReader(oldDiff).ReadAllFiles() if err != nil { return "", fmt.Errorf("parsing oldDiff for %q: %w", oldSourcePath, err) @@ -255,7 +255,7 @@ func MixedModePath(oldSourcePath, newSourcePath string, oldDiff, newDiff io.Read } } - newDiffs, err := diff.NewFileDiffReader(newDiff).ReadAllFiles() + newDiffs, err := diff.NewMultiFileDiffReader(newDiff).ReadAllFiles() if err != nil { return "", fmt.Errorf("parsing newDiff for %q: %w", newSourcePath, err) From 59d92c111b9c39bd033e0cadaacd88b277b9547a Mon Sep 17 00:00:00 2001 From: Sofiia Tesliuk <33581458+sofiia-tesliuk@users.noreply.github.com> Date: Fri, 6 Nov 2020 01:42:32 +0200 Subject: [PATCH 7/9] add missing colon; --- patchutils.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/patchutils.go b/patchutils.go index 6886593..450f1e2 100644 --- a/patchutils.go +++ b/patchutils.go @@ -246,7 +246,7 @@ func MixedModePath(oldSourcePath, newSourcePath string, oldDiff, newDiff io.Read return "", fmt.Errorf("parsing oldDiff for %q: %w", oldSourcePath, err) } - oldD = nil + oldD := nil if len(oldDiffs) > 0 { oldD = oldDiffs[0] if oldSourcePath != oldD.OrigName { @@ -260,7 +260,7 @@ func MixedModePath(oldSourcePath, newSourcePath string, oldDiff, newDiff io.Read return "", fmt.Errorf("parsing newDiff for %q: %w", newSourcePath, err) } - newD = nil + newD := nil if len(newDiffs) > 0 { newD = newDiffs[0] if newSourcePath != newD.OrigName { From 6457fa9356d59ca2c3cbdaba2e5803550959b201 Mon Sep 17 00:00:00 2001 From: Sofiia Tesliuk <33581458+sofiia-tesliuk@users.noreply.github.com> Date: Fri, 6 Nov 2020 01:45:33 +0200 Subject: [PATCH 8/9] add type to the nil assigment; --- patchutils.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/patchutils.go b/patchutils.go index 450f1e2..0ed5158 100644 --- a/patchutils.go +++ b/patchutils.go @@ -246,7 +246,7 @@ func MixedModePath(oldSourcePath, newSourcePath string, oldDiff, newDiff io.Read return "", fmt.Errorf("parsing oldDiff for %q: %w", oldSourcePath, err) } - oldD := nil + var oldD *diff.FileDiff if len(oldDiffs) > 0 { oldD = oldDiffs[0] if oldSourcePath != oldD.OrigName { @@ -260,7 +260,7 @@ func MixedModePath(oldSourcePath, newSourcePath string, oldDiff, newDiff io.Read return "", fmt.Errorf("parsing newDiff for %q: %w", newSourcePath, err) } - newD := nil + var newD *diff.FileDiff if len(newDiffs) > 0 { newD = newDiffs[0] if newSourcePath != newD.OrigName { From feb677fe9ed0ba08fc762530ec56479413bbac4b Mon Sep 17 00:00:00 2001 From: sofiia-tesliuk Date: Fri, 13 Nov 2020 21:55:52 +0200 Subject: [PATCH 9/9] corrected calculation of StartLines and NumberOfLines in convertChunksToFileDiff; --- patchutils.go | 24 ++++++++++++------------ test_examples/mi_f6_ns_nd.diff | 2 -- test_examples/mi_f6_od_nd.diff | 14 ++++---------- test_examples/mi_nd_od.diff | 4 ++-- test_examples/mi_od_nd.diff | 4 +--- 5 files changed, 19 insertions(+), 29 deletions(-) diff --git a/patchutils.go b/patchutils.go index 0ed5158..1250623 100644 --- a/patchutils.go +++ b/patchutils.go @@ -254,7 +254,7 @@ func MixedModePath(oldSourcePath, newSourcePath string, oldDiff, newDiff io.Read oldSourcePath, oldD.OrigName) } } - + newDiffs, err := diff.NewMultiFileDiffReader(newDiff).ReadAllFiles() if err != nil { return "", fmt.Errorf("parsing newDiff for %q: %w", @@ -268,7 +268,7 @@ func MixedModePath(oldSourcePath, newSourcePath string, oldDiff, newDiff io.Read newSourcePath, newD.OrigName) } } - + resultString, err := mixedModeFilePath(oldSourcePath, newSourcePath, oldD, newD) return resultString, err @@ -318,7 +318,7 @@ func applyDiff(source string, diffFile *diff.FileDiff) (string, error) { if strings.HasPrefix(line, "+") { newBody = append(newBody, line[1:]) } else { - if currentOrgSourceI > int32(len(sourceBody)) { + if currentOrgSourceI > int32(len(sourceBody)) { return "", errors.New("diff content is out of source content") } if line[1:] != sourceBody[currentOrgSourceI-1] { @@ -534,7 +534,7 @@ func mixedModeDirPath(oldSourcePath, newSourcePath string, oldDiff, newDiff io.R } // New files have been added to the new version - for filename := range oldFileDiffs { + for filename := range newFileDiffs { result += fmt.Sprintf("Only in %s: %s\n", filepath.Dir(filename), filepath.Base(filename)) } @@ -570,18 +570,18 @@ func convertChunksIntoFileDiff(chunks []dbd.Chunk, fileDiff *diff.FileDiff) { NewStartLine: currentNewI, } // Delete empty chunks in the beginning - for len(chunks) > 0 && len(chunks[0].Added) == 0 && len(chunks[0].Deleted) == 0 && len(chunks[0].Equal) == 0 { + for len(chunks) > 0 && chunks[0].Added == nil && chunks[0].Deleted == nil && chunks[0].Equal == nil { chunks = chunks[1:] } // Delete empty chunks in the end last := len(chunks) - 1 - for len(chunks) > 0 && len(chunks[last].Added) == 0 && len(chunks[last].Deleted) == 0 && len(chunks[last].Equal) == 0 { + for len(chunks) > 0 && chunks[last].Added == nil && chunks[last].Deleted == nil && chunks[last].Equal == nil { chunks = chunks[:last] last-- } // If chunks contains only one element with only unchanged lines - if len(chunks) == 1 && len(chunks[0].Added) == 0 && len(chunks[0].Deleted) == 0 { + if len(chunks) == 1 && chunks[0].Added == nil && chunks[0].Deleted == nil { return } @@ -593,7 +593,7 @@ func convertChunksIntoFileDiff(chunks []dbd.Chunk, fileDiff *diff.FileDiff) { } // If first chunk contains only equal lines, we are adding last contextLines to currentHunk - if len(chunks[0].Added) == 0 && len(chunks[0].Deleted) == 0 { + if chunks[0].Added == nil && chunks[0].Deleted == nil { currentOldI += int32(len(chunks[0].Equal)) currentNewI += int32(len(chunks[0].Equal)) if len(chunks[0].Equal) > contextLines { @@ -625,7 +625,7 @@ func convertChunksIntoFileDiff(chunks []dbd.Chunk, fileDiff *diff.FileDiff) { } } // Removing processed equal lines from last chunk - chunks[last].Equal = []string{} + chunks[last].Equal = nil } for _, c := range chunks { @@ -646,8 +646,8 @@ func convertChunksIntoFileDiff(chunks []dbd.Chunk, fileDiff *diff.FileDiff) { for _, line := range c.Equal[:contextLines] { currentHunkBody = append(currentHunkBody, " "+line) } - currentHunk.OrigLines = currentOldI + contextLines + 1 - currentHunk.OrigStartLine - currentHunk.NewLines = currentNewI + contextLines + 1 - currentHunk.NewStartLine + currentHunk.OrigLines = currentOldI + contextLines - currentHunk.OrigStartLine + currentHunk.NewLines = currentNewI + contextLines - currentHunk.NewStartLine currentHunk.Body = []byte(strings.Join(currentHunkBody, "\n") + "\n") fileDiff.Hunks = append(fileDiff.Hunks, currentHunk) } @@ -662,7 +662,7 @@ func convertChunksIntoFileDiff(chunks []dbd.Chunk, fileDiff *diff.FileDiff) { // Clean currentHunkBody currentHunkBody = []string{} - for _, line := range c.Equal[len(c.Equal)-contextLines-1:] { + for _, line := range c.Equal[len(c.Equal)-contextLines:] { currentHunkBody = append(currentHunkBody, " "+line) } diff --git a/test_examples/mi_f6_ns_nd.diff b/test_examples/mi_f6_ns_nd.diff index a3eb007..6e5173b 100644 --- a/test_examples/mi_f6_ns_nd.diff +++ b/test_examples/mi_f6_ns_nd.diff @@ -5,7 +5,5 @@ Do-do-do-do ah-ah-ah, do-do-do-do, Cities of Gold. Do-do-do-do, Cities of Gold. Ah-ah-ah-ah-ah… -some day we will find The Cities of Gold. -\ No newline at end of file +some day we will find The Cities of Gold. +some day we will find The Cities of Silver. -\ No newline at end of file diff --git a/test_examples/mi_f6_od_nd.diff b/test_examples/mi_f6_od_nd.diff index 508b372..5ce6100 100644 --- a/test_examples/mi_f6_od_nd.diff +++ b/test_examples/mi_f6_od_nd.diff @@ -1,18 +1,12 @@ ---- mixed_updated_old_source/f6_no_changes_to_olddiff.txt 2020-10-30 11:12:55.910740594 +0000 +--- mixed_old_source/f6_no_changes_to_olddiff.txt +++ mixed_updated_new_source/f6_no_changes_to_olddiff.txt 2020-10-30 11:32:22.322300642 +0000 -@@ -1,5 +1,6 @@ +@@ -1,4 +1,5 @@ Text is generated in https://vole.wtf/text-generator/ Children of the sun, +Children of the sun, see your time has just begun, searching for your ways, - through adventures every day. -@@ -11,4 +12,5 @@ - Ah-ah-ah-ah-ah… some day we will find The Cities of Gold. - Do-do-do-do ah-ah-ah, do-do-do-do, Cities of Gold. +@@ -13,2 +14,3 @@ Do-do-do-do, Cities of Gold. Ah-ah-ah-ah-ah… --some day we will find The Cities of Gold. -\ No newline at end of file -+some day we will find The Cities of Gold. + some day we will find The Cities of Gold. +some day we will find The Cities of Silver. -\ No newline at end of file diff --git a/test_examples/mi_nd_od.diff b/test_examples/mi_nd_od.diff index 037e82c..24ce15f 100644 --- a/test_examples/mi_nd_od.diff +++ b/test_examples/mi_nd_od.diff @@ -4,14 +4,13 @@ Only in mixed_updated_new_source: f3_deleted_in_olddiff.txt +++ mixed_old_source/f5_same_in_both_sources.txt --- mixed_updated_new_source/f6_no_changes_to_olddiff.txt +++ mixed_old_source/f6_no_changes_to_olddiff.txt -@@ -1,6 +1,5 @@ +@@ -1,5 +1,4 @@ Text is generated in https://vole.wtf/text-generator/ Children of the sun, -Children of the sun, see your time has just begun, searching for your ways, @@ -14,3 +13,2 @@ - Do-do-do-do ah-ah-ah, do-do-do-do, Cities of Gold. Do-do-do-do, Cities of Gold. Ah-ah-ah-ah-ah… some day we will find The Cities of Gold. -some day we will find The Cities of Silver. @@ -42,3 +41,4 @@ Only in mixed_updated_new_source: f3_deleted_in_olddiff.txt -flowers, rivers, sand and sea, snowflakes and the stars are free. Every day and night, +Only in mixed_updated_old_source: f2_added_in_old_diff.txt diff --git a/test_examples/mi_od_nd.diff b/test_examples/mi_od_nd.diff index 50927f2..73e54ae 100644 --- a/test_examples/mi_od_nd.diff +++ b/test_examples/mi_od_nd.diff @@ -4,14 +4,13 @@ Only in mixed_updated_new_source: f3_deleted_in_olddiff.txt +++ mixed_new_source/f5_same_in_both_sources.txt --- mixed_old_source/f6_no_changes_to_olddiff.txt +++ mixed_updated_new_source/f6_no_changes_to_olddiff.txt -@@ -1,5 +1,6 @@ +@@ -1,4 +1,5 @@ Text is generated in https://vole.wtf/text-generator/ Children of the sun, +Children of the sun, see your time has just begun, searching for your ways, @@ -13,2 +14,3 @@ - Do-do-do-do ah-ah-ah, do-do-do-do, Cities of Gold. Do-do-do-do, Cities of Gold. Ah-ah-ah-ah-ah… some day we will find The Cities of Gold. +some day we will find The Cities of Silver. @@ -43,4 +42,3 @@ Only in mixed_updated_new_source: f3_deleted_in_olddiff.txt snowflakes and the stars are free. Every day and night, Only in mixed_updated_old_source: f2_added_in_old_diff.txt -Only in mixed_updated_old_source: f2_added_in_old_diff.txt