Added PacmanUpgradeList

This commit is contained in:
Jguer 2017-07-13 17:56:56 +01:00
parent baf712d062
commit cb6d4af881
3 changed files with 144 additions and 81 deletions

View file

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"os" "os"
alpm "github.com/jguer/go-alpm"
aur "github.com/jguer/yay/aur" aur "github.com/jguer/yay/aur"
"github.com/jguer/yay/config" "github.com/jguer/yay/config"
pac "github.com/jguer/yay/pacman" pac "github.com/jguer/yay/pacman"
@ -36,11 +37,45 @@ func upgrade(flags []string) error {
return errp return errp
} }
aurUpList, err := aur.UpgradeList(flags) pacC := make(chan []alpm.Package)
if err != nil { aurC := make(chan []aur.Upgrade)
return err errC := make(chan error)
var pacUp []alpm.Package
var aurUp []aur.Upgrade
go func() {
pacUpList, err := pac.UpgradeList()
errC <- err
pacC <- pacUpList
}()
go func() {
aurUpList, err := aur.UpgradeList()
errC <- err
aurC <- aurUpList
}()
var i = 0
loop:
for {
select {
case pacUp = <-pacC:
i++
case aurUp = <-aurC:
i++
case err := <-errC:
if err != nil {
fmt.Println(err)
}
default:
if i == 2 {
break loop
}
}
} }
fmt.Printf("%+v\n", aurUpList)
fmt.Printf("%+v\n", aurUp)
fmt.Printf("%+v\n", pacUp)
// erra := aur.Upgrade(flags) // erra := aur.Upgrade(flags)
// if errp != nil { // if errp != nil {

View file

