From 05653e8195865d70f6255ff7aeae6eb276197092 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Wed, 15 Oct 2025 00:22:37 -0500 Subject: add mtime checks like 'make' for smarter automation --- argv.go | 4 ++-- doClean.go | 77 ----------------------------------------------------------- doMtime.go | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ main.go | 9 ++++--- 4 files changed, 86 insertions(+), 84 deletions(-) delete mode 100644 doClean.go create mode 100644 doMtime.go diff --git a/argv.go b/argv.go index 909df65..c90d486 100644 --- a/argv.go +++ b/argv.go @@ -30,8 +30,8 @@ type args struct { Comments bool `arg:"--format-comments" help:"enforce parseable comments in a .proto file"` NoFormat bool `arg:"--no-format" help:"do not auto-reformat the .proto file"` Renumber bool `arg:"--renumber" help:"renumber everything. obviously breaks backwards compatiblity"` - Clean bool `arg:"--clean" help:"clean out any *pb.go files; bypassing ctime sanity checks"` - Ctime bool `arg:"--ctime" help:"do os.Stat() createtime sanity checks"` + Clean bool `arg:"--clean" help:"clean out any *pb.go files; bypassing mtime sanity checks"` + Mtime bool `arg:"--mtime" help:"do os.Stat() modtime sanity checks"` GoSrc string `arg:"--go-src" help:"default is ~/go/src. could be set to your go.work path"` GoPath string `arg:"--gopath" help:"the gopath of this repo"` Identify string `arg:"--identify" help:"identify file"` diff --git a/doClean.go b/doClean.go deleted file mode 100644 index d1af455..0000000 --- a/doClean.go +++ /dev/null @@ -1,77 +0,0 @@ -//go:build go1.20 -// +build go1.20 - -// Copyright 2017-2025 WIT.COM Inc. All rights reserved. -// Use of this source code is governed by the GPL 3.0 - -// protobuf the way I am using them, require GO 1.20. I think. I could be wrong. -// The Go Protocol Buffers library embeds a sync.Mutex within the MessageState struct to prevent unintended shallow copies of message structs -// this optionally (but it is the default) inserts a mutex into the struct generated by protoc - -// go:generate autogenpb --proto file.proto - -package main - -import ( - "errors" - "os" - "path/filepath" - - "go.wit.com/log" -) - -func doClean(filebase string) error { - globPattern := filebase + ".*.pb.go" - files, err := filepath.Glob(globPattern) - if err != nil { - log.Info("glob error", err, files) - } - for _, filename := range files { - // err += os.Remove(filename) - err = errors.Join(err, os.Remove(filename)) - } - log.Info("Removed:", files) - return err -} - -// is true if no errors and nothing is new -func doCtime(filebase string) bool { - var allerr error - statf, err := os.Stat(filebase + ".proto") - allerr = errors.Join(allerr, err) - basetime := statf.ModTime() - globPattern := filebase + ".*.pb.go" - files, err := filepath.Glob(globPattern) - if err != nil { - log.Info("glob error", err, files) - allerr = errors.Join(allerr, err) - } - if len(files) == 0 { - log.Info("no pb.go files found. need to re-run") - return false - } - for _, filename := range files { - fstats, err := os.Stat(filename) - allerr = errors.Join(allerr, err) - newtime := fstats.ModTime() - if basetime.Before(newtime) { - // everything is okay - // log.Info(filebase+".proto was older than", filename) - } else { - log.Info(filebase+".proto was newer than", filename) - // need to rerun - err := doClean(filebase) - allerr = errors.Join(allerr, err) - if allerr != nil { - log.Info("autogenpb doCtime() had errors:", allerr) - } - return false - } - } - log.Info(filebase + ".proto was older than all pb.go files. No need to re-run autogenpb.") - if allerr == nil { - return true - } - log.Info("autogenpb doCtime() had errors:", allerr) - return false -} diff --git a/doMtime.go b/doMtime.go new file mode 100644 index 0000000..4f69642 --- /dev/null +++ b/doMtime.go @@ -0,0 +1,80 @@ +//go:build go1.20 +// +build go1.20 + +// Copyright 2017-2025 WIT.COM Inc. All rights reserved. +// Use of this source code is governed by the GPL 3.0 + +// protobuf the way I am using them, require GO 1.20. I think. I could be wrong. +// The Go Protocol Buffers library embeds a sync.Mutex within the MessageState struct to prevent unintended shallow copies of message structs +// this optionally (but it is the default) inserts a mutex into the struct generated by protoc + +// go:generate autogenpb --proto file.proto + +package main + +import ( + "errors" + "os" + "path/filepath" + + "go.wit.com/lib/config" + "go.wit.com/log" +) + +func doClean(filebase string) error { + globPattern := filebase + "*.pb.go" + files, err := filepath.Glob(globPattern) + if err != nil { + log.Info("glob error", err, files) + } + for _, filename := range files { + // err += os.Remove(filename) + err = errors.Join(err, os.Remove(filename)) + } + log.Info("Removed:", files) + return err +} + +// is true if no errors and nothing is new +func doMtime(filebase string) bool { + var allerr error + statf, err := os.Stat(filebase + ".proto") + allerr = errors.Join(allerr, err) + basetime := statf.ModTime() + globPattern := filebase + "*.pb.go" + files, err := filepath.Glob(globPattern) + if err != nil { + log.Info("glob error", err, files) + allerr = errors.Join(allerr, err) + } + if len(files) == 0 { + log.Info("no pb.go files found. need to re-run") + return false + } + for _, filename := range files { + fstats, err := os.Stat(filename) + allerr = errors.Join(allerr, err) + newtime := fstats.ModTime() + if basetime.Before(newtime) { + // everything is okay + // log.Info(filebase+".proto was older than", filename) + } else { + log.Info(filebase+".proto was newer than", filename) + // need to rerun + err := doClean(filebase) + allerr = errors.Join(allerr, err) + if allerr != nil { + log.Info("autogenpb doMtime() had errors:", allerr) + } + return false + } + } + if config.Verbose() { + log.Info(filebase + ".proto was older than all pb.go files. No need to re-run autogenpb.") + } + if allerr == nil { + return true + } + log.Info("autogenpb doMtime() had errors:", allerr) + return false +} diff --git a/main.go b/main.go index 8f97dd8..485be83 100644 --- a/main.go +++ b/main.go @@ -77,8 +77,8 @@ func doProto(argvProto string) error { me.sh.GoodExit("doClean() ran") } - if argv.Ctime { - doCtime(pf.Filebase) + if argv.Mtime { + doMtime(pf.Filebase) me.sh.GoodExit("doClean() ran") } @@ -100,9 +100,8 @@ func doProto(argvProto string) error { os.Setenv("PROTOBUF_REGRET", "true") } - if doCtime(pf.Filebase) { - log.Info("nothing changed. exit here") - me.sh.GoodExit("doCtime() ran") + if doMtime(pf.Filebase) { + me.sh.GoodExit(pf.Filename + " did not change") } else { log.Info("ctime check: need to re-run autogenpb") } -- cgit v1.2.3