mirror of
				https://github.com/Jguer/yay.git
				synced 2025-11-04 00:03:44 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			225 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			225 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
	"fmt"
 | 
						|
	"os"
 | 
						|
	"os/exec"
 | 
						|
	"os/user"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	alpm "github.com/jguer/go-alpm"
 | 
						|
)
 | 
						|
 | 
						|
// Verbosity settings for search
 | 
						|
const (
 | 
						|
	NumberMenu = iota
 | 
						|
	Detailed
 | 
						|
	Minimal
 | 
						|
)
 | 
						|
 | 
						|
// Describes Sorting method for numberdisplay
 | 
						|
const (
 | 
						|
	BottomUp = iota
 | 
						|
	TopDown
 | 
						|
)
 | 
						|
 | 
						|
// Configuration stores yay's config.
 | 
						|
type Configuration struct {
 | 
						|
	BuildDir      string `json:"buildDir"`
 | 
						|
	Editor        string `json:"editor"`
 | 
						|
	MakepkgBin    string `json:"makepkgbin"`
 | 
						|
	Shell         string `json:"-"`
 | 
						|
	PacmanBin     string `json:"pacmanbin"`
 | 
						|
	PacmanConf    string `json:"pacmanconf"`
 | 
						|
	TarBin        string `json:"tarbin"`
 | 
						|
	RequestSplitN int    `json:"requestsplitn"`
 | 
						|
	SearchMode    int    `json:"-"`
 | 
						|
	SortMode      int    `json:"sortmode"`
 | 
						|
	TimeUpdate    bool   `json:"timeupdate"`
 | 
						|
	NoConfirm     bool   `json:"noconfirm"`
 | 
						|
	Devel         bool   `json:"devel"`
 | 
						|
	CleanAfter    bool   `json:"cleanAfter"`
 | 
						|
}
 | 
						|
 | 
						|
const version = "2.219"
 | 
						|
 | 
						|
// baseURL givers the AUR default address.
 | 
						|
const baseURL string = "https://aur.archlinux.org"
 | 
						|
 | 
						|
var specialDBsauce = false
 | 
						|
 | 
						|
var savedInfo infos
 | 
						|
 | 
						|
// configfile holds yay config file path.
 | 
						|
var configFile string
 | 
						|
 | 
						|
// vcsfile holds yay vcs info file path.
 | 
						|
var vcsFile string
 | 
						|
 | 
						|
//completion file
 | 
						|
var completionFile string
 | 
						|
 | 
						|
// Updated returns if database has been updated
 | 
						|
var updated bool
 | 
						|
 | 
						|
// YayConf holds the current config values for yay.
 | 
						|
var config Configuration
 | 
						|
 | 
						|
// AlpmConf holds the current config values for pacman.
 | 
						|
var alpmConf alpm.PacmanConfig
 | 
						|
 | 
						|
// AlpmHandle is the alpm handle used by yay.
 | 
						|
var alpmHandle *alpm.Handle
 | 
						|
 | 
						|
