From 5bb46ac1dea3d65b43706a5728ead1aaa52efd49 Mon Sep 17 00:00:00 2001 From: jguer Date: Fri, 9 Sep 2022 20:57:18 +0200 Subject: [PATCH] add repo install --- aur_source.go | 20 ++++++--- aur_source_test.go | 28 ++++-------- cmd.go | 2 +- install.go | 7 ++- local_install.go | 103 ++++++++++++++++++++++++++++++++++++++++++--- 5 files changed, 126 insertions(+), 34 deletions(-) diff --git a/aur_source.go b/aur_source.go index d693ed01..271ac7e4 100644 --- a/aur_source.go +++ b/aur_source.go @@ -9,7 +9,6 @@ import ( "github.com/leonelquinteros/gotext" - "github.com/Jguer/yay/v11/pkg/dep" "github.com/Jguer/yay/v11/pkg/multierror" "github.com/Jguer/yay/v11/pkg/settings/exe" "github.com/Jguer/yay/v11/pkg/stringset" @@ -32,7 +31,8 @@ func (e *ErrDownloadSource) Unwrap() error { } func downloadPKGBUILDSource(ctx context.Context, cmdBuilder exe.ICmdBuilder, dest, - base string, incompatible stringset.StringSet) (err error) { + base string, incompatible stringset.StringSet, +) error { dir := filepath.Join(dest, base) args := []string{"--verifysource", "-Ccf"} @@ -40,7 +40,7 @@ func downloadPKGBUILDSource(ctx context.Context, cmdBuilder exe.ICmdBuilder, des args = append(args, "--ignorearch") } - err = cmdBuilder.Show( + err := cmdBuilder.Show( cmdBuilder.BuildMakepkgCmd(ctx, dir, args...)) if err != nil { return ErrDownloadSource{inner: err, pkgName: base, errOut: ""} @@ -51,7 +51,8 @@ func downloadPKGBUILDSource(ctx context.Context, cmdBuilder exe.ICmdBuilder, des func downloadPKGBUILDSourceWorker(ctx context.Context, wg *sync.WaitGroup, dest string, cBase <-chan string, valOut chan<- string, errOut chan<- error, - cmdBuilder exe.ICmdBuilder, incompatible stringset.StringSet) { + cmdBuilder exe.ICmdBuilder, incompatible stringset.StringSet, +) { for base := range cBase { err := downloadPKGBUILDSource(ctx, cmdBuilder, dest, base, incompatible) if err != nil { @@ -65,9 +66,14 @@ func downloadPKGBUILDSourceWorker(ctx context.Context, wg *sync.WaitGroup, dest } func downloadPKGBUILDSourceFanout(ctx context.Context, cmdBuilder exe.ICmdBuilder, dest string, - bases []dep.Base, incompatible stringset.StringSet, maxConcurrentDownloads int) error { + bases []string, incompatible stringset.StringSet, maxConcurrentDownloads int, +) error { + if len(bases) == 0 { + return nil // no work to do + } + if len(bases) == 1 { - return downloadPKGBUILDSource(ctx, cmdBuilder, dest, bases[0].Pkgbase(), incompatible) + return downloadPKGBUILDSource(ctx, cmdBuilder, dest, bases[0], incompatible) } var ( @@ -84,7 +90,7 @@ func downloadPKGBUILDSourceFanout(ctx context.Context, cmdBuilder exe.ICmdBuilde go func() { for _, base := range bases { - c <- base.Pkgbase() + c <- base } close(c) diff --git a/aur_source_test.go b/aur_source_test.go index 46728ad1..623f05a2 100644 --- a/aur_source_test.go +++ b/aur_source_test.go @@ -9,9 +9,6 @@ import ( "github.com/stretchr/testify/assert" - "github.com/Jguer/aur" - - "github.com/Jguer/yay/v11/pkg/dep" "github.com/Jguer/yay/v11/pkg/multierror" "github.com/Jguer/yay/v11/pkg/settings/exe" "github.com/Jguer/yay/v11/pkg/stringset" @@ -84,14 +81,7 @@ func Test_downloadPKGBUILDSourceError(t *testing.T) { func Test_downloadPKGBUILDSourceFanout(t *testing.T) { t.Parallel() - bases := []dep.Base{ - {&aur.Pkg{PackageBase: "yay"}}, - {&aur.Pkg{PackageBase: "yay-bin"}}, - {&aur.Pkg{PackageBase: "yay-git"}}, - {&aur.Pkg{PackageBase: "yay-v11"}}, - {&aur.Pkg{PackageBase: "yay-v12"}}, - } - + bases := []string{"yay", "yay-bin", "yay-git", "yay-v11", "yay-v12"} for _, maxConcurrentDownloads := range []int{0, 3} { t.Run(fmt.Sprintf("maxconcurrentdownloads set to %d", maxConcurrentDownloads), func(t *testing.T) { cmdBuilder := &TestMakepkgBuilder{ @@ -122,9 +112,7 @@ func Test_downloadPKGBUILDSourceFanoutNoCC(t *testing.T) { test: t, } - bases := []dep.Base{ - {&aur.Pkg{PackageBase: "yay"}}, - } + bases := []string{"yay"} err := downloadPKGBUILDSourceFanout(context.TODO(), cmdBuilder, "/tmp", bases, stringset.Make(), 0) assert.NoError(t, err) @@ -145,12 +133,12 @@ func Test_downloadPKGBUILDSourceFanoutError(t *testing.T) { showError: &exec.ExitError{}, } - bases := []dep.Base{ - {&aur.Pkg{PackageBase: "yay"}}, - {&aur.Pkg{PackageBase: "yay-bin"}}, - {&aur.Pkg{PackageBase: "yay-git"}}, - {&aur.Pkg{PackageBase: "yay-v11"}}, - {&aur.Pkg{PackageBase: "yay-v12"}}, + bases := []string{ + "yay", + "yay-bin", + "yay-git", + "yay-v11", + "yay-v12", } err := downloadPKGBUILDSourceFanout(context.TODO(), cmdBuilder, "/tmp", bases, stringset.Make(), 0) diff --git a/cmd.go b/cmd.go index 5b784bbb..b32eb465 100644 --- a/cmd.go +++ b/cmd.go @@ -330,7 +330,7 @@ func handleUpgrade(ctx context.Context, config *settings.Configuration, dbExecutor db.Executor, cmdArgs *parser.Arguments, ) error { if cmdArgs.ExistsArg("i", "install") { - return installLocalPKGBUILD(ctx, cmdArgs, dbExecutor, false) + return installLocalPKGBUILD(ctx, cmdArgs, dbExecutor) } return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(ctx, diff --git a/install.go b/install.go index 431ba895..24a2c577 100644 --- a/install.go +++ b/install.go @@ -330,8 +330,13 @@ func install(ctx context.Context, cmdArgs *parser.Arguments, dbExecutor db.Execu config.AURURL, config.Runtime.CompletionPath, config.CompletionInterval, false) }() + bases := make([]string, 0, len(do.Aur)) + for _, base := range do.Aur { + bases = append(bases, base.Pkgbase()) + } + if errP := downloadPKGBUILDSourceFanout(ctx, config.Runtime.CmdBuilder, config.BuildDir, - do.Aur, incompatible, config.MaxConcurrentDownloads); errP != nil { + bases, incompatible, config.MaxConcurrentDownloads); errP != nil { text.Errorln(errP) } diff --git a/local_install.go b/local_install.go index fecb0bd1..8794b34a 100644 --- a/local_install.go +++ b/local_install.go @@ -1,3 +1,5 @@ +// Experimental code for install local with dependency refactoring +// Not at feature parity with install.go package main import ( @@ -8,19 +10,22 @@ import ( "github.com/Jguer/yay/v11/pkg/db" "github.com/Jguer/yay/v11/pkg/dep" + "github.com/Jguer/yay/v11/pkg/download" "github.com/Jguer/yay/v11/pkg/metadata" "github.com/Jguer/yay/v11/pkg/settings" + "github.com/Jguer/yay/v11/pkg/settings/exe" "github.com/Jguer/yay/v11/pkg/settings/parser" gosrc "github.com/Morganamilo/go-srcinfo" "github.com/leonelquinteros/gotext" "github.com/pkg/errors" ) +var ErrInstallRepoPkgs = errors.New(gotext.Get("error installing repo packages")) + func installLocalPKGBUILD( ctx context.Context, cmdArgs *parser.Arguments, dbExecutor db.Executor, - ignoreProviders bool, ) error { aurCache, err := metadata.NewAURCache(filepath.Join(config.BuildDir, "aur.json")) if err != nil { @@ -55,9 +60,37 @@ func installLocalPKGBUILD( topoSorted := graph.TopoSortedLayerMap() fmt.Println(topoSorted, len(topoSorted)) + preparer := &Preparer{dbExecutor: dbExecutor, cmdBuilder: config.Runtime.CmdBuilder} installer := &Installer{dbExecutor: dbExecutor} - installer.Install(ctx, topoSorted) + if err := preparer.PrepareWorkspace(ctx, topoSorted); err != nil { + return err + } + + return installer.Install(ctx, cmdArgs, topoSorted) +} + +type Preparer struct { + dbExecutor db.Executor + cmdBuilder exe.ICmdBuilder + aurBases []string +} + +func (preper *Preparer) PrepareWorkspace(ctx context.Context, targets []map[string]*dep.InstallInfo, +) error { + for _, layer := range targets { + for pkgBase, info := range layer { + if info.Source == dep.AUR { + preper.aurBases = append(preper.aurBases, pkgBase) + } + } + } + + _, errA := download.AURPKGBUILDRepos(ctx, + preper.cmdBuilder, preper.aurBases, config.AURURL, config.BuildDir, false) + if errA != nil { + return errA + } return nil } @@ -66,10 +99,10 @@ type Installer struct { dbExecutor db.Executor } -func (installer *Installer) Install(ctx context.Context, targets []map[string]*dep.InstallInfo) error { +func (installer *Installer) Install(ctx context.Context, cmdArgs *parser.Arguments, targets []map[string]*dep.InstallInfo) error { // Reorganize targets into layers of dependencies for i := len(targets) - 1; i >= 0; i-- { - err := installer.handleLayer(ctx, targets[i]) + err := installer.handleLayer(ctx, cmdArgs, targets[i]) if err != nil { // rollback return err @@ -95,7 +128,7 @@ func (m *MapBySourceAndType) String() string { return s } -func (installer *Installer) handleLayer(ctx context.Context, layer map[string]*dep.InstallInfo) error { +func (installer *Installer) handleLayer(ctx context.Context, cmdArgs *parser.Arguments, layer map[string]*dep.InstallInfo) error { // Install layer depByTypeAndReason := make(MapBySourceAndType) for name, info := range layer { @@ -108,5 +141,65 @@ func (installer *Installer) handleLayer(ctx context.Context, layer map[string]*d fmt.Printf("%v\n", depByTypeAndReason) + syncDeps, syncExp := make([]string, 0), make([]string, 0) + repoTargets := make([]string, 0) + + for source, reasons := range depByTypeAndReason { + switch source { + case dep.AUR: + case dep.Sync: + for reason, names := range reasons { + switch reason { + case dep.Explicit: + if cmdArgs.ExistsArg("asdeps", "asdep") { + syncDeps = append(syncDeps, names...) + } else { + syncExp = append(syncExp, names...) + } + case dep.CheckDep: + fallthrough + case dep.MakeDep: + fallthrough + case dep.Dep: + syncDeps = append(syncDeps, names...) + } + + repoTargets = append(repoTargets, names...) + } + } + } + + fmt.Println(syncDeps, syncExp) + + errShow := installer.installRepoPackages(ctx, cmdArgs, repoTargets, syncDeps, syncExp) + if errShow != nil { + return ErrInstallRepoPkgs + } + return nil } + +func (*Installer) installRepoPackages(ctx context.Context, cmdArgs *parser.Arguments, + repoTargets, // all repo targets + syncDeps, // repo targets that are deps + syncExp []string, // repo targets that are exp +) error { + arguments := cmdArgs.Copy() + arguments.DelArg("asdeps", "asdep") + arguments.DelArg("asexplicit", "asexp") + arguments.DelArg("i", "install") + arguments.Op = "S" + arguments.ClearTargets() + arguments.AddTarget(repoTargets...) + errShow := config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(ctx, + arguments, config.Runtime.Mode, settings.NoConfirm)) + + if errD := asdeps(ctx, cmdArgs, syncDeps); errD != nil { + return errD + } + + if errE := asexp(ctx, cmdArgs, syncExp); errE != nil { + return errE + } + return errShow +}