diff --git a/cmd/lint.go b/cmd/lint.go index ffd8028342..f1c8c45685 100644 --- a/cmd/lint.go +++ b/cmd/lint.go @@ -47,7 +47,7 @@ func lintCommandAction(cmd *cobra.Command, args []string) error { if err != nil { for _, f := range readmeFiles { if !f.UpToDate { - cmd.Printf("%s is outdated. Rebuild the package with 'elastic-package build'\n", f.FileName) + cmd.Printf("%s is outdated. Rebuild the package with 'elastic-package build'\n%s", f.FileName, f.Diff) } if f.Error != nil { cmd.Printf("check if %s is up-to-date failed: %s\n", f.FileName, f.Error) diff --git a/internal/docs/readme.go b/internal/docs/readme.go index f39a59948e..97e6303e54 100644 --- a/internal/docs/readme.go +++ b/internal/docs/readme.go @@ -12,6 +12,7 @@ import ( "text/template" "github.com/pkg/errors" + "github.com/pmezard/go-difflib/difflib" "github.com/elastic/elastic-package/internal/builder" "github.com/elastic/elastic-package/internal/logger" @@ -22,6 +23,7 @@ import ( type ReadmeFile struct { FileName string UpToDate bool + Diff string Error error } @@ -40,11 +42,12 @@ func AreReadmesUpToDate() ([]ReadmeFile, error) { var readmeFiles []ReadmeFile for _, filePath := range files { fileName := filepath.Base(filePath) - ok, err := isReadmeUpToDate(fileName, packageRoot) + ok, diff, err := isReadmeUpToDate(fileName, packageRoot) if !ok || err != nil { readmeFile := ReadmeFile{ FileName: fileName, UpToDate: ok, + Diff: diff, Error: err, } readmeFiles = append(readmeFiles, readmeFile) @@ -52,30 +55,41 @@ func AreReadmesUpToDate() ([]ReadmeFile, error) { } if readmeFiles != nil { - return readmeFiles, fmt.Errorf("checking readme files are up-to-date failed") + return readmeFiles, fmt.Errorf("files do not match") } return readmeFiles, nil } -func isReadmeUpToDate(fileName, packageRoot string) (bool, error) { +func isReadmeUpToDate(fileName, packageRoot string) (bool, string, error) { logger.Debugf("Check if %s is up-to-date", fileName) rendered, shouldBeRendered, err := generateReadme(fileName, packageRoot) if err != nil { - return false, errors.Wrap(err, "generating readme file failed") + return false, "", errors.Wrap(err, "generating readme file failed") } if !shouldBeRendered { - return true, nil // README file is static and doesn't use template. + return true, "", nil // README file is static and doesn't use template. } existing, found, err := readReadme(fileName, packageRoot) if err != nil { - return false, errors.Wrap(err, "reading README file failed") + return false, "", errors.Wrap(err, "reading README file failed") } if !found { - return false, nil + return false, "", nil } - return bytes.Equal(existing, rendered), nil + if bytes.Equal(existing, rendered) { + return true, "", nil + } + var buf bytes.Buffer + err = difflib.WriteUnifiedDiff(&buf, difflib.UnifiedDiff{ + A: difflib.SplitLines(string(existing)), + B: difflib.SplitLines(string(rendered)), + FromFile: "want", + ToFile: "got", + Context: 1, + }) + return false, buf.String(), err } // UpdateReadmes function updates all .md readme files using a defined template @@ -219,7 +233,7 @@ func writeReadme(fileName, packageRoot string, content []byte) (string, error) { docsPath := docsPath(packageRoot) logger.Debugf("Create directories: %s", docsPath) - err := os.MkdirAll(docsPath, 0755) + err := os.MkdirAll(docsPath, 0o755) if err != nil { return "", errors.Wrapf(err, "mkdir failed (path: %s)", docsPath) } @@ -227,7 +241,7 @@ func writeReadme(fileName, packageRoot string, content []byte) (string, error) { aReadmePath := readmePath(fileName, packageRoot) logger.Debugf("Write %s file to: %s", fileName, aReadmePath) - err = os.WriteFile(aReadmePath, content, 0644) + err = os.WriteFile(aReadmePath, content, 0o644) if err != nil { return "", errors.Wrapf(err, "writing file failed (path: %s)", aReadmePath) }