@@ -21,12 +21,14 @@ package main
2121
2222import (
2323 "bytes"
24+ "errors"
2425 "flag"
2526 "fmt"
2627 "go/ast"
2728 "go/format"
2829 "go/parser"
2930 "go/token"
31+ "io/fs"
3032 "log"
3133 "os"
3234 "slices"
@@ -39,6 +41,7 @@ const (
3941)
4042
4143var (
44+ check = flag .Bool ("check" , false , "Check whether generated files are up to date" )
4245 verbose = flag .Bool ("v" , false , "Print verbose log messages" )
4346
4447 sourceTmpl = template .Must (template .New ("source" ).Parse (source ))
6770 }
6871)
6972
73+ func isCheck () bool {
74+ return * check || os .Getenv ("CHECK" ) == "1"
75+ }
76+
7077func logf (fmt string , args ... any ) {
7178 if * verbose {
7279 log .Printf (fmt , args ... )
@@ -233,6 +240,22 @@ func (t *templateData) dump() error {
233240 return fmt .Errorf ("format.Source:\n %v\n %v" , buf .String (), err )
234241 }
235242
243+ if isCheck () {
244+ logf ("Checking %v..." , filename )
245+ old , err := os .ReadFile (filename )
246+ if err != nil {
247+ if errors .Is (err , fs .ErrNotExist ) {
248+ return fmt .Errorf ("Missing file: %v\n " , filename )
249+ }
250+ return err
251+ }
252+
253+ if ! bytes .Equal (old , clean ) {
254+ return fmt .Errorf ("Generated files are out of date. Please run go generate ./... and commit the results" )
255+ }
256+ return nil
257+ }
258+
236259 logf ("Writing %v..." , filename )
237260 if err := os .Chmod (filename , 0o644 ); err != nil {
238261 return fmt .Errorf ("os.Chmod(%q, 0644): %v" , filename , err )
0 commit comments