mirror of
https://github.com/safing/portbase
synced 2025-09-01 18:19:57 +00:00
Merge pull request #221 from safing/fix/version-selection
Fix version selection
This commit is contained in:
commit
01b03aa936
4 changed files with 41 additions and 11 deletions
|
@ -43,8 +43,12 @@ type ResourceRegistry struct {
|
||||||
// version. Even if false, a pre-release version will still be used if it is
|
// version. Even if false, a pre-release version will still be used if it is
|
||||||
// defined as the current version by an index.
|
// defined as the current version by an index.
|
||||||
UsePreReleases bool
|
UsePreReleases bool
|
||||||
DevMode bool
|
|
||||||
Online bool
|
// DevMode specifies if a local 0.0.0 version should be always chosen, when available.
|
||||||
|
DevMode bool
|
||||||
|
|
||||||
|
// Online specifies if resources may be downloaded if not available locally.
|
||||||
|
Online bool
|
||||||
|
|
||||||
// StateNotifyFunc may be set to receive any changes to the registry state.
|
// StateNotifyFunc may be set to receive any changes to the registry state.
|
||||||
// The specified function may lock the state, but may not block or take a
|
// The specified function may lock the state, but may not block or take a
|
||||||
|
|
|
@ -112,7 +112,26 @@ func (rv *ResourceVersion) EqualsVersion(version string) bool {
|
||||||
// A version is selectable if it's not blacklisted and either already locally
|
// A version is selectable if it's not blacklisted and either already locally
|
||||||
// available or ready to be downloaded.
|
// available or ready to be downloaded.
|
||||||
func (rv *ResourceVersion) isSelectable() bool {
|
func (rv *ResourceVersion) isSelectable() bool {
|
||||||
return !rv.Blacklisted && (rv.Available || rv.resource.registry.Online)
|
switch {
|
||||||
|
case rv.Blacklisted:
|
||||||
|
// Should not be used.
|
||||||
|
return false
|
||||||
|
case rv.Available:
|
||||||
|
// Is available locally, use!
|
||||||
|
return true
|
||||||
|
case !rv.resource.registry.Online:
|
||||||
|
// Cannot download, because registry is set to offline.
|
||||||
|
return false
|
||||||
|
case rv.resource.Index == nil:
|
||||||
|
// Cannot download, because resource is not part of an index.
|
||||||
|
return false
|
||||||
|
case !rv.resource.Index.AutoDownload:
|
||||||
|
// Cannot download, because index may not automatically download.
|
||||||
|
return false
|
||||||
|
default:
|
||||||
|
// Is not available locally, but we are allowed to download it on request!
|
||||||
|
return true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// isBetaVersionNumber checks if rv is marked as a beta version by checking
|
// isBetaVersionNumber checks if rv is marked as a beta version by checking
|
||||||
|
@ -290,8 +309,13 @@ func (res *Resource) selectVersion() {
|
||||||
sort.Sort(res)
|
sort.Sort(res)
|
||||||
|
|
||||||
// export after we finish
|
// export after we finish
|
||||||
|
var fallback bool
|
||||||
defer func() {
|
defer func() {
|
||||||
log.Tracef("updater: selected version %s for resource %s", res.SelectedVersion, res.Identifier)
|
if fallback {
|
||||||
|
log.Tracef("updater: selected version %s (as fallback) for resource %s", res.SelectedVersion, res.Identifier)
|
||||||
|
} else {
|
||||||
|
log.Debugf("updater: selected version %s for resource %s", res.SelectedVersion, res.Identifier)
|
||||||
|
}
|
||||||
|
|
||||||
if res.inUse() &&
|
if res.inUse() &&
|
||||||
res.SelectedVersion != res.ActiveVersion && // new selected version does not match previously selected version
|
res.SelectedVersion != res.ActiveVersion && // new selected version does not match previously selected version
|
||||||
|
@ -356,7 +380,7 @@ func (res *Resource) selectVersion() {
|
||||||
|
|
||||||
// 5) Default to newest.
|
// 5) Default to newest.
|
||||||
res.SelectedVersion = res.Versions[0]
|
res.SelectedVersion = res.Versions[0]
|
||||||
log.Warningf("updater: falling back to version %s for %s because we failed to find a selectable one", res.SelectedVersion, res.Identifier)
|
fallback = true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Blacklist blacklists the specified version and selects a new version.
|
// Blacklist blacklists the specified version and selects a new version.
|
||||||
|
|
|
@ -45,6 +45,8 @@ func TestVersionSelection(t *testing.T) {
|
||||||
registry.UsePreReleases = true
|
registry.UsePreReleases = true
|
||||||
registry.DevMode = true
|
registry.DevMode = true
|
||||||
registry.Online = true
|
registry.Online = true
|
||||||
|
res.Index = &Index{AutoDownload: true}
|
||||||
|
|
||||||
res.selectVersion()
|
res.selectVersion()
|
||||||
if res.SelectedVersion.VersionNumber != "0.0.0" {
|
if res.SelectedVersion.VersionNumber != "0.0.0" {
|
||||||
t.Errorf("selected version should be 0.0.0, not %s", res.SelectedVersion.VersionNumber)
|
t.Errorf("selected version should be 0.0.0, not %s", res.SelectedVersion.VersionNumber)
|
||||||
|
|
|
@ -47,7 +47,7 @@ func (reg *ResourceRegistry) UpdateIndexes(ctx context.Context) error {
|
||||||
// Get pending resources and update status.
|
// Get pending resources and update status.
|
||||||
pendingResourceVersions, _ := reg.GetPendingDownloads(true, false)
|
pendingResourceVersions, _ := reg.GetPendingDownloads(true, false)
|
||||||
reg.state.ReportUpdateCheck(
|
reg.state.ReportUpdateCheck(
|
||||||
identifiersFromResourceVersions(pendingResourceVersions),
|
humanInfoFromResourceVersions(pendingResourceVersions),
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -183,14 +183,14 @@ func (reg *ResourceRegistry) downloadIndex(ctx context.Context, client *http.Cli
|
||||||
}
|
}
|
||||||
|
|
||||||
// DownloadUpdates checks if updates are available and downloads updates of used components.
|
// DownloadUpdates checks if updates are available and downloads updates of used components.
|
||||||
func (reg *ResourceRegistry) DownloadUpdates(ctx context.Context, automaticOnly bool) error {
|
func (reg *ResourceRegistry) DownloadUpdates(ctx context.Context, includeManual bool) error {
|
||||||
// Start registry operation.
|
// Start registry operation.
|
||||||
reg.state.StartOperation(StateDownloading)
|
reg.state.StartOperation(StateDownloading)
|
||||||
defer reg.state.EndOperation()
|
defer reg.state.EndOperation()
|
||||||
|
|
||||||
// Get pending updates.
|
// Get pending updates.
|
||||||
toUpdate, missingSigs := reg.GetPendingDownloads(!automaticOnly, true)
|
toUpdate, missingSigs := reg.GetPendingDownloads(includeManual, true)
|
||||||
downloadDetailsResources := identifiersFromResourceVersions(toUpdate)
|
downloadDetailsResources := humanInfoFromResourceVersions(toUpdate)
|
||||||
reg.state.UpdateOperationDetails(&StateDownloadingDetails{
|
reg.state.UpdateOperationDetails(&StateDownloadingDetails{
|
||||||
Resources: downloadDetailsResources,
|
Resources: downloadDetailsResources,
|
||||||
})
|
})
|
||||||
|
@ -348,11 +348,11 @@ func (reg *ResourceRegistry) GetPendingDownloads(manual, auto bool) (resources,
|
||||||
return toUpdate, missingSigs
|
return toUpdate, missingSigs
|
||||||
}
|
}
|
||||||
|
|
||||||
func identifiersFromResourceVersions(resourceVersions []*ResourceVersion) []string {
|
func humanInfoFromResourceVersions(resourceVersions []*ResourceVersion) []string {
|
||||||
identifiers := make([]string, len(resourceVersions))
|
identifiers := make([]string, len(resourceVersions))
|
||||||
|
|
||||||
for i, rv := range resourceVersions {
|
for i, rv := range resourceVersions {
|
||||||
identifiers[i] = rv.resource.Identifier
|
identifiers[i] = fmt.Sprintf("%s v%s", rv.resource.Identifier, rv.VersionNumber)
|
||||||
}
|
}
|
||||||
|
|
||||||
return identifiers
|
return identifiers
|
||||||
|
|
Loading…
Add table
Reference in a new issue