summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2025-10-16 17:55:14 -0500
committerJeff Carr <[email protected]>2025-10-16 17:55:14 -0500
commitc14367731106c50ff790c5eb4e0cdedc32f0ddd1 (patch)
treea2aa7d340b9104625bb620c7e6329b23fb495a9d
parent4ef067cba11c91a2c8b4ffaf1247ad420545e864 (diff)
remove .cache/ files automatically in PB version skew
-rw-r--r--load.go75
1 files changed, 55 insertions, 20 deletions
diff --git a/load.go b/load.go
index c9fef7d..48b6d4e 100644
--- a/load.go
+++ b/load.go
@@ -65,70 +65,105 @@ func ConfigLoad(pb proto.Message, argname string, protoname string) error {
}
// loads from the users .cache dir
-// todo: err handling
+// if the .proto file version changes, automatically delete the .pb
+// file. This is important to avoid marshalling garbage data
+// .cache files are treated as such, a "cache" file. don't keep important
+// things in here. argv stores the information here for autodelete
func LoadCache(pb proto.Message, argname string, protoname string) error {
cacheDir, _ := os.UserCacheDir()
fullpath := filepath.Join(cacheDir, argname)
os.MkdirAll(fullpath, os.ModePerm)
fullname := filepath.Join(fullpath, protoname+".pb")
_, err := SetFilename(pb, fullname)
- return errors.Join(err, LoadPB(pb))
+ if err != nil {
+ pb = nil
+ os.Remove(fullname)
+ return err
+ }
+ newver, curver, err := LoadVersionCheckPB(pb)
+ if err != nil {
+ pb = nil
+ os.Remove(fullname)
+ return err
+ }
+ _, _ = newver, curver
+ return nil
}
-// this logic isn't great yet
-func LoadPB(pb proto.Message) error {
+func LoadVersionCheckPB(pb proto.Message) (string, string, error) {
+ var newver string
+ var pbver string
+ var err error
+
fullname, err := GetFilename(pb)
if err != nil {
- return err
+ return newver, pbver, err
}
// text is supposed to be "easy". Don't verify 'version'
if strings.HasSuffix(fullname, ".text") {
- return loadTEXT(pb, fullname)
+ err = loadTEXT(pb, fullname)
+ return newver, pbver, err
}
// verify 'version' for .pb files
// application will panic if they don't match
var worked bool
- ver, err := GetString(pb, "version")
+ newver, err = GetString(pb, "version")
if err != nil {
- return errors.Join(err, errors.New("'Version' is not in: "+fullname))
+ return newver, pbver, err
}
// maybe don't really verify .json files (?)
// doing it for now anyway. maybe just return an error
if strings.HasSuffix(fullname, ".json") {
- if err := loadJSON(pb, fullname); err != nil {
- return err
+ if err = loadJSON(pb, fullname); err != nil {
+ return newver, pbver, err
}
worked = true
}
if strings.HasSuffix(fullname, ".pb") {
- if err := loadPB(pb, fullname); err != nil {
- return err
+ if err = loadPB(pb, fullname); err != nil {
+ return newver, pbver, err
}
- _, err := SetFilename(pb, fullname)
+ _, err = SetFilename(pb, fullname)
if err != nil {
- return err
+ return newver, pbver, err
}
worked = true
}
if !worked {
- return fmt.Errorf("unknown filetype '%s'", fullname)
+ return newver, pbver, fmt.Errorf("unknown filetype '%s'", fullname)
+ }
+ // get the version from the current PB saved on disk
+ pbver, _ = GetString(pb, "version")
+ if newver != pbver {
+ return newver, pbver, VersionMismatch
+ }
+ return newver, pbver, nil
+}
+
+// uses the version to panic. This is needed because loading binary
+// protobuf files with rearranged messages is indeterminate
+func LoadPB(pb proto.Message) error {
+ fullname, err := GetFilename(pb)
+ if err != nil {
+ return err
}
- newver, _ := GetString(pb, "version")
- if ver != newver {
+ newver, pbver, err := LoadVersionCheckPB(pb)
+ if newver != pbver {
fmt.Println("")
- fmt.Printf("VERSION '%s' != '%s'\n", ver, newver)
+ fmt.Printf("VERSION new '%s' != cur PB '%s'\n", newver, pbver)
fmt.Println("")
fmt.Println("Your protobuf file is old and can not be loaded")
fmt.Println("your application must decide how to handle this (delete or fix)")
fmt.Println("always panic here. application is broken")
fmt.Println("You must delete or convert the file", fullname)
fmt.Println("")
- // probably should ALWAYS PANIC HERE // upon further study, always panic here is better than not
+ // probably should ALWAYS PANIC HERE
+ // upon further study, always panic here is better than not
s := fmt.Sprintf("protobuf version wrong. delete or fix %s", fullname)
panic(s)
}
- return nil
+ return err
}
func LoadFromFilename(pb proto.Message, fullname string) error {