Files
steampipe/pkg/ociinstaller/versionfile/plugin_version_file.go

106 lines
2.7 KiB
Go

package versionfile
import (
"encoding/json"
"log"
"os"
"github.com/turbot/go-kit/helpers"
"github.com/turbot/steampipe/pkg/filepaths"
"github.com/turbot/steampipe/pkg/migrate"
)
const PluginStructVersion = 20220411
type PluginVersionFile struct {
Plugins map[string]*InstalledVersion `json:"plugins"`
StructVersion int64 `json:"struct_version"`
}
// IsValid checks whether the struct was correctly deserialized,
// by checking if the StructVersion is populated
func (f PluginVersionFile) IsValid() bool {
return f.StructVersion > 0
}
func (f *PluginVersionFile) MigrateFrom() migrate.Migrateable {
f.StructVersion = PluginStructVersion
for p := range f.Plugins {
f.Plugins[p].MigrateLegacy()
}
return f
}
func NewPluginVersionFile() *PluginVersionFile {
return &PluginVersionFile{
Plugins: map[string]*InstalledVersion{},
StructVersion: PluginStructVersion,
}
}
func pluginVersionFileFromLegacy(legacyFile *LegacyCompositeVersionFile) *PluginVersionFile {
return &PluginVersionFile{
Plugins: legacyFile.Plugins,
}
}
// LoadPluginVersionFile migrates from the old version file format if necessary and loads the plugin version data
func LoadPluginVersionFile() (*PluginVersionFile, error) {
versionFilePath := filepaths.PluginVersionFilePath()
if helpers.FileExists(versionFilePath) {
return readPluginVersionFile(versionFilePath)
}
return NewPluginVersionFile(), nil
}
// Save writes the config file to disk
func (f *PluginVersionFile) Save() error {
// set struct version
f.StructVersion = PluginStructVersion
versionFilePath := filepaths.PluginVersionFilePath()
// maintain the legacy properties for backward compatibility
for _, v := range f.Plugins {
v.MaintainLegacy()
}
return f.write(versionFilePath)
}
func (f *PluginVersionFile) write(path string) error {
versionFileJSON, err := json.MarshalIndent(f, "", " ")
if err != nil {
log.Println("[ERROR]", "Error while writing version file", err)
return err
}
return os.WriteFile(path, versionFileJSON, 0644)
}
// delete the file on disk if it exists
func (f *PluginVersionFile) delete() {
versionFilePath := filepaths.PluginVersionFilePath()
if helpers.FileExists(versionFilePath) {
os.Remove(versionFilePath)
}
}
func readPluginVersionFile(path string) (*PluginVersionFile, error) {
file, _ := os.ReadFile(path)
var data PluginVersionFile
if err := json.Unmarshal([]byte(file), &data); err != nil {
log.Println("[ERROR]", "Error while reading plugin version file", err)
return nil, err
}
if data.Plugins == nil {
data.Plugins = map[string]*InstalledVersion{}
}
for key := range data.Plugins {
// hard code the name to the key
data.Plugins[key].Name = key
}
return &data, nil
}