123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- package main
- import (
- "context"
- "errors"
- "fmt"
- "os"
- "path/filepath"
- "strings"
- "github.com/leonelquinteros/gotext"
- "github.com/Jguer/yay/v12/pkg/settings"
- "github.com/Jguer/yay/v12/pkg/settings/exe"
- "github.com/Jguer/yay/v12/pkg/settings/parser"
- "github.com/Jguer/yay/v12/pkg/vcs"
- )
- func setPkgReason(ctx context.Context,
- cmdBuilder exe.ICmdBuilder,
- mode parser.TargetMode,
- cmdArgs *parser.Arguments, pkgs []string, exp bool,
- ) error {
- if len(pkgs) == 0 {
- return nil
- }
- cmdArgs = cmdArgs.CopyGlobal()
- if exp {
- if err := cmdArgs.AddArg("q", "D", "asexplicit"); err != nil {
- return err
- }
- } else {
- if err := cmdArgs.AddArg("q", "D", "asdeps"); err != nil {
- return err
- }
- }
- for _, compositePkgName := range pkgs {
- pkgSplit := strings.Split(compositePkgName, "/")
- pkgName := pkgSplit[0]
- if len(pkgSplit) > 1 {
- pkgName = pkgSplit[1]
- }
- cmdArgs.AddTarget(pkgName)
- }
- if err := cmdBuilder.Show(cmdBuilder.BuildPacmanCmd(ctx,
- cmdArgs, mode, settings.NoConfirm)); err != nil {
- return &SetPkgReasonError{exp: exp}
- }
- return nil
- }
- func asdeps(ctx context.Context,
- cmdBuilder exe.ICmdBuilder,
- mode parser.TargetMode, cmdArgs *parser.Arguments, pkgs []string,
- ) error {
- return setPkgReason(ctx, cmdBuilder, mode, cmdArgs, pkgs, false)
- }
- func asexp(ctx context.Context,
- cmdBuilder exe.ICmdBuilder,
- mode parser.TargetMode, cmdArgs *parser.Arguments, pkgs []string,
- ) error {
- return setPkgReason(ctx, cmdBuilder, mode, cmdArgs, pkgs, true)
- }
- func removeMake(ctx context.Context, config *settings.Configuration,
- cmdBuilder exe.ICmdBuilder, makeDeps []string, cmdArgs *parser.Arguments,
- ) error {
- removeArguments := cmdArgs.CopyGlobal()
- err := removeArguments.AddArg("R", "s", "u")
- if err != nil {
- return err
- }
- for _, pkg := range makeDeps {
- removeArguments.AddTarget(pkg)
- }
- oldValue := settings.NoConfirm
- settings.NoConfirm = true
- err = cmdBuilder.Show(cmdBuilder.BuildPacmanCmd(ctx,
- removeArguments, config.Mode, settings.NoConfirm))
- settings.NoConfirm = oldValue
- return err
- }
- func earlyRefresh(ctx context.Context, cfg *settings.Configuration, cmdBuilder exe.ICmdBuilder, cmdArgs *parser.Arguments) error {
- arguments := cmdArgs.Copy()
- if cfg.CombinedUpgrade {
- arguments.DelArg("u", "sysupgrade")
- }
- arguments.DelArg("s", "search")
- arguments.DelArg("i", "info")
- arguments.DelArg("l", "list")
- arguments.ClearTargets()
- return cmdBuilder.Show(cmdBuilder.BuildPacmanCmd(ctx,
- arguments, cfg.Mode, settings.NoConfirm))
- }
- func parsePackageList(ctx context.Context, cmdBuilder exe.ICmdBuilder,
- dir string,
- ) (pkgdests map[string]string, pkgVersion string, err error) {
- stdout, stderr, err := cmdBuilder.Capture(
- cmdBuilder.BuildMakepkgCmd(ctx, dir, "--packagelist"))
- if err != nil {
- return nil, "", fmt.Errorf("%s %w", stderr, err)
- }
- lines := strings.Split(stdout, "\n")
- pkgdests = make(map[string]string)
- for _, line := range lines {
- if line == "" {
- continue
- }
- fileName := filepath.Base(line)
- split := strings.Split(fileName, "-")
- if len(split) < 4 {
- return nil, "", errors.New(gotext.Get("cannot find package name: %v", split))
- }
- // pkgname-pkgver-pkgrel-arch.pkgext
- // This assumes 3 dashes after the pkgname, Will cause an error
- // if the PKGEXT contains a dash. Please no one do that.
- pkgName := strings.Join(split[:len(split)-3], "-")
- pkgVersion = strings.Join(split[len(split)-3:len(split)-1], "-")
- pkgdests[pkgName] = line
- }
- if len(pkgdests) == 0 {
- return nil, "", &NoPkgDestsFoundError{dir}
- }
- return pkgdests, pkgVersion, nil
- }
- func gitMerge(ctx context.Context, cmdBuilder exe.ICmdBuilder, dir string) error {
- _, stderr, err := cmdBuilder.Capture(
- cmdBuilder.BuildGitCmd(ctx,
- dir, "reset", "--hard", "HEAD"))
- if err != nil {
- return errors.New(gotext.Get("error resetting %s: %s", dir, stderr))
- }
- _, stderr, err = cmdBuilder.Capture(
- cmdBuilder.BuildGitCmd(ctx,
- dir, "merge", "--no-edit", "--ff"))
- if err != nil {
- return errors.New(gotext.Get("error merging %s: %s", dir, stderr))
- }
- return nil
- }
- func mergePkgbuilds(ctx context.Context, cmdBuilder exe.ICmdBuilder, pkgbuildDirs map[string]string) error {
- for _, dir := range pkgbuildDirs {
- err := gitMerge(ctx, cmdBuilder, dir)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func installPkgArchive(ctx context.Context,
- cmdBuilder exe.ICmdBuilder,
- mode parser.TargetMode,
- vcsStore vcs.Store,
- cmdArgs *parser.Arguments,
- pkgArchives []string,
- noConfirm bool,
- ) error {
- if len(pkgArchives) == 0 {
- return nil
- }
- arguments := cmdArgs.Copy()
- arguments.ClearTargets()
- arguments.Op = "U"
- arguments.DelArg("confirm")
- arguments.DelArg("noconfirm")
- arguments.DelArg("c", "clean")
- arguments.DelArg("i", "install")
- arguments.DelArg("q", "quiet")
- arguments.DelArg("y", "refresh")
- arguments.DelArg("u", "sysupgrade")
- arguments.DelArg("w", "downloadonly")
- arguments.DelArg("asdeps", "asdep")
- arguments.DelArg("asexplicit", "asexp")
- arguments.AddTarget(pkgArchives...)
- if errShow := cmdBuilder.Show(cmdBuilder.BuildPacmanCmd(ctx,
- arguments, mode, noConfirm)); errShow != nil {
- return errShow
- }
- if errStore := vcsStore.Save(); errStore != nil {
- fmt.Fprintln(os.Stderr, errStore)
- }
- return nil
- }
- func setInstallReason(ctx context.Context,
- cmdBuilder exe.ICmdBuilder, mode parser.TargetMode,
- cmdArgs *parser.Arguments, deps, exps []string,
- ) error {
- if len(deps)+len(exps) == 0 {
- return nil
- }
- if errDeps := asdeps(ctx, cmdBuilder, mode, cmdArgs, deps); errDeps != nil {
- return errDeps
- }
- return asexp(ctx, cmdBuilder, mode, cmdArgs, exps)
- }
|