From 24d8b571722d901bb25db693d62c4ae8b515fe33 Mon Sep 17 00:00:00 2001 From: morganamilo Date: Thu, 15 Feb 2018 03:38:19 +0000 Subject: [PATCH 01/10] Use -Ru instead of -R when removing make depends When installing a package might be a dependancy for something and a make dependancy for something else. This means when prompted to remove make dependencies yay might also try to remove a package that is actually needed causing a pacman error. Adding the -u option will cause pacman to skip needed packages and give a nice warning as it does so. It does not fix the root issue but works for now. --- install.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.go b/install.go index 6b985cb2..b2c27cdd 100644 --- a/install.go +++ b/install.go @@ -136,7 +136,7 @@ func install(parser *arguments) error { } removeArguments := makeArguments() - removeArguments.addOP("R") + removeArguments.addArg("R", "u") for _, pkg := range dc.RepoMake { removeArguments.addTarget(pkg.Name()) From ad898b2d334c682477a59b8b6b2093b2356f3dd2 Mon Sep 17 00:00:00 2001 From: morganamilo Date: Thu, 15 Feb 2018 05:36:42 +0000 Subject: [PATCH 02/10] Regenerate .SRCINFO if editing the PKGBUILD --- install.go | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/install.go b/install.go index b2c27cdd..9b33a069 100644 --- a/install.go +++ b/install.go @@ -101,8 +101,15 @@ func install(parser *arguments) error { return err } - askEditPkgBuilds(dc.AurMake) - askEditPkgBuilds(dc.Aur) + err = askEditPkgBuilds(dc.AurMake) + if err != nil { + return err + } + err = askEditPkgBuilds(dc.Aur) + if err != nil { + return err + } + if _, ok := arguments.options["gendb"]; ok { fmt.Println("GenDB finished. No packages were installed") return nil @@ -240,7 +247,7 @@ func checkForConflicts(aur []*rpc.Pkg, aurMake []*rpc.Pkg, repo []*alpm.Package, return nil } -func askEditPkgBuilds(pkgs []*rpc.Pkg) { +func askEditPkgBuilds(pkgs []*rpc.Pkg) (error) { for _, pkg := range pkgs { dir := config.BuildDir + pkg.PackageBase + "/" @@ -248,8 +255,24 @@ func askEditPkgBuilds(pkgs []*rpc.Pkg) { editcmd := exec.Command(editor(), dir+"PKGBUILD") editcmd.Stdin, editcmd.Stdout, editcmd.Stderr = os.Stdin, os.Stdout, os.Stderr editcmd.Run() + + file, err := os.OpenFile(dir + ".SRCINFO", os.O_TRUNC|os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + return err + } + defer file.Close() + + cmd := exec.Command(config.MakepkgBin, "--printsrcinfo") + cmd.Stdout, cmd.Stderr = file, os.Stderr + cmd.Dir = dir + err = cmd.Run() + + if err != nil { + return err + } } + pkgbuild, err := gopkg.ParseSRCINFO(dir + ".SRCINFO") if err == nil { for _, pkgsource := range pkgbuild.Source { @@ -264,6 +287,8 @@ func askEditPkgBuilds(pkgs []*rpc.Pkg) { } } + + return nil } func dowloadPkgBuilds(pkgs []*rpc.Pkg) (err error) { From 83491069d311b2a592c1d087526b3cbcc6333cdb Mon Sep 17 00:00:00 2001 From: morganamilo Date: Thu, 15 Feb 2018 06:17:27 +0000 Subject: [PATCH 03/10] Split .SRCINFO parsing to its own function --- install.go | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/install.go b/install.go index 9b33a069..756433ac 100644 --- a/install.go +++ b/install.go @@ -110,6 +110,15 @@ func install(parser *arguments) error { return err } + err = parseSRCINFOs(dc.AurMake) + if err != nil { + return err + } + err = parseSRCINFOs(dc.Aur) + if err != nil { + return err + } + if _, ok := arguments.options["gendb"]; ok { fmt.Println("GenDB finished. No packages were installed") return nil @@ -270,8 +279,15 @@ func askEditPkgBuilds(pkgs []*rpc.Pkg) (error) { if err != nil { return err } - } + } + } + return nil +} + +func parseSRCINFOs(pkgs []*rpc.Pkg) error { + for _, pkg := range pkgs { + dir := config.BuildDir + pkg.PackageBase + "/" pkgbuild, err := gopkg.ParseSRCINFO(dir + ".SRCINFO") if err == nil { @@ -280,12 +296,11 @@ func askEditPkgBuilds(pkgs []*rpc.Pkg) (error) { if owner != "" && repo != "" { err = branchInfo(pkg.Name, owner, repo) if err != nil { - fmt.Println(err) + return err } } } } - } return nil From 8c3c125900636a94793f0c2c210c6e3d04d64e86 Mon Sep 17 00:00:00 2001 From: morganamilo Date: Thu, 15 Feb 2018 07:25:20 +0000 Subject: [PATCH 04/10] Bump pkgver before parsing .SRCINFO --- install.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/install.go b/install.go index 756433ac..d338c34e 100644 --- a/install.go +++ b/install.go @@ -109,16 +109,7 @@ func install(parser *arguments) error { if err != nil { return err } - - err = parseSRCINFOs(dc.AurMake) - if err != nil { - return err - } - err = parseSRCINFOs(dc.Aur) - if err != nil { - return err - } - + if _, ok := arguments.options["gendb"]; ok { fmt.Println("GenDB finished. No packages were installed") return nil @@ -137,6 +128,15 @@ func install(parser *arguments) error { return err } + err = parseSRCINFOs(dc.AurMake) + if err != nil { + return err + } + err = parseSRCINFOs(dc.Aur) + if err != nil { + return err + } + err = buildInstallPkgBuilds(dc.AurMake, parser.targets) if err != nil { return err @@ -323,7 +323,7 @@ func dowloadPkgBuilds(pkgs []*rpc.Pkg) (err error) { func downloadPkgBuildsSources(pkgs []*rpc.Pkg) (err error) { for _, pkg := range pkgs { dir := config.BuildDir + pkg.PackageBase + "/" - err = passToMakepkg(dir, "-f", "--verifysource") + err = passToMakepkg(dir, "--nobuild", "--nocheck", "--noprepare", "--nodeps") if err != nil { return } From f58421953b86cc0e42d794e94fb8a3ab453a6916 Mon Sep 17 00:00:00 2001 From: morganamilo Date: Thu, 15 Feb 2018 19:43:16 +0000 Subject: [PATCH 05/10] Skip build if package is already built in cache --- install.go | 120 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 90 insertions(+), 30 deletions(-) diff --git a/install.go b/install.go index d338c34e..662ec28f 100644 --- a/install.go +++ b/install.go @@ -4,6 +4,8 @@ import ( "fmt" "os" "os/exec" + "io/ioutil" + "strings" alpm "github.com/jguer/go-alpm" rpc "github.com/mikkeloscar/aur" @@ -13,6 +15,7 @@ import ( // Install handles package installs func install(parser *arguments) error { aurs, repos, missing, err := packageSlices(parser.targets.toSlice()) + srcinfos := make(map[string]*gopkg.PKGBUILD) if err != nil { return err } @@ -128,20 +131,20 @@ func install(parser *arguments) error { return err } - err = parseSRCINFOs(dc.AurMake) + err = parsesrcinfos(dc.AurMake, srcinfos) if err != nil { return err } - err = parseSRCINFOs(dc.Aur) + err = parsesrcinfos(dc.Aur, srcinfos) if err != nil { return err } - err = buildInstallPkgBuilds(dc.AurMake, parser.targets) + err = buildInstallPkgBuilds(dc.AurMake, srcinfos, parser.targets, parser) if err != nil { return err } - err = buildInstallPkgBuilds(dc.Aur, parser.targets) + err = buildInstallPkgBuilds(dc.Aur, srcinfos, parser.targets, parser) if err != nil { return err } @@ -264,33 +267,31 @@ func askEditPkgBuilds(pkgs []*rpc.Pkg) (error) { editcmd := exec.Command(editor(), dir+"PKGBUILD") editcmd.Stdin, editcmd.Stdout, editcmd.Stderr = os.Stdin, os.Stdout, os.Stderr editcmd.Run() - - file, err := os.OpenFile(dir + ".SRCINFO", os.O_TRUNC|os.O_WRONLY|os.O_CREATE, 0666) - if err != nil { - return err - } - defer file.Close() - - cmd := exec.Command(config.MakepkgBin, "--printsrcinfo") - cmd.Stdout, cmd.Stderr = file, os.Stderr - cmd.Dir = dir - err = cmd.Run() - - if err != nil { - return err - } - } + } } return nil } -func parseSRCINFOs(pkgs []*rpc.Pkg) error { + +func parsesrcinfos(pkgs []*rpc.Pkg, srcinfos map[string]*gopkg.PKGBUILD) (error) { + for _, pkg := range pkgs { dir := config.BuildDir + pkg.PackageBase + "/" + + cmd := exec.Command(config.MakepkgBin, "--printsrcinfo") + cmd.Stderr = os.Stderr + cmd.Dir = dir + srcinfo, err := cmd.Output() - pkgbuild, err := gopkg.ParseSRCINFO(dir + ".SRCINFO") + if err != nil { + return err + } + + pkgbuild, err := gopkg.ParseSRCINFOContent(srcinfo) if err == nil { + srcinfos[pkg.PackageBase] = pkgbuild + for _, pkgsource := range pkgbuild.Source { owner, repo := parseSource(pkgsource) if owner != "" && repo != "" { @@ -332,21 +333,80 @@ func downloadPkgBuildsSources(pkgs []*rpc.Pkg) (err error) { return } -func buildInstallPkgBuilds(pkgs []*rpc.Pkg, targets stringSet) (err error) { +func buildInstallPkgBuilds(pkgs []*rpc.Pkg, srcinfos map[string]*gopkg.PKGBUILD, targets stringSet, parser *arguments) (error) { //for n := len(pkgs) -1 ; n > 0; n-- { for n := 0; n < len(pkgs); n++ { pkg := pkgs[n] - dir := config.BuildDir + pkg.PackageBase + "/" - if targets.get(pkg.Name) { - err = passToMakepkg(dir, "-Cscfi", "--noconfirm") + + srcinfo := srcinfos[pkg.PackageBase] + version := srcinfo.CompleteVersion() + file, err := completeFileName(dir, pkg.Name + "-" + version.String()) + + if file != "" { + fmt.Println(boldRedFgBlackBg(arrow+" Warning:"), + blackBg(pkg.Name+"-"+pkg.Version+ " Already made -- skipping build")) } else { - err = passToMakepkg(dir, "-Cscfi", "--noconfirm", "--asdeps") + err = passToMakepkg(dir, "-Cscf", "--noconfirm") + if err != nil { + return err + } + + file, err = completeFileName(dir, pkg.Name + "-" + version.String()) + if err != nil { + return err + } + + if file == "" { + return fmt.Errorf("Could not find built package") + } } - if err != nil { - return + + arguments := parser.copy() + arguments.targets = make(stringSet) + arguments.op = "U" + arguments.delArg("confirm") + 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 + config.NoConfirm = true + + if targets.get(pkg.Name) { + arguments.addArg("asdeps") + } + + arguments.addTarget(file) + + err = passToPacman(arguments) + config.NoConfirm = oldConfirm + if err !=nil { + return err } } - return + return nil +} + +func completeFileName(dir, name string) (string, error) { + files, err := ioutil.ReadDir(dir) + if err != nil { + return "", err + } + + for _, file := range files { + if file.IsDir() { + continue + } + + if strings.HasPrefix(file.Name(), name) { + return dir + file.Name(), nil + } + } + + return "", nil } From e61263ff965f89d30f30a4be0d03a15cc515f144 Mon Sep 17 00:00:00 2001 From: morganamilo Date: Thu, 15 Feb 2018 20:51:18 +0000 Subject: [PATCH 06/10] Install repo deps for aur packages at the start Install all deps for aur packages after the user confirms they want to continue installing. This takes most of the load off of makepkg -s but the -s is still left in for some edge cases with split packages. --- install.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/install.go b/install.go index 662ec28f..5bf601ea 100644 --- a/install.go +++ b/install.go @@ -84,6 +84,30 @@ func install(parser *arguments) error { if !continueTask("Proceed with install?", "nN") { return fmt.Errorf("Aborting due to user") } + + if len(dc.RepoMake) + len(dc.Repo) > 0 { + arguments := parser.copy() + arguments.delArg("u", "sysupgrade") + arguments.delArg("y", "refresh") + arguments.op = "S" + arguments.targets = make(stringSet) + arguments.addArg("needed", "asdeps") + for _, pkg := range dc.Repo { + arguments.addTarget(pkg.Name()) + } + for _, pkg := range dc.RepoMake { + arguments.addTarget(pkg.Name()) + } + + oldConfirm := config.NoConfirm + config.NoConfirm = true + passToPacman(arguments) + config.NoConfirm = oldConfirm + if err != nil { + return err + } + } + // if !continueTask("Proceed with download?", "nN") { // return fmt.Errorf("Aborting due to user") // } From e1f3cb66821babb9dbee1b1bae1ea4b990bdc324 Mon Sep 17 00:00:00 2001 From: morganamilo Date: Thu, 15 Feb 2018 21:23:34 +0000 Subject: [PATCH 07/10] run cleanafter after finishing the install process Cleanafter is now run right at the very end of install instead of after each makepkg command. --- cmd.go | 5 ----- install.go | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/cmd.go b/cmd.go index ec8d7beb..30ac5b63 100644 --- a/cmd.go +++ b/cmd.go @@ -702,11 +702,6 @@ func passToMakepkg(dir string, args ...string) (err error) { err = cmd.Run() if err == nil { _ = saveVCSInfo() - if config.CleanAfter { - fmt.Println(boldGreenFg(arrow + - " CleanAfter enabled. Deleting source folder.")) - os.RemoveAll(dir) - } } return } diff --git a/install.go b/install.go index 5bf601ea..d6c92b35 100644 --- a/install.go +++ b/install.go @@ -195,6 +195,11 @@ func install(parser *arguments) error { config.NoConfirm = oldValue } + if config.CleanAfter { + clean(dc.AurMake) + clean(dc.Aur) + } + return nil } @@ -416,6 +421,17 @@ func buildInstallPkgBuilds(pkgs []*rpc.Pkg, srcinfos map[string]*gopkg.PKGBUILD, return nil } +func clean(pkgs []*rpc.Pkg) { + for _, pkg := range pkgs { + dir := config.BuildDir + pkg.PackageBase + "/" + + fmt.Println(boldGreenFg(arrow + + " CleanAfter enabled. Deleting " + pkg.Name +" source folder.")) + os.RemoveAll(dir) + } +} + + func completeFileName(dir, name string) (string, error) { files, err := ioutil.ReadDir(dir) if err != nil { From cdaee7d1d4e0bd4f1a8cedf3aa6b480f1b628242 Mon Sep 17 00:00:00 2001 From: morganamilo Date: Thu, 15 Feb 2018 21:23:34 +0000 Subject: [PATCH 08/10] Improve support for split packages Split packages are now grouped together when printing displaying the package base and the packages inside of the base to beinstalled. If only one packge is to be installed from a base and the package name matches the base name print normally Only build and install once per package base Only ask questions once per package base for editing pkgbuils and clean build --- dependencies.go | 56 ++++++++++------ install.go | 174 ++++++++++++++++++++++++++---------------------- print.go | 97 ++++++++++++++++++++------- 3 files changed, 205 insertions(+), 122 deletions(-) diff --git a/dependencies.go b/dependencies.go index 1d2de0e4..38d7b669 100644 --- a/dependencies.go +++ b/dependencies.go @@ -16,9 +16,10 @@ type depTree struct { type depCatagories struct { Repo []*alpm.Package - RepoMake []*alpm.Package - Aur []*rpc.Pkg - AurMake []*rpc.Pkg + Aur[]*rpc.Pkg + MakeOnly stringSet + Bases map[string][]*rpc.Pkg + } func makeDepTree() *depTree { @@ -34,10 +35,10 @@ func makeDepTree() *depTree { func makeDependCatagories() *depCatagories { dc := depCatagories{ - make([]*alpm.Package, 0), make([]*alpm.Package, 0), make([]*rpc.Pkg, 0), - make([]*rpc.Pkg, 0), + make(stringSet), + make(map[string][]*rpc.Pkg), } return &dc @@ -51,6 +52,7 @@ func getNameFromDep(dep string) string { func getDepCatagories(pkgs []string, dt *depTree) (*depCatagories, error) { dc := makeDependCatagories() + seen := make(stringSet) for _, pkg := range pkgs { dep := getNameFromDep(pkg) @@ -63,12 +65,22 @@ func getDepCatagories(pkgs []string, dt *depTree) (*depCatagories, error) { aurpkg, exists := dt.Aur[dep] if exists { - depCatagoriesRecursive(aurpkg, dc, dt, false) - dc.Aur = append(dc.Aur, aurpkg) + depCatagoriesRecursive(aurpkg, dc, dt, false, seen) + if !seen.get(aurpkg.PackageBase) { + dc.Aur = append(dc.Aur, aurpkg) + seen.set(aurpkg.PackageBase) + } + + _, ok := dc.Bases[aurpkg.PackageBase] + if !ok { + dc.Bases[aurpkg.PackageBase] = make([]*rpc.Pkg, 0) + } + dc.Bases[aurpkg.PackageBase] = append(dc.Bases[aurpkg.PackageBase], aurpkg) delete(dt.Aur, dep) } } + return dc, nil } @@ -81,33 +93,40 @@ func repoDepCatagoriesRecursive(pkg *alpm.Package, dc *depCatagories, dt *depTre repoDepCatagoriesRecursive(alpmpkg, dc, dt, isMake) if isMake { - dc.RepoMake = append(dc.RepoMake, alpmpkg) - } else { - dc.Repo = append(dc.Repo, alpmpkg) + dc.MakeOnly.set(alpmpkg.Name()) } + dc.Repo = append(dc.Repo, alpmpkg) } return nil }) } -func depCatagoriesRecursive(pkg *rpc.Pkg, dc *depCatagories, dt *depTree, isMake bool) { +func depCatagoriesRecursive(pkg *rpc.Pkg, dc *depCatagories, dt *depTree, isMake bool, seen stringSet) { for _, deps := range [2][]string{pkg.Depends, pkg.MakeDepends} { for _, _dep := range deps { dep := getNameFromDep(_dep) aurpkg, exists := dt.Aur[dep] if exists { - delete(dt.Aur, dep) - depCatagoriesRecursive(aurpkg, dc, dt, isMake) + _, ok := dc.Bases[aurpkg.PackageBase] + if !ok { + dc.Bases[aurpkg.PackageBase] = make([]*rpc.Pkg, 0) + } + dc.Bases[aurpkg.PackageBase] = append(dc.Bases[aurpkg.PackageBase], aurpkg) - if isMake { - dc.AurMake = append(dc.AurMake, aurpkg) - } else { + delete(dt.Aur, dep) + depCatagoriesRecursive(aurpkg, dc, dt, isMake, seen) + + if !seen.get(aurpkg.PackageBase) { dc.Aur = append(dc.Aur, aurpkg) + seen.set(aurpkg.PackageBase) } + if isMake { + dc.MakeOnly.set(aurpkg.Name) + } } alpmpkg, exists := dt.Repo[dep] @@ -116,11 +135,10 @@ func depCatagoriesRecursive(pkg *rpc.Pkg, dc *depCatagories, dt *depTree, isMake repoDepCatagoriesRecursive(alpmpkg, dc, dt, isMake) if isMake { - dc.RepoMake = append(dc.RepoMake, alpmpkg) - } else { - dc.Repo = append(dc.Repo, alpmpkg) + dc.MakeOnly.set(alpmpkg.Name()) } + dc.Repo = append(dc.Repo, alpmpkg) } } diff --git a/install.go b/install.go index d6c92b35..d5da9052 100644 --- a/install.go +++ b/install.go @@ -40,7 +40,7 @@ func install(parser *arguments) error { } if len(aurs) != 0 { - //todo make pretty + //todo mamakeke pretty fmt.Println(greenFg(arrow), greenFg("Resolving Dependencies")) dt, err := getDepTree(aurs) @@ -58,13 +58,6 @@ func install(parser *arguments) error { return err } - for _, pkg := range dc.AurMake { - if pkg.Maintainer == "" { - fmt.Println(boldRedFgBlackBg(arrow+" Warning:"), - blackBg(pkg.Name+"-"+pkg.Version+" is orphaned")) - } - } - for _, pkg := range dc.Aur { if pkg.Maintainer == "" { fmt.Println(boldRedFgBlackBg(arrow+" Warning:"), @@ -72,20 +65,24 @@ func install(parser *arguments) error { } } - printDownloadsFromRepo("Repo", dc.Repo) - printDownloadsFromRepo("Repo Make", dc.RepoMake) - printDownloadsFromAur("AUR", dc.Aur) - printDownloadsFromAur("AUR Make", dc.AurMake) + //printDownloadsFromRepo("Repo", dc.Repo) + //printDownloadsFromRepo("Repo Make", dc.RepoMake) + //printDownloadsFromAur("AUR", dc.Aur) + //printDownloadsFromAur("AUR Make", dc.AurMake) + + //fmt.Println(dc.MakeOnly) + //fmt.Println(dc.AurSet) - askCleanBuilds(dc.AurMake) - askCleanBuilds(dc.Aur) + printDepCatagories(dc) + + askCleanBuilds(dc.Aur, dc.Bases) fmt.Println() if !continueTask("Proceed with install?", "nN") { return fmt.Errorf("Aborting due to user") } - if len(dc.RepoMake) + len(dc.Repo) > 0 { + if len(dc.Repo) > 0 { arguments := parser.copy() arguments.delArg("u", "sysupgrade") arguments.delArg("y", "refresh") @@ -95,9 +92,6 @@ func install(parser *arguments) error { for _, pkg := range dc.Repo { arguments.addTarget(pkg.Name()) } - for _, pkg := range dc.RepoMake { - arguments.addTarget(pkg.Name()) - } oldConfirm := config.NoConfirm config.NoConfirm = true @@ -113,26 +107,18 @@ func install(parser *arguments) error { // } if _, ok := arguments.options["gendb"]; !ok { - err = checkForConflicts(dc.Aur, dc.AurMake, dc.Repo, dc.RepoMake) + //err = checkForConflicts(dc.Aur, dc.AurMake, dc.Repo, dc.RepoMake) if err != nil { return err } } - err = dowloadPkgBuilds(dc.AurMake) - if err != nil { - return err - } - err = dowloadPkgBuilds(dc.Aur) + err = dowloadPkgBuilds(dc.Aur, dc.Bases) if err != nil { return err } - err = askEditPkgBuilds(dc.AurMake) - if err != nil { - return err - } - err = askEditPkgBuilds(dc.Aur) + err = askEditPkgBuilds(dc.Aur, dc.Bases) if err != nil { return err } @@ -146,34 +132,22 @@ func install(parser *arguments) error { // return fmt.Errorf("Aborting due to user") // } - err = downloadPkgBuildsSources(dc.AurMake) - if err != nil { - return err - } err = downloadPkgBuildsSources(dc.Aur) if err != nil { return err } - err = parsesrcinfos(dc.AurMake, srcinfos) - if err != nil { - return err - } err = parsesrcinfos(dc.Aur, srcinfos) if err != nil { return err } - err = buildInstallPkgBuilds(dc.AurMake, srcinfos, parser.targets, parser) - if err != nil { - return err - } - err = buildInstallPkgBuilds(dc.Aur, srcinfos, parser.targets, parser) + err = buildInstallPkgBuilds(dc.Aur, srcinfos, parser.targets, parser, dc.Bases) if err != nil { return err } - if len(dc.RepoMake)+len(dc.AurMake) > 0 { + if len(dc.MakeOnly) > 0 { if continueTask("Remove make dependencies?", "yY") { return nil } @@ -181,12 +155,8 @@ func install(parser *arguments) error { removeArguments := makeArguments() removeArguments.addArg("R", "u") - for _, pkg := range dc.RepoMake { - removeArguments.addTarget(pkg.Name()) - } - - for _, pkg := range dc.AurMake { - removeArguments.addTarget(pkg.Name) + for pkg := range dc.MakeOnly { + removeArguments.addTarget(pkg) } oldValue := config.NoConfirm @@ -196,7 +166,6 @@ func install(parser *arguments) error { } if config.CleanAfter { - clean(dc.AurMake) clean(dc.Aur) } @@ -206,12 +175,21 @@ func install(parser *arguments) error { return nil } -func askCleanBuilds(pkgs []*rpc.Pkg) { +func askCleanBuilds(pkgs []*rpc.Pkg, bases map[string][]*rpc.Pkg) { for _, pkg := range pkgs { dir := config.BuildDir + pkg.PackageBase + "/" if _, err := os.Stat(dir); !os.IsNotExist(err) { - if !continueTask(pkg.Name+" Directory exists. Clean Build?", "yY") { + str := pkg.Name + if len(bases[pkg.PackageBase]) > 1 || pkg.PackageBase != pkg.Name { + str += " (" + for _, split := range bases[pkg.PackageBase] { + str += split.Name + " " + } + str = str[:len(str)-1] + ")" + } + + if !continueTask(str + " Directory exists. Clean Build?", "yY") { _ = os.RemoveAll(config.BuildDir + pkg.PackageBase) } } @@ -288,11 +266,20 @@ func checkForConflicts(aur []*rpc.Pkg, aurMake []*rpc.Pkg, repo []*alpm.Package, return nil } -func askEditPkgBuilds(pkgs []*rpc.Pkg) (error) { +func askEditPkgBuilds(pkgs []*rpc.Pkg, bases map[string][]*rpc.Pkg) (error) { for _, pkg := range pkgs { dir := config.BuildDir + pkg.PackageBase + "/" - if !continueTask(pkg.Name+" Edit PKGBUILD?", "yY") { + str := "Edit PKGBUILD? " + pkg.PackageBase + if len(bases[pkg.PackageBase]) > 1 || pkg.PackageBase != pkg.Name { + str += " (" + for _, split := range bases[pkg.PackageBase] { + str += split.Name + " " + } + str = str[:len(str)-1] + ")" + } + + if !continueTask(str, "yY") { editcmd := exec.Command(editor(), dir+"PKGBUILD") editcmd.Stdin, editcmd.Stdout, editcmd.Stderr = os.Stdin, os.Stdout, os.Stderr editcmd.Run() @@ -336,10 +323,18 @@ func parsesrcinfos(pkgs []*rpc.Pkg, srcinfos map[string]*gopkg.PKGBUILD) (error) return nil } -func dowloadPkgBuilds(pkgs []*rpc.Pkg) (err error) { +func dowloadPkgBuilds(pkgs []*rpc.Pkg, bases map[string][]*rpc.Pkg) (err error) { for _, pkg := range pkgs { //todo make pretty - fmt.Println("Downloading:", pkg.Name+"-"+pkg.Version) + str := "Downloading: " + pkg.PackageBase+"-"+pkg.Version + if len(bases[pkg.PackageBase]) > 1 || pkg.PackageBase != pkg.Name { + str += " (" + for _, split := range bases[pkg.PackageBase] { + str += split.Name + " " + } + str = str[:len(str)-1] + ")" + } + fmt.Println(str) err = downloadAndUnpack(baseURL+pkg.URLPath, config.BuildDir, false) if err != nil { @@ -362,32 +357,35 @@ func downloadPkgBuildsSources(pkgs []*rpc.Pkg) (err error) { return } -func buildInstallPkgBuilds(pkgs []*rpc.Pkg, srcinfos map[string]*gopkg.PKGBUILD, targets stringSet, parser *arguments) (error) { +func buildInstallPkgBuilds(pkgs []*rpc.Pkg, srcinfos map[string]*gopkg.PKGBUILD, targets stringSet, parser *arguments, bases map[string][]*rpc.Pkg) (error) { //for n := len(pkgs) -1 ; n > 0; n-- { for n := 0; n < len(pkgs); n++ { pkg := pkgs[n] + dir := config.BuildDir + pkg.PackageBase + "/" + built := true srcinfo := srcinfos[pkg.PackageBase] version := srcinfo.CompleteVersion() - file, err := completeFileName(dir, pkg.Name + "-" + version.String()) - if file != "" { - fmt.Println(boldRedFgBlackBg(arrow+" Warning:"), - blackBg(pkg.Name+"-"+pkg.Version+ " Already made -- skipping build")) - } else { - err = passToMakepkg(dir, "-Cscf", "--noconfirm") - if err != nil { - return err - } - - file, err = completeFileName(dir, pkg.Name + "-" + version.String()) + for _, split:= range bases[pkg.PackageBase] { + file, err := completeFileName(dir, split.Name + "-" + version.String()) if err != nil { return err } if file == "" { - return fmt.Errorf("Could not find built package") + built = false + } + } + + if built { + fmt.Println(boldRedFgBlackBg(arrow+" Warning:"), + blackBg(pkg.Name+"-"+pkg.Version+ " Already made -- skipping build")) + } else { + err := passToMakepkg(dir, "-Cscf", "--noconfirm") + if err != nil { + return err } } @@ -402,20 +400,38 @@ func buildInstallPkgBuilds(pkgs []*rpc.Pkg, srcinfos map[string]*gopkg.PKGBUILD, arguments.delArg("u", "sysupgrade") arguments.delArg("w", "downloadonly") + depArguments := makeArguments() + depArguments.addArg("D", "asdeps") + + for _, split := range bases[pkg.PackageBase] { + file, err := completeFileName(dir, split.Name + "-" + version.String()) + if err != nil { + return err + } + + if file == "" { + return fmt.Errorf("Could not find built package " + split.Name + "-" + version.String()) + } + + arguments.addTarget(file) + if !targets.get(split.Name) { + depArguments.addTarget(split.Name) + } + } + oldConfirm := config.NoConfirm config.NoConfirm = true - - if targets.get(pkg.Name) { - arguments.addArg("asdeps") - } - - arguments.addTarget(file) - - err = passToPacman(arguments) - config.NoConfirm = oldConfirm - if err !=nil { + err := passToPacman(arguments) + if err != nil { return err } + if len(depArguments.targets) > 0 { + err = passToPacman(depArguments) + if err != nil { + return err + } + } + config.NoConfirm = oldConfirm } return nil diff --git a/print.go b/print.go index 6535aaba..d5e62f35 100644 --- a/print.go +++ b/print.go @@ -95,32 +95,81 @@ func (s repoQuery) printSearch() { } // printDownloadsFromRepo prints repository packages to be downloaded -func printDownloadsFromRepo(repoType string, repo []*alpm.Package) { - var packages string - for _, v := range repo { - packages += v.Name() + " " +func printDepCatagories(dc *depCatagories) { + repo := "" + repoMake := "" + aur := "" + aurMake := "" + + repoLen := 0 + repoMakeLen := 0 + aurLen := 0 + aurMakeLen := 0 + + for _, pkg := range dc.Repo { + if dc.MakeOnly.get(pkg.Name()) { + repoMake += " " + pkg.Name() + repoMakeLen++ + } else { + repo += " " + pkg.Name() + repoLen++ + } } + + for _, pkg := range dc.Aur { + pkgStr := " " + pkg.PackageBase + pkgStrMake := pkgStr + + push := false + pushMake := false + + if len(dc.Bases[pkg.PackageBase]) > 1 || pkg.PackageBase != pkg.Name { + pkgStr += " (" + pkgStrMake += " (" + + for _, split := range dc.Bases[pkg.PackageBase] { + if dc.MakeOnly.get(split.Name) { + pkgStrMake += split.Name + " " + aurMakeLen++ + pushMake = true + } else { + pkgStr += split.Name + " " + aurLen++ + push = true + } + } + + pkgStr = pkgStr[:len(pkgStr)-1] + ")" + pkgStrMake = pkgStrMake[:len(pkgStrMake)-1] + ")" + } else if dc.MakeOnly.get(pkg.Name) { + aurMakeLen++ + pushMake = true + } else { + aurLen++ + push = true + } + + if push { + aur += pkgStr + } + if pushMake { + aurMake += pkgStrMake + } + } + + printDownloads("Repo", repoLen, repo) + printDownloads("Repo Make", repoMakeLen, repoMake) + printDownloads("Aur", aurLen, aur) + printDownloads("Aur Make", aurMakeLen, aurMake) +} + +func printDownloads(repoName string, length int, packages string) { + if length < 1 { + return + } + repoInfo := boldBlueFg( - "[" + repoType + ", " + strconv.Itoa(len(repo)) + " packages] ") - if len(repo) > 0 { - printDownloads(repoInfo, packages) - } -} - -// printDownloadsFromAur prints AUR packages to be downloaded -func printDownloadsFromAur(repoType string, repo []*rpc.Pkg) { - var packages string - for _, v := range repo { - packages += v.Name + " " - } - repoInfo := redFg( - "[" + repoType + ", " + strconv.Itoa(len(repo)) + " packages] ") - if len(repo) > 0 { - printDownloads(repoInfo, packages) - } -} - -func printDownloads(repoInfo, packages string) { + "[" + repoName + ": " + strconv.Itoa(length) + "]") fmt.Println(repoInfo + yellowFg(packages)) } From 03295c3f3fc91f9dddebb4abcb3a7d43c2dad5b9 Mon Sep 17 00:00:00 2001 From: morganamilo Date: Fri, 16 Feb 2018 15:33:17 +0000 Subject: [PATCH 09/10] Install repo deps for aur packages after questions --- install.go | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/install.go b/install.go index d5da9052..25b4e648 100644 --- a/install.go +++ b/install.go @@ -81,27 +81,7 @@ func install(parser *arguments) error { if !continueTask("Proceed with install?", "nN") { return fmt.Errorf("Aborting due to user") } - - if len(dc.Repo) > 0 { - arguments := parser.copy() - arguments.delArg("u", "sysupgrade") - arguments.delArg("y", "refresh") - arguments.op = "S" - arguments.targets = make(stringSet) - arguments.addArg("needed", "asdeps") - for _, pkg := range dc.Repo { - arguments.addTarget(pkg.Name()) - } - - oldConfirm := config.NoConfirm - config.NoConfirm = true - passToPacman(arguments) - config.NoConfirm = oldConfirm - if err != nil { - return err - } - } - + // if !continueTask("Proceed with download?", "nN") { // return fmt.Errorf("Aborting due to user") // } @@ -122,6 +102,27 @@ func install(parser *arguments) error { if err != nil { return err } + + if len(dc.Repo) > 0 { + arguments := parser.copy() + arguments.delArg("u", "sysupgrade") + arguments.delArg("y", "refresh") + arguments.op = "S" + arguments.targets = make(stringSet) + arguments.addArg("needed", "asdeps") + for _, pkg := range dc.Repo { + arguments.addTarget(pkg.Name()) + } + + oldConfirm := config.NoConfirm + config.NoConfirm = true + passToPacman(arguments) + config.NoConfirm = oldConfirm + if err != nil { + return err + } + } + if _, ok := arguments.options["gendb"]; ok { fmt.Println("GenDB finished. No packages were installed") From 3c7118e9dec30fe37b9d7a306c122797027fecee Mon Sep 17 00:00:00 2001 From: morganamilo Date: Fri, 16 Feb 2018 16:27:53 +0000 Subject: [PATCH 10/10] Have MakeOnly live up to it's name Fix for packages which are makedeps to one package but runtime deps to another showing up in MakeOnly --- dependencies.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/dependencies.go b/dependencies.go index 38d7b669..acce02d9 100644 --- a/dependencies.go +++ b/dependencies.go @@ -80,6 +80,22 @@ func getDepCatagories(pkgs []string, dt *depTree) (*depCatagories, error) { } } + for _, base := range dc.Bases { + for _, pkg := range base { + for _, dep := range pkg.Depends { + dc.MakeOnly.remove(dep) + } + } + } + + for _, pkg := range dc.Repo { + pkg.Depends().ForEach(func(_dep alpm.Depend) error { + dep := _dep.Name + dc.MakeOnly.remove(dep) + + return nil + }) + } return dc, nil }