mirror of
https://github.com/Jguer/yay
synced 2024-10-31 04:12:51 +00:00
fix(upgrade): export upgrades
This commit is contained in:
parent
e1b632cf3d
commit
678d10e04e
6 changed files with 128 additions and 120 deletions
108
pkg/upgrade/sources.go
Normal file
108
pkg/upgrade/sources.go
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
package upgrade
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
alpm "github.com/Jguer/go-alpm/v2"
|
||||||
|
"github.com/leonelquinteros/gotext"
|
||||||
|
rpc "github.com/mikkeloscar/aur"
|
||||||
|
|
||||||
|
"github.com/Jguer/yay/v10/pkg/text"
|
||||||
|
"github.com/Jguer/yay/v10/pkg/vcs"
|
||||||
|
)
|
||||||
|
|
||||||
|
func UpDevel(
|
||||||
|
remote []alpm.IPackage,
|
||||||
|
aurdata map[string]*rpc.Pkg,
|
||||||
|
localCache *vcs.InfoStore) UpSlice {
|
||||||
|
toUpdate := make([]alpm.IPackage, 0, len(aurdata))
|
||||||
|
toRemove := make([]string, 0)
|
||||||
|
|
||||||
|
var mux1, mux2 sync.Mutex
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
|
||||||
|
checkUpdate := func(pkgName string, e vcs.OriginInfoByURL) {
|
||||||
|
defer wg.Done()
|
||||||
|
|
||||||
|
if localCache.NeedsUpdate(e) {
|
||||||
|
if _, ok := aurdata[pkgName]; ok {
|
||||||
|
for _, pkg := range remote {
|
||||||
|
if pkg.Name() == pkgName {
|
||||||
|
mux1.Lock()
|
||||||
|
toUpdate = append(toUpdate, pkg)
|
||||||
|
mux1.Unlock()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mux2.Lock()
|
||||||
|
toRemove = append(toRemove, pkgName)
|
||||||
|
mux2.Unlock()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for pkgName, e := range localCache.OriginsByPackage {
|
||||||
|
wg.Add(1)
|
||||||
|
go checkUpdate(pkgName, e)
|
||||||
|
}
|
||||||
|
|
||||||
|
wg.Wait()
|
||||||
|
|
||||||
|
toUpgrade := make(UpSlice, 0, len(toUpdate))
|
||||||
|
for _, pkg := range toUpdate {
|
||||||
|
if pkg.ShouldIgnore() {
|
||||||
|
printIgnoringPackage(pkg, "latest-commit")
|
||||||
|
} else {
|
||||||
|
toUpgrade = append(toUpgrade,
|
||||||
|
Upgrade{
|
||||||
|
Name: pkg.Name(),
|
||||||
|
Repository: "devel",
|
||||||
|
LocalVersion: pkg.Version(),
|
||||||
|
RemoteVersion: "latest-commit",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
localCache.RemovePackage(toRemove)
|
||||||
|
return toUpgrade
|
||||||
|
}
|
||||||
|
|
||||||
|
func printIgnoringPackage(pkg alpm.IPackage, newPkgVersion string) {
|
||||||
|
left, right := GetVersionDiff(pkg.Version(), newPkgVersion)
|
||||||
|
|
||||||
|
text.Warnln(gotext.Get("%s: ignoring package upgrade (%s => %s)",
|
||||||
|
text.Cyan(pkg.Name()),
|
||||||
|
left, right,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpAUR gathers foreign packages and checks if they have new versions.
|
||||||
|
// Output: Upgrade type package list.
|
||||||
|
func UpAUR(remote []alpm.IPackage, aurdata map[string]*rpc.Pkg, timeUpdate bool) UpSlice {
|
||||||
|
toUpgrade := make(UpSlice, 0)
|
||||||
|
|
||||||
|
for _, pkg := range remote {
|
||||||
|
aurPkg, ok := aurdata[pkg.Name()]
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timeUpdate && (int64(aurPkg.LastModified) > pkg.BuildDate().Unix())) ||
|
||||||
|
(alpm.VerCmp(pkg.Version(), aurPkg.Version) < 0) {
|
||||||
|
if pkg.ShouldIgnore() {
|
||||||
|
printIgnoringPackage(pkg, aurPkg.Version)
|
||||||
|
} else {
|
||||||
|
toUpgrade = append(toUpgrade,
|
||||||
|
Upgrade{
|
||||||
|
Name: aurPkg.Name,
|
||||||
|
Repository: "aur",
|
||||||
|
LocalVersion: pkg.Version(),
|
||||||
|
RemoteVersion: aurPkg.Version,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return toUpgrade
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package main
|
package upgrade
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
@ -17,7 +17,6 @@ import (
|
||||||
|
|
||||||
"github.com/Jguer/yay/v10/pkg/db/mock"
|
"github.com/Jguer/yay/v10/pkg/db/mock"
|
||||||
"github.com/Jguer/yay/v10/pkg/settings"
|
"github.com/Jguer/yay/v10/pkg/settings"
|
||||||
"github.com/Jguer/yay/v10/pkg/upgrade"
|
|
||||||
"github.com/Jguer/yay/v10/pkg/vcs"
|
"github.com/Jguer/yay/v10/pkg/vcs"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -30,7 +29,7 @@ func Test_upAUR(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
args args
|
args args
|
||||||
want upgrade.UpSlice
|
want UpSlice
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "No Updates",
|
name: "No Updates",
|
||||||
|
@ -46,7 +45,7 @@ func Test_upAUR(t *testing.T) {
|
||||||
},
|
},
|
||||||
timeUpdate: false,
|
timeUpdate: false,
|
||||||
},
|
},
|
||||||
want: upgrade.UpSlice{},
|
want: UpSlice{},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Simple Update",
|
name: "Simple Update",
|
||||||
|
@ -55,7 +54,7 @@ func Test_upAUR(t *testing.T) {
|
||||||
aurdata: map[string]*rpc.Pkg{"hello": {Version: "2.1.0", Name: "hello"}},
|
aurdata: map[string]*rpc.Pkg{"hello": {Version: "2.1.0", Name: "hello"}},
|
||||||
timeUpdate: false,
|
timeUpdate: false,
|
||||||
},
|
},
|
||||||
want: upgrade.UpSlice{upgrade.Upgrade{Name: "hello", Repository: "aur", LocalVersion: "2.0.0", RemoteVersion: "2.1.0"}},
|
want: UpSlice{Upgrade{Name: "hello", Repository: "aur", LocalVersion: "2.0.0", RemoteVersion: "2.1.0"}},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Time Update",
|
name: "Time Update",
|
||||||
|
@ -64,7 +63,7 @@ func Test_upAUR(t *testing.T) {
|
||||||
aurdata: map[string]*rpc.Pkg{"hello": {Version: "2.0.0", Name: "hello", LastModified: int(time.Now().AddDate(0, 0, 2).Unix())}},
|
aurdata: map[string]*rpc.Pkg{"hello": {Version: "2.0.0", Name: "hello", LastModified: int(time.Now().AddDate(0, 0, 2).Unix())}},
|
||||||
timeUpdate: true,
|
timeUpdate: true,
|
||||||
},
|
},
|
||||||
want: upgrade.UpSlice{upgrade.Upgrade{Name: "hello", Repository: "aur", LocalVersion: "2.0.0", RemoteVersion: "2.0.0"}},
|
want: UpSlice{Upgrade{Name: "hello", Repository: "aur", LocalVersion: "2.0.0", RemoteVersion: "2.0.0"}},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
|
@ -72,7 +71,7 @@ func Test_upAUR(t *testing.T) {
|
||||||
rescueStdout := os.Stdout
|
rescueStdout := os.Stdout
|
||||||
r, w, _ := os.Pipe()
|
r, w, _ := os.Pipe()
|
||||||
os.Stdout = w
|
os.Stdout = w
|
||||||
got := upAUR(tt.args.remote, tt.args.aurdata, tt.args.timeUpdate)
|
got := UpAUR(tt.args.remote, tt.args.aurdata, tt.args.timeUpdate)
|
||||||
assert.EqualValues(t, tt.want, got)
|
assert.EqualValues(t, tt.want, got)
|
||||||
|
|
||||||
w.Close()
|
w.Close()
|
||||||
|
@ -107,7 +106,7 @@ func (r *MockRunner) Capture(cmd *exec.Cmd, timeout int64) (stdout, stderr strin
|
||||||
|
|
||||||
func Test_upDevel(t *testing.T) {
|
func Test_upDevel(t *testing.T) {
|
||||||
var err error
|
var err error
|
||||||
config, err = settings.NewConfig()
|
config, err := settings.NewConfig()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
config.Runtime.CmdRunner = &MockRunner{
|
config.Runtime.CmdRunner = &MockRunner{
|
||||||
|
@ -128,7 +127,7 @@ func Test_upDevel(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
args args
|
args args
|
||||||
want upgrade.UpSlice
|
want UpSlice
|
||||||
finalLen int
|
finalLen int
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
|
@ -148,7 +147,7 @@ func Test_upDevel(t *testing.T) {
|
||||||
"ignored": {Version: "2.0.0", Name: "ignored"},
|
"ignored": {Version: "2.0.0", Name: "ignored"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
want: upgrade.UpSlice{},
|
want: UpSlice{},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Simple Update",
|
name: "Simple Update",
|
||||||
|
@ -204,14 +203,14 @@ func Test_upDevel(t *testing.T) {
|
||||||
"hello4": {Version: "2.0.0", Name: "hello4"},
|
"hello4": {Version: "2.0.0", Name: "hello4"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
want: upgrade.UpSlice{
|
want: UpSlice{
|
||||||
upgrade.Upgrade{
|
Upgrade{
|
||||||
Name: "hello",
|
Name: "hello",
|
||||||
Repository: "devel",
|
Repository: "devel",
|
||||||
LocalVersion: "2.0.0",
|
LocalVersion: "2.0.0",
|
||||||
RemoteVersion: "latest-commit",
|
RemoteVersion: "latest-commit",
|
||||||
},
|
},
|
||||||
upgrade.Upgrade{
|
Upgrade{
|
||||||
Name: "hello4",
|
Name: "hello4",
|
||||||
Repository: "devel",
|
Repository: "devel",
|
||||||
LocalVersion: "4.0.0",
|
LocalVersion: "4.0.0",
|
||||||
|
@ -239,7 +238,7 @@ func Test_upDevel(t *testing.T) {
|
||||||
remote: []alpm.IPackage{&mock.Package{PName: "hello", PVersion: "2.0.0"}},
|
remote: []alpm.IPackage{&mock.Package{PName: "hello", PVersion: "2.0.0"}},
|
||||||
aurdata: map[string]*rpc.Pkg{"hello": {Version: "2.0.0", Name: "hello"}},
|
aurdata: map[string]*rpc.Pkg{"hello": {Version: "2.0.0", Name: "hello"}},
|
||||||
},
|
},
|
||||||
want: upgrade.UpSlice{},
|
want: UpSlice{},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "No update returned - ignored",
|
name: "No update returned - ignored",
|
||||||
|
@ -261,13 +260,13 @@ func Test_upDevel(t *testing.T) {
|
||||||
remote: []alpm.IPackage{&mock.Package{PName: "hello", PVersion: "2.0.0", PShouldIgnore: true}},
|
remote: []alpm.IPackage{&mock.Package{PName: "hello", PVersion: "2.0.0", PShouldIgnore: true}},
|
||||||
aurdata: map[string]*rpc.Pkg{"hello": {Version: "2.0.0", Name: "hello"}},
|
aurdata: map[string]*rpc.Pkg{"hello": {Version: "2.0.0", Name: "hello"}},
|
||||||
},
|
},
|
||||||
want: upgrade.UpSlice{},
|
want: UpSlice{},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
config.Runtime.CmdRunner.(*MockRunner).t = t
|
config.Runtime.CmdRunner.(*MockRunner).t = t
|
||||||
got := upDevel(tt.args.remote, tt.args.aurdata, &tt.args.cached)
|
got := UpDevel(tt.args.remote, tt.args.aurdata, &tt.args.cached)
|
||||||
assert.ElementsMatch(t, tt.want, got)
|
assert.ElementsMatch(t, tt.want, got)
|
||||||
assert.Equal(t, tt.finalLen, len(tt.args.cached.OriginsByPackage))
|
assert.Equal(t, tt.finalLen, len(tt.args.cached.OriginsByPackage))
|
||||||
})
|
})
|
109
upgrade.go
109
upgrade.go
|
@ -8,19 +8,16 @@ import (
|
||||||
|
|
||||||
alpm "github.com/Jguer/go-alpm/v2"
|
alpm "github.com/Jguer/go-alpm/v2"
|
||||||
"github.com/leonelquinteros/gotext"
|
"github.com/leonelquinteros/gotext"
|
||||||
|
rpc "github.com/mikkeloscar/aur"
|
||||||
|
|
||||||
"github.com/Jguer/yay/v10/pkg/db"
|
"github.com/Jguer/yay/v10/pkg/db"
|
||||||
"github.com/Jguer/yay/v10/pkg/intrange"
|
"github.com/Jguer/yay/v10/pkg/intrange"
|
||||||
|
"github.com/Jguer/yay/v10/pkg/multierror"
|
||||||
"github.com/Jguer/yay/v10/pkg/query"
|
"github.com/Jguer/yay/v10/pkg/query"
|
||||||
"github.com/Jguer/yay/v10/pkg/settings"
|
"github.com/Jguer/yay/v10/pkg/settings"
|
||||||
|
"github.com/Jguer/yay/v10/pkg/stringset"
|
||||||
"github.com/Jguer/yay/v10/pkg/text"
|
"github.com/Jguer/yay/v10/pkg/text"
|
||||||
"github.com/Jguer/yay/v10/pkg/upgrade"
|
"github.com/Jguer/yay/v10/pkg/upgrade"
|
||||||
"github.com/Jguer/yay/v10/pkg/vcs"
|
|
||||||
|
|
||||||
rpc "github.com/mikkeloscar/aur"
|
|
||||||
|
|
||||||
"github.com/Jguer/yay/v10/pkg/multierror"
|
|
||||||
"github.com/Jguer/yay/v10/pkg/stringset"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// upList returns lists of packages to upgrade from each source.
|
// upList returns lists of packages to upgrade from each source.
|
||||||
|
@ -62,7 +59,7 @@ func upList(warnings *query.AURWarnings, dbExecutor db.Executor, enableDowngrade
|
||||||
|
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
go func() {
|
go func() {
|
||||||
aurUp = upAUR(remote, aurdata, config.TimeUpdate)
|
aurUp = upgrade.UpAUR(remote, aurdata, config.TimeUpdate)
|
||||||
wg.Done()
|
wg.Done()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
@ -70,7 +67,7 @@ func upList(warnings *query.AURWarnings, dbExecutor db.Executor, enableDowngrade
|
||||||
text.OperationInfoln(gotext.Get("Checking development packages..."))
|
text.OperationInfoln(gotext.Get("Checking development packages..."))
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
go func() {
|
go func() {
|
||||||
develUp = upDevel(remote, aurdata, config.Runtime.VCSStore)
|
develUp = upgrade.UpDevel(remote, aurdata, config.Runtime.VCSStore)
|
||||||
wg.Done()
|
wg.Done()
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
@ -98,102 +95,6 @@ func upList(warnings *query.AURWarnings, dbExecutor db.Executor, enableDowngrade
|
||||||
return aurUp, repoUp, errs.Return()
|
return aurUp, repoUp, errs.Return()
|
||||||
}
|
}
|
||||||
|
|
||||||
func upDevel(
|
|
||||||
remote []alpm.IPackage,
|
|
||||||
aurdata map[string]*rpc.Pkg,
|
|
||||||
localCache *vcs.InfoStore) upgrade.UpSlice {
|
|
||||||
toUpdate := make([]alpm.IPackage, 0, len(aurdata))
|
|
||||||
toRemove := make([]string, 0)
|
|
||||||
|
|
||||||
var mux1, mux2 sync.Mutex
|
|
||||||
var wg sync.WaitGroup
|
|
||||||
|
|
||||||
checkUpdate := func(pkgName string, e vcs.OriginInfoByURL) {
|
|
||||||
defer wg.Done()
|
|
||||||
|
|
||||||
if localCache.NeedsUpdate(e) {
|
|
||||||
if _, ok := aurdata[pkgName]; ok {
|
|
||||||
for _, pkg := range remote {
|
|
||||||
if pkg.Name() == pkgName {
|
|
||||||
mux1.Lock()
|
|
||||||
toUpdate = append(toUpdate, pkg)
|
|
||||||
mux1.Unlock()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mux2.Lock()
|
|
||||||
toRemove = append(toRemove, pkgName)
|
|
||||||
mux2.Unlock()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for pkgName, e := range localCache.OriginsByPackage {
|
|
||||||
wg.Add(1)
|
|
||||||
go checkUpdate(pkgName, e)
|
|
||||||
}
|
|
||||||
|
|
||||||
wg.Wait()
|
|
||||||
|
|
||||||
toUpgrade := make(upgrade.UpSlice, 0, len(toUpdate))
|
|
||||||
for _, pkg := range toUpdate {
|
|
||||||
if pkg.ShouldIgnore() {
|
|
||||||
printIgnoringPackage(pkg, "latest-commit")
|
|
||||||
} else {
|
|
||||||
toUpgrade = append(toUpgrade,
|
|
||||||
upgrade.Upgrade{
|
|
||||||
Name: pkg.Name(),
|
|
||||||
Repository: "devel",
|
|
||||||
LocalVersion: pkg.Version(),
|
|
||||||
RemoteVersion: "latest-commit",
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
localCache.RemovePackage(toRemove)
|
|
||||||
return toUpgrade
|
|
||||||
}
|
|
||||||
|
|
||||||
func printIgnoringPackage(pkg alpm.IPackage, newPkgVersion string) {
|
|
||||||
left, right := upgrade.GetVersionDiff(pkg.Version(), newPkgVersion)
|
|
||||||
|
|
||||||
text.Warnln(gotext.Get("%s: ignoring package upgrade (%s => %s)",
|
|
||||||
text.Cyan(pkg.Name()),
|
|
||||||
left, right,
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
// upAUR gathers foreign packages and checks if they have new versions.
|
|
||||||
// Output: Upgrade type package list.
|
|
||||||
func upAUR(remote []alpm.IPackage, aurdata map[string]*rpc.Pkg, timeUpdate bool) upgrade.UpSlice {
|
|
||||||
toUpgrade := make(upgrade.UpSlice, 0)
|
|
||||||
|
|
||||||
for _, pkg := range remote {
|
|
||||||
aurPkg, ok := aurdata[pkg.Name()]
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if (timeUpdate && (int64(aurPkg.LastModified) > pkg.BuildDate().Unix())) ||
|
|
||||||
(alpm.VerCmp(pkg.Version(), aurPkg.Version) < 0) {
|
|
||||||
if pkg.ShouldIgnore() {
|
|
||||||
printIgnoringPackage(pkg, aurPkg.Version)
|
|
||||||
} else {
|
|
||||||
toUpgrade = append(toUpgrade,
|
|
||||||
upgrade.Upgrade{
|
|
||||||
Name: aurPkg.Name,
|
|
||||||
Repository: "aur",
|
|
||||||
LocalVersion: pkg.Version(),
|
|
||||||
RemoteVersion: aurPkg.Version,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return toUpgrade
|
|
||||||
}
|
|
||||||
|
|
||||||
func printLocalNewerThanAUR(
|
func printLocalNewerThanAUR(
|
||||||
remote []alpm.IPackage, aurdata map[string]*rpc.Pkg) {
|
remote []alpm.IPackage, aurdata map[string]*rpc.Pkg) {
|
||||||
for _, pkg := range remote {
|
for _, pkg := range remote {
|
||||||
|
|
Loading…
Reference in a new issue