diff options
| author | Jeff Carr <[email protected]> | 2025-10-16 17:55:14 -0500 |
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2025-10-16 17:55:14 -0500 |
| commit | c14367731106c50ff790c5eb4e0cdedc32f0ddd1 (patch) | |
| tree | a2aa7d340b9104625bb620c7e6329b23fb495a9d | |
| parent | 4ef067cba11c91a2c8b4ffaf1247ad420545e864 (diff) | |
remove .cache/ files automatically in PB version skew
| -rw-r--r-- | load.go | 75 |
1 files changed, 55 insertions, 20 deletions
@@ -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 { |
