Merge pull request #1053 from Morganamilo/group-transactions-fix

Re-add --batchinstall and fix dep issues
This commit is contained in:
Anna 2019-10-16 21:48:20 +01:00 committed by GitHub
commit 543d3afaa7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 154 additions and 102 deletions

View file

@ -50,11 +50,8 @@ func cleanRemove(pkgNames []string) error {
return nil return nil
} }
arguments := makeArguments() arguments := cmdArgs.copyGlobal()
err := arguments.addArg("R") _ = arguments.addArg("R")
if err != nil {
return err
}
arguments.addTarget(pkgNames...) arguments.addTarget(pkgNames...)
return show(passToPacman(arguments)) return show(passToPacman(arguments))

2
cmd.go
View file

@ -356,7 +356,7 @@ func displayNumberMenu(pkgS []string) (err error) {
} }
include, exclude, _, otherExclude := types.ParseNumberMenu(string(numberBuf)) include, exclude, _, otherExclude := types.ParseNumberMenu(string(numberBuf))
arguments := makeArguments() arguments := cmdArgs.copyGlobal()
isInclude := len(exclude) == 0 && len(otherExclude) == 0 isInclude := len(exclude) == 0 && len(otherExclude) == 0

View file

@ -47,6 +47,7 @@ type Configuration struct {
TarBin string `json:"tarbin"` TarBin string `json:"tarbin"`
ReDownload string `json:"redownload"` ReDownload string `json:"redownload"`
ReBuild string `json:"rebuild"` ReBuild string `json:"rebuild"`
BatchInstall bool `json:"batchinstall"`
AnswerClean string `json:"answerclean"` AnswerClean string `json:"answerclean"`
AnswerDiff string `json:"answerdiff"` AnswerDiff string `json:"answerdiff"`
AnswerEdit string `json:"answeredit"` AnswerEdit string `json:"answeredit"`
@ -167,6 +168,7 @@ func defaultSettings() *Configuration {
RequestSplitN: 150, RequestSplitN: 150,
ReDownload: "no", ReDownload: "no",
ReBuild: "no", ReBuild: "no",
BatchInstall: false,
AnswerClean: "", AnswerClean: "",
AnswerDiff: "", AnswerDiff: "",
AnswerEdit: "", AnswerEdit: "",

View file

@ -15,6 +15,38 @@ import (
gosrc "github.com/Morganamilo/go-srcinfo" gosrc "github.com/Morganamilo/go-srcinfo"
) )
func asdeps(parser *arguments, pkgs []string) error {
if len(pkgs) == 0 {
return nil
}
parser = parser.copyGlobal()
_ = parser.addArg("D", "asdeps")
parser.addTarget(pkgs...)
_, stderr, err := capture(passToPacman(parser))
if err != nil {
return fmt.Errorf("%s%s", stderr, err)
}
return nil
}
func asexp(parser *arguments, pkgs []string) error {
if len(pkgs) == 0 {
return nil
}
parser = parser.copyGlobal()
_ = parser.addArg("D", "asexplicit")
parser.addTarget(pkgs...)
_, stderr, err := capture(passToPacman(parser))
if err != nil {
return fmt.Errorf("%s%s", stderr, err)
}
return nil
}
// Install handles package installs // Install handles package installs
func install(parser *arguments) (err error) { func install(parser *arguments) (err error) {
var incompatible types.StringSet var incompatible types.StringSet
@ -295,42 +327,27 @@ func install(parser *arguments) (err error) {
return fmt.Errorf("Error installing repo packages") return fmt.Errorf("Error installing repo packages")
} }
depArguments := makeArguments() deps := make([]string, 0)
err = depArguments.addArg("D", "asdeps") exp := make([]string, 0)
if err != nil {
return err
}
expArguments := makeArguments()
err = expArguments.addArg("D", "asexplicit")
if err != nil {
return err
}
for _, pkg := range do.Repo { for _, pkg := range do.Repo {
if !dp.Explicit.Get(pkg.Name()) && !localNamesCache.Get(pkg.Name()) && !remoteNamesCache.Get(pkg.Name()) { if !dp.Explicit.Get(pkg.Name()) && !localNamesCache.Get(pkg.Name()) && !remoteNamesCache.Get(pkg.Name()) {
depArguments.addTarget(pkg.Name()) deps = append(deps, pkg.Name())
continue continue
} }
if parser.existsArg("asdeps", "asdep") && dp.Explicit.Get(pkg.Name()) { if parser.existsArg("asdeps", "asdep") && dp.Explicit.Get(pkg.Name()) {
depArguments.addTarget(pkg.Name()) deps = append(deps, pkg.Name())
} else if parser.existsArg("asexp", "asexplicit") && dp.Explicit.Get(pkg.Name()) { } else if parser.existsArg("asexp", "asexplicit") && dp.Explicit.Get(pkg.Name()) {
expArguments.addTarget(pkg.Name()) exp = append(exp, pkg.Name())
} }
} }
if len(depArguments.targets) > 0 { if err = asdeps(parser, deps); err != nil {
_, stderr, err := capture(passToPacman(depArguments)) return err
if err != nil {
return fmt.Errorf("%s%s", stderr, err)
}
} }
if err = asexp(parser, exp); err != nil {
if len(expArguments.targets) > 0 { return err
_, stderr, err := capture(passToPacman(expArguments))
if err != nil {
return fmt.Errorf("%s%s", stderr, err)
}
} }
} }
@ -943,11 +960,92 @@ func downloadPkgbuildsSources(bases []Base, incompatible types.StringSet) (err e
} }
func buildInstallPkgbuilds(dp *depPool, do *depOrder, srcinfos map[string]*gosrc.Srcinfo, parser *arguments, incompatible types.StringSet, conflicts types.MapStringSet) error { func buildInstallPkgbuilds(dp *depPool, do *depOrder, srcinfos map[string]*gosrc.Srcinfo, parser *arguments, incompatible types.StringSet, conflicts types.MapStringSet) error {
arguments := parser.copy()
arguments.clearTargets()
arguments.op = "U"
arguments.delArg("confirm")
arguments.delArg("noconfirm")
arguments.delArg("c", "clean")
arguments.delArg("q", "quiet")
arguments.delArg("q", "quiet")
arguments.delArg("y", "refresh")
arguments.delArg("u", "sysupgrade")
arguments.delArg("w", "downloadonly")
deps := make([]string, 0)
exp := make([]string, 0)
oldConfirm := config.NoConfirm
config.NoConfirm = true
//remotenames: names of all non repo packages on the system
_, _, localNames, remoteNames, err := filterPackages()
if err != nil {
return err
}
//cache as a stringset. maybe make it return a string set in the first
//place
remoteNamesCache := types.SliceToStringSet(remoteNames)
localNamesCache := types.SliceToStringSet(localNames)
doInstall := func() error {
if len(arguments.targets) == 0 {
return nil
}
err := show(passToPacman(arguments))
if err != nil {
return err
}
err = saveVCSInfo()
if err != nil {
fmt.Fprintln(os.Stderr, err)
}
if err = asdeps(parser, deps); err != nil {
return err
}
if err = asexp(parser, exp); err != nil {
return err
}
config.NoConfirm = oldConfirm
arguments.clearTargets()
deps = make([]string, 0)
exp = make([]string, 0)
config.NoConfirm = true
return nil
}
for _, base := range do.Aur { for _, base := range do.Aur {
var err error
pkg := base.Pkgbase() pkg := base.Pkgbase()
dir := filepath.Join(config.BuildDir, pkg) dir := filepath.Join(config.BuildDir, pkg)
built := true built := true
satisfied := true
all:
for _, pkg := range base {
for _, deps := range [3][]string{pkg.Depends, pkg.MakeDepends, pkg.CheckDepends} {
for _, dep := range deps {
if _, err := dp.LocalDB.PkgCache().FindSatisfier(dep); err != nil {
satisfied = false
fmt.Printf("%s not satisfied, flushing install queue\n", dep)
break all
}
}
}
}
if !satisfied || !config.BatchInstall {
err = doInstall()
if err != nil {
return err
}
}
srcinfo := srcinfos[pkg] srcinfo := srcinfos[pkg]
args := []string{"--nobuild", "-fC"} args := []string{"--nobuild", "-fC"}
@ -957,7 +1055,7 @@ func buildInstallPkgbuilds(dp *depPool, do *depOrder, srcinfos map[string]*gosrc
} }
//pkgver bump //pkgver bump
err := show(passToMakepkg(dir, args...)) err = show(passToMakepkg(dir, args...))
if err != nil { if err != nil {
return fmt.Errorf("Error making: %s", base.String()) return fmt.Errorf("Error making: %s", base.String())
} }
@ -1029,60 +1127,20 @@ func buildInstallPkgbuilds(dp *depPool, do *depOrder, srcinfos map[string]*gosrc
} }
} }
arguments := parser.copy()
arguments.clearTargets()
arguments.op = "U"
arguments.delArg("confirm")
arguments.delArg("noconfirm")
arguments.delArg("c", "clean")
arguments.delArg("q", "quiet")
arguments.delArg("q", "quiet")
arguments.delArg("y", "refresh")
arguments.delArg("u", "sysupgrade")
arguments.delArg("w", "downloadonly")
oldConfirm := config.NoConfirm
//conflicts have been checked so answer y for them //conflicts have been checked so answer y for them
if config.UseAsk { if config.UseAsk {
ask, _ := strconv.Atoi(cmdArgs.globals["ask"]) ask, _ := strconv.Atoi(cmdArgs.globals["ask"])
uask := alpm.QuestionType(ask) | alpm.QuestionTypeConflictPkg uask := alpm.QuestionType(ask) | alpm.QuestionTypeConflictPkg
cmdArgs.globals["ask"] = fmt.Sprint(uask) cmdArgs.globals["ask"] = fmt.Sprint(uask)
} else { } else {
conflict := false
for _, split := range base { for _, split := range base {
if _, ok := conflicts[split.Name]; ok { if _, ok := conflicts[split.Name]; ok {
conflict = true config.NoConfirm = false
break
} }
} }
if !conflict {
config.NoConfirm = true
}
} }
depArguments := makeArguments()
err = depArguments.addArg("D", "asdeps")
if err != nil {
return err
}
expArguments := makeArguments()
err = expArguments.addArg("D", "asexplicit")
if err != nil {
return err
}
//remotenames: names of all non repo packages on the system
_, _, localNames, remoteNames, err := filterPackages()
if err != nil {
return err
}
//cache as a stringset. maybe make it return a string set in the first
//place
remoteNamesCache := types.SliceToStringSet(remoteNames)
localNamesCache := types.SliceToStringSet(localNames)
for _, split := range base { for _, split := range base {
pkgdest, ok := pkgdests[split.Name] pkgdest, ok := pkgdests[split.Name]
if !ok { if !ok {
@ -1090,22 +1148,13 @@ func buildInstallPkgbuilds(dp *depPool, do *depOrder, srcinfos map[string]*gosrc
} }
arguments.addTarget(pkgdest) arguments.addTarget(pkgdest)
if !dp.Explicit.Get(split.Name) && !localNamesCache.Get(split.Name) && !remoteNamesCache.Get(split.Name) { if parser.existsArg("asdeps", "asdep") {
depArguments.addTarget(split.Name) deps = append(deps, split.Name)
} else if parser.existsArg("asexplicit", "asexp") {
exp = append(exp, split.Name)
} else if !dp.Explicit.Get(split.Name) && !localNamesCache.Get(split.Name) && !remoteNamesCache.Get(split.Name) {
deps = append(deps, split.Name)
} }
if dp.Explicit.Get(split.Name) {
if parser.existsArg("asdeps", "asdep") {
depArguments.addTarget(split.Name)
} else if parser.existsArg("asexplicit", "asexp") {
expArguments.addTarget(split.Name)
}
}
}
err = show(passToPacman(arguments))
if err != nil {
return err
} }
var mux sync.Mutex var mux sync.Mutex
@ -1116,20 +1165,9 @@ func buildInstallPkgbuilds(dp *depPool, do *depOrder, srcinfos map[string]*gosrc
} }
wg.Wait() wg.Wait()
err = saveVCSInfo()
if err != nil {
fmt.Fprintln(os.Stderr, err)
}
if len(depArguments.targets) > 0 {
_, stderr, err := capture(passToPacman(depArguments))
if err != nil {
return fmt.Errorf("%s%s", stderr, err)
}
}
config.NoConfirm = oldConfirm
} }
return nil err = doInstall()
config.NoConfirm = oldConfirm
return err
} }

View file

@ -33,6 +33,15 @@ func makeArguments() *arguments {
} }
} }
func (parser *arguments) copyGlobal() (cp *arguments) {
cp = makeArguments()
for k, v := range parser.globals {
cp.globals[k] = v
}
return
}
func (parser *arguments) copy() (cp *arguments) { func (parser *arguments) copy() (cp *arguments) {
cp = makeArguments() cp = makeArguments()
@ -386,6 +395,8 @@ func isArg(arg string) bool {
case "rebuildall": case "rebuildall":
case "rebuildtree": case "rebuildtree":
case "norebuild": case "norebuild":
case "batchinstall":
case "nobatchinstall":
case "answerclean": case "answerclean":
case "noanswerclean": case "noanswerclean":
case "answerdiff": case "answerdiff":
@ -494,6 +505,10 @@ func handleConfig(option, value string) bool {
config.ReBuild = "tree" config.ReBuild = "tree"
case "norebuild": case "norebuild":
config.ReBuild = "no" config.ReBuild = "no"
case "batchinstall":
config.BatchInstall = true
case "nobatchinstall":
config.BatchInstall = false
case "answerclean": case "answerclean":
config.AnswerClean = value config.AnswerClean = value
case "noanswerclean": case "noanswerclean":