loader logic revised

This commit is contained in:
IliaDenisov
2026-03-16 15:48:00 +02:00
parent cc7ecf6667
commit e6c6970947
13 changed files with 530 additions and 82 deletions
+73 -8
View File
@@ -1,19 +1,84 @@
package loader
import (
"errors"
"fmt"
"galaxy/connector"
"galaxy/util"
)
func (l *loader) newerVersion(version string) bool {
return util.CompareSemver(util.MustParseSemver(l.client.Version()), util.MustParseSemver(version)) > 0
func (l *loader) checkAndDownloadPluginVersion() error {
versions, err := l.connector.CheckVersion()
if err != nil {
return err
} else if latest, ok, err := latestVersion(versions); err != nil {
return err
} else if ok {
return l.preparePluginVersion(latest)
} else {
return errors.New("Server did not respond with a suitable client version")
}
}
// downloadVersion fetches given version artifact, when newer to the current version,
// and stores at the App's local storage with a pre-defined name with semver suffix
func (l *loader) downloadVersion(v connector.VersionInfo) {
if !l.newerVersion(v.Version) {
return
// preparePluginVersion fetches and stores given version of plugin artifact, if newer to the current known version.
func (l *loader) preparePluginVersion(v connector.VersionInfo) error {
s, exists, err := l.loadCurrentState()
if err != nil {
return err
}
l.connector.DownloadVersion(v.URL)
version, err := util.ParseSemver(v.Version)
if err != nil {
return err
}
if exists {
currentVersion, err := util.ParseSemver(s.ClientCurrentVersion)
if err != nil {
return err
}
if util.CompareSemver(currentVersion, version) > 0 {
return nil
}
}
err = l.downloadPlugin(v.URL, v.Version, v.Checksum)
if err != nil {
return err
}
return nil
}
// downloadPlugin downloads and stores at the App's local storage with a pre-defined name with semver suffix.
func (l *loader) downloadPlugin(url, version string, checksum [32]byte) error {
data, err := l.connector.DownloadVersion(url)
if err != nil {
return fmt.Errorf("Plugin v%s download error: %w", version, err)
}
dataChecksum := SumSHA256(data)
if !EqualSHA256(checksum, dataChecksum) {
return errors.New("Downloaded pligin checksum incorrect")
}
versionFileName := resolvePluginFile(version)
versionFileExists, _, err := l.storage.FileExists(versionFileName)
if err != nil {
return fmt.Errorf("Check plugin v%s exists error: %w", version, err)
}
if versionFileExists {
storedData, err := l.storage.ReadFile(versionFileName)
if err != nil {
return err
}
if EqualSHA256(dataChecksum, SumSHA256(storedData)) {
return nil
}
if err := l.storage.DeleteFile(versionFileName); err != nil {
return fmt.Errorf("Plugin v%s delete error: %w", version, err)
}
}
err = l.storage.WriteFile(versionFileName, data)
if err != nil {
return fmt.Errorf("Plugin file write error: %w", err)
}
if err := l.setNextVersion(&version); err != nil {
return err
}
return nil
}