@ -2,7 +2,6 @@ package aur
import ( import (
"bufio" "bufio"
"bytes"
"fmt" "fmt"
"net/http" "net/http"
"os" "os"
@ -132,13 +131,13 @@ func develUpgrade(foreign map[string]alpm.Package, flags []string) error {
return nil return nil
} }
type upgrade struct { type Upgrade struct {
Name string Name string
LocalVersion string LocalVersion string
RemoteVersion string RemoteVersion string
} }
func UpgradeList(flags []string) (toUpgrade []upgrade, err error) { func UpgradeList() (toUpgrade []Upgrade, err error) {
foreign, foreignNames, err := pacman.ForeignPackageList() foreign, foreignNames, err := pacman.ForeignPackageList()
if err != nil { if err != nil {
return return
@ -149,7 +148,7 @@ func UpgradeList(flags []string) (toUpgrade []upgrade, err error) {
var routines int var routines int
var routineDone int var routineDone int
packageC := make(chan upgrade) packageC := make(chan Upgrade)
done := make(chan bool) done := make(chan bool)
for i := len(foreign); i != 0; i = j { for i := len(foreign); i != 0; i = j {
@ -158,6 +157,7 @@ func UpgradeList(flags []string) (toUpgrade []upgrade, err error) {
j = 0 j = 0
} }
//Split requests so AUR RPC doesn't get mad at us.
qtemp, err = rpc.Info(foreignNames[j:i]) qtemp, err = rpc.Info(foreignNames[j:i])
if err != nil { if err != nil {
return return
@ -179,7 +179,7 @@ func UpgradeList(flags []string) (toUpgrade []upgrade, err error) {
} else if qtemp[x].Name == local[i].Name() { } else if qtemp[x].Name == local[i].Name() {
if (config.YayConf.TimeUpdate && (int64(qtemp[x].LastModified) > local[i].BuildDate().Unix())) || if (config.YayConf.TimeUpdate && (int64(qtemp[x].LastModified) > local[i].BuildDate().Unix())) ||
(alpm.VerCmp(local[i].Version(), qtemp[x].Version) < 0) { (alpm.VerCmp(local[i].Version(), qtemp[x].Version) < 0) {
packageC <- upgrade{qtemp[x].Name, local[i].Version(), qtemp[x].Version} packageC <- Upgrade{qtemp[x].Name, local[i].Version(), qtemp[x].Version}
continue continue
} }
} else { } else {
@ -205,86 +205,86 @@ func UpgradeList(flags []string) (toUpgrade []upgrade, err error) {
} }
// Upgrade tries to update every foreign package installed in the system // Upgrade tries to update every foreign package installed in the system
func Upgrade(flags []string) error { // func Upgrade(flags []string) error {
fmt.Println("\x1b[1;36;1m::\x1b[0m\x1b[1m Starting AUR upgrade...\x1b[0m") // fmt.Println("\x1b[1;36;1m::\x1b[0m\x1b[1m Starting AUR upgrade...\x1b[0m")
foreign, err := pacman.ForeignPackages() // foreign, err := pacman.ForeignPackages()
if err != nil { // if err != nil {
return err // return err
} // }
keys := make([]string, len(foreign)) // keys := make([]string, len(foreign))
i := 0 // i := 0
for k := range foreign { // for k := range foreign {
keys[i] = k // keys[i] = k
i++ // i++
} // }
if config.YayConf.Devel { // if config.YayConf.Devel {
err := develUpgrade(foreign, flags) // err := develUpgrade(foreign, flags)
if err != nil { // if err != nil {
fmt.Println(err) // fmt.Println(err)
} // }
} // }
var q Query // var q Query
var j int // var j int
for i = len(keys); i != 0; i = j { // for i = len(keys); i != 0; i = j {
j = i - config.YayConf.RequestSplitN // j = i - config.YayConf.RequestSplitN
if j < 0 { // if j < 0 {
j = 0 // j = 0
} // }
qtemp, err := rpc.Info(keys[j:i]) // qtemp, err := rpc.Info(keys[j:i])
q = append(q, qtemp...) // q = append(q, qtemp...)
if err != nil { // if err != nil {
return err // return err
} // }
} // }
var buffer bytes.Buffer // var buffer bytes.Buffer
buffer.WriteString("\n") // buffer.WriteString("\n")
outdated := q[:0] // outdated := q[:0]
for i, res := range q { // for i, res := range q {
fmt.Printf("\r Checking %d/%d packages...", i+1, len(q)) // fmt.Printf("\r Checking %d/%d packages...", i+1, len(q))
if _, ok := foreign[res.Name]; ok { // if _, ok := foreign[res.Name]; ok {
// Leaving this here for now, warn about downgrades later // // Leaving this here for now, warn about downgrades later
if (config.YayConf.TimeUpdate && (int64(res.LastModified) > foreign[res.Name].BuildDate().Unix())) || // if (config.YayConf.TimeUpdate && (int64(res.LastModified) > foreign[res.Name].BuildDate().Unix())) ||
alpm.VerCmp(foreign[res.Name].Version(), res.Version) < 0 { // alpm.VerCmp(foreign[res.Name].Version(), res.Version) < 0 {
buffer.WriteString(fmt.Sprintf("\x1b[1m\x1b[32m==>\x1b[33;1m %s: \x1b[0m%s \x1b[33;1m-> \x1b[0m%s\n", // buffer.WriteString(fmt.Sprintf("\x1b[1m\x1b[32m==>\x1b[33;1m %s: \x1b[0m%s \x1b[33;1m-> \x1b[0m%s\n",
res.Name, foreign[res.Name].Version(), res.Version)) // res.Name, foreign[res.Name].Version(), res.Version))
outdated = append(outdated, res) // outdated = append(outdated, res)
} // }
} // }
} // }
fmt.Println(buffer.String()) // fmt.Println(buffer.String())
//If there are no outdated packages, don't prompt // //If there are no outdated packages, don't prompt
if len(outdated) == 0 { // if len(outdated) == 0 {
fmt.Println("there is nothing to do") // fmt.Println("there is nothing to do")
return nil // return nil
} // }
// Install updated packages // // Install updated packages
if !config.ContinueTask("Proceed with upgrade?", "nN") { // if !config.ContinueTask("Proceed with upgrade?", "nN") {
return nil // return nil
} // }
var finalmdeps []string // var finalmdeps []string
for _, pkgi := range outdated { // for _, pkgi := range outdated {
mdeps, err := PkgInstall(&pkgi, flags) // mdeps, err := PkgInstall(&pkgi, flags)
finalmdeps = append(finalmdeps, mdeps...) // finalmdeps = append(finalmdeps, mdeps...)
if err != nil { // if err != nil {
fmt.Println(err) // fmt.Println(err)
} // }
} // }
err = pacman.CleanRemove(finalmdeps) // err = pacman.CleanRemove(finalmdeps)
if err != nil { // if err != nil {
fmt.Println(err) // fmt.Println(err)
} // }
return nil // return nil
} // }
// GetPkgbuild downloads pkgbuild from the AUR. // GetPkgbuild downloads pkgbuild from the AUR.
func GetPkgbuild(pkgN string, dir string) (err error) { func GetPkgbuild(pkgN string, dir string) (err error) {

View file

@ -134,11 +134,39 @@ func PackageSlices(toCheck []string) (aur []string, repo []string, err error) {
return return
} }
func UpgradeList() ([]alpm.Package, error) {
localDb, err := config.AlpmHandle.LocalDb()
if err != nil {
return nil, err
}
dbList, err := config.AlpmHandle.SyncDbs()
if err != nil {
return nil, err
}
slice := []alpm.Package{}
for _, pkg := range localDb.PkgCache().Slice() {
newPkg := pkg.NewVersion(dbList)
if newPkg != nil {
slice = append(slice, *newPkg)
}
}
return slice, nil
}
// BuildDependencies finds packages, on the second run // BuildDependencies finds packages, on the second run
// compares with a baselist and avoids searching those // compares with a baselist and avoids searching those
func BuildDependencies(baselist []string) func(toCheck []string, isBaseList bool, last bool) (repo []string, notFound []string) { func BuildDependencies(baselist []string) func(toCheck []string, isBaseList bool, last bool) (repo []string, notFound []string) {
localDb, _ := config.AlpmHandle.LocalDb() localDb, err := config.AlpmHandle.LocalDb()
dbList, _ := config.AlpmHandle.SyncDbs() if err != nil {
panic(err)
}
dbList, err := config.AlpmHandle.SyncDbs()
if err != nil {
panic(err)
}
f := func(c rune) bool { f := func(c rune) bool {
return c == '>' || c == '<' || c == '=' || c == ' ' return c == '>' || c == '<' || c == '=' || c == ' '