func readAlpmConfig(pacmanconf string) (conf alpm.PacmanConfig, err error) {
 | 
						|
	file, err := os.Open(pacmanconf)
 | 
						|
	if err != nil {
 | 
						|
		return
 | 
						|
	}
 | 
						|
	conf, err = alpm.ParseConfig(file)
 | 
						|
	if err != nil {
 | 
						|
		return
 | 
						|
	}
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
// SaveConfig writes yay config to file.
 | 
						|
func (config *Configuration) saveConfig() error {
 | 
						|
	config.NoConfirm = false
 | 
						|
	marshalledinfo, _ := json.MarshalIndent(config, "", "\t")
 | 
						|
	in, err := os.OpenFile(configFile, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
 | 
						|
	if err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
	defer in.Close()
 | 
						|
	_, err = in.Write(marshalledinfo)
 | 
						|
	if err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
	err = in.Sync()
 | 
						|
	return err
 | 
						|
}
 | 
						|
 | 
						|
func defaultSettings(config *Configuration) {
 | 
						|
	u, err := user.Current()
 | 
						|
	if err != nil {
 | 
						|
		panic(err)
 | 
						|
	}
 | 
						|
	config.BuildDir = fmt.Sprintf("/tmp/yaytmp-%s/", u.Uid)
 | 
						|
	config.CleanAfter = false
 | 
						|
	config.Editor = ""
 | 
						|
	config.Devel = false
 | 
						|
	config.MakepkgBin = "/usr/bin/makepkg"
 | 
						|
	config.NoConfirm = false
 | 
						|
	config.PacmanBin = "/usr/bin/pacman"
 | 
						|
	config.PacmanConf = "/etc/pacman.conf"
 | 
						|
	config.SortMode = BottomUp
 | 
						|
	config.TarBin = "/usr/bin/bsdtar"
 | 
						|
	config.TimeUpdate = false
 | 
						|
	config.RequestSplitN = 150
 | 
						|
}
 | 
						|
 | 
						|
// Editor returns the preferred system editor.
 | 
						|
func editor() string {
 | 
						|
	switch {
 | 
						|
	case config.Editor != "":
 | 
						|
		editor, err := exec.LookPath(config.Editor)
 | 
						|
		if err != nil {
 | 
						|
			fmt.Println(err)
 | 
						|
		} else {
 | 
						|
			return editor
 | 
						|
		}
 | 
						|
		fallthrough
 | 
						|
	case os.Getenv("EDITOR") != "":
 | 
						|
		editor, err := exec.LookPath(os.Getenv("EDITOR"))
 | 
						|
		if err != nil {
 | 
						|
			fmt.Println(err)
 | 
						|
		} else {
 | 
						|
			return editor
 | 
						|
		}
 | 
						|
		fallthrough
 | 
						|
	case os.Getenv("VISUAL") != "":
 | 
						|
		editor, err := exec.LookPath(os.Getenv("VISUAL"))
 | 
						|
		if err != nil {
 | 
						|
			fmt.Println(err)
 | 
						|
		} else {
 | 
						|
			return editor
 | 
						|
		}
 | 
						|
		fallthrough
 | 
						|
	default:
 | 
						|
		fmt.Printf("\x1b[1;31;40mWarning: \x1B[1;33;40m$EDITOR\x1b[0;37;40m is not set.\x1b[0m\nPlease add $EDITOR or to your environment variables.\n")
 | 
						|
 | 
						|
	editorLoop:
 | 
						|
		fmt.Printf("\x1b[32m%s\x1b[0m ", "Edit PKGBUILD with:")
 | 
						|
		var editorInput string
 | 
						|
		_, err := fmt.Scanln(&editorInput)
 | 
						|
		if err != nil {
 | 
						|
			fmt.Println(err)
 | 
						|
			goto editorLoop
 | 
						|
		}
 | 
						|
 | 
						|
		editor, err := exec.LookPath(editorInput)
 | 
						|
		if err != nil {
 | 
						|
			fmt.Println(err)
 | 
						|
			goto editorLoop
 | 
						|
		}
 | 
						|
		return editor
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// ContinueTask prompts if user wants to continue task.
 | 
						|
//If NoConfirm is set the action will continue without user input.
 | 
						|
func continueTask(s string, def string) (cont bool) {
 | 
						|
	if config.NoConfirm {
 | 
						|
		return true
 | 
						|
	}
 | 
						|
	var postFix string
 | 
						|
 | 
						|
	if def == "nN" {
 | 
						|
		postFix = "[Y/n] "
 | 
						|
	} else {
 | 
						|
		postFix = "[y/N] "
 | 
						|
	}
 | 
						|
 | 
						|
	var response string
 | 
						|
	fmt.Printf("\x1b[1;32m==> %s\x1b[1;37m %s\x1b[0m", s, postFix)
 | 
						|
 | 
						|
	n, err := fmt.Scanln(&response)
 | 
						|
	if err != nil || n == 0 {
 | 
						|
		return true
 | 
						|
	}
 | 
						|
 | 
						|
	if response == string(def[0]) || response == string(def[1]) {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
 | 
						|
	return true
 | 
						|
}
 | 
						|
 | 
						|
// PassToPacman outsorces execution to pacman binary without modifications.
 | 
						|
func passToPacman(op string, pkgs []string, flags []string) error {
 | 
						|
	var cmd *exec.Cmd
 | 
						|
	var args []string
 | 
						|
 | 
						|
	args = append(args, op)
 | 
						|
	if len(pkgs) != 0 {
 | 
						|
		args = append(args, pkgs...)
 | 
						|
	}
 | 
						|
 | 
						|
	if len(flags) != 0 {
 | 
						|
		args = append(args, flags...)
 | 
						|
	}
 | 
						|
 | 
						|
	if strings.Contains(op, "-Q") || op == "Si" {
 | 
						|
		cmd = exec.Command(config.PacmanBin, args...)
 | 
						|
	} else {
 | 
						|
		args = append([]string{config.PacmanBin}, args...)
 | 
						|
		cmd = exec.Command("sudo", args...)
 | 
						|
	}
 | 
						|
 | 
						|
	cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
 | 
						|
	err := cmd.Run()
 | 
						|
	return err
 | 
						|
}
 |