mirror of
https://github.com/Jguer/yay.git
synced 2024-11-06 17:17:22 +01:00
e28319fece
* remove legacy engine * remove legacy dep handlers * use prepare for gendb * remove unused method * remove aur client old interface * remove unused menu fns * remove inactive upgrademenu option * unexport printInfo
231 lines
5.5 KiB
Go
231 lines
5.5 KiB
Go
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)
|
|
}
|