diff --git a/cmd/commandfuncs.go b/cmd/commandfuncs.go index 3cbe85b908d..79604d93649 100644 --- a/cmd/commandfuncs.go +++ b/cmd/commandfuncs.go @@ -32,6 +32,7 @@ import ( "sort" "strings" + "github.com/aryann/difflib" "github.com/caddyserver/caddy/v2" "github.com/caddyserver/caddy/v2/caddyconfig" "github.com/caddyserver/caddy/v2/caddyconfig/caddyfile" @@ -569,6 +570,20 @@ func cmdFmt(fl Flags) (int, error) { if err := os.WriteFile(formatCmdConfigFile, output, 0600); err != nil { return caddy.ExitCodeFailedStartup, fmt.Errorf("overwriting formatted file: %v", err) } + } else if fl.Bool("diff") { + diff := difflib.Diff( + strings.Split(string(input), "\n"), + strings.Split(string(output), "\n")) + for _, d := range diff { + switch d.Delta { + case difflib.Common: + fmt.Printf(" %s\n", d.Payload) + case difflib.LeftOnly: + fmt.Printf("- %s\n", d.Payload) + case difflib.RightOnly: + fmt.Printf("+ %s\n", d.Payload) + } + } } else { fmt.Print(string(output)) } diff --git a/cmd/commands.go b/cmd/commands.go index 0c68b7c87a0..51960f34dc1 100644 --- a/cmd/commands.go +++ b/cmd/commands.go @@ -282,12 +282,18 @@ human readability. It prints the result to stdout. If --overwrite is specified, the output will be written to the config file directly instead of printing it. +If --diff is specified, the output will be compared against the input, and +lines will be prefixed with '-' and '+' where they differ. Note that +unchanged lines are prefixed with two spaces for alignment, and that this +is not a valid patch format. + If you wish you use stdin instead of a regular file, use - as the path. When reading from stdin, the --overwrite flag has no effect: the result is always printed to stdout.`, Flags: func() *flag.FlagSet { fs := flag.NewFlagSet("fmt", flag.ExitOnError) fs.Bool("overwrite", false, "Overwrite the input file with the results") + fs.Bool("diff", false, "Print the differences between the input file and the formatted output") return fs }(), })