mirror of
https://github.com/turbot/steampipe.git
synced 2026-02-23 08:00:51 -05:00
106 lines
2.7 KiB
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
|
|
}
|