diff --git a/kyaml/copyutil/copyutil.go b/kyaml/copyutil/copyutil.go index 53e3cd6ff..fa1891110 100644 --- a/kyaml/copyutil/copyutil.go +++ b/kyaml/copyutil/copyutil.go @@ -121,17 +121,23 @@ func Diff(sourceDir, destDir string) (sets.String, error) { return diff, err } if !bytes.Equal(b1, b2) { - dmp := diffmatchpatch.New() - diffs := dmp.DiffMain(string(b1), string(b2), false) - fmt.Println(dmp.DiffPrettyText(diffs)) + fmt.Println(PrettyFileDiff(string(b1), string(b2))) diff.Insert(f) } } - // return the differing files return diff, nil } +// PrettyFileDiff takes the content of two files and returns the pretty diff +func PrettyFileDiff(s1, s2 string) string { + dmp := diffmatchpatch.New() + wSrc, wDst, warray := dmp.DiffLinesToRunes(s1, s2) + diffs := dmp.DiffMainRunes(wSrc, wDst, false) + diffs = dmp.DiffCharsToLines(diffs, warray) + return dmp.DiffPrettyText(diffs) +} + // SyncFile copies file from src file path to a dst file path by replacement // deletes dst file if src file doesn't exist func SyncFile(src, dst string) error { diff --git a/kyaml/copyutil/copyutil_test.go b/kyaml/copyutil/copyutil_test.go index 33446572b..02ac7a57b 100644 --- a/kyaml/copyutil/copyutil_test.go +++ b/kyaml/copyutil/copyutil_test.go @@ -261,3 +261,25 @@ func TestSyncFileNoSrcFile(t *testing.T) { assert.Error(t, err) assert.True(t, strings.Contains(err.Error(), "no such file or directory")) } + +func TestPrettyFileDiff(t *testing.T) { + s1 := `apiVersion: someversion/v1alpha2 +kind: ContainerCluster +metadata: + clusterName: "some_cluster" + name: asm-cluster + namespace: "PROJECT_ID" # {"$ref":"#/definitions/io.k8s.cli.setters.gcloud.core.project"}` + + s2 := `apiVersion: someversion/v1alpha2 +kind: ContainerCluster +metadata: + clusterName: "some_cluster" + name: asm-cluster + namespace: "some_project" # {"$ref":"#/definitions/io.k8s.cli.setters.gcloud.core.project"}` + + expectedLine1 := `[31m namespace: "PROJECT_ID" # {"$ref":"#/definitions/io.k8s.cli.setters.gcloud.core.project"}` + expectedLine2 := `[32m namespace: "some_project" # {"$ref":"#/definitions/io.k8s.cli.setters.gcloud.core.project"}` + + assert.Contains(t, PrettyFileDiff(s1, s2), expectedLine1) + assert.Contains(t, PrettyFileDiff(s1, s2), expectedLine2) +}