yay/cmd.go

485 lines
17 KiB
Go
Raw Normal View History

2017-04-29 19:12:12 +02:00
package main
import (
"bufio"
2021-05-16 22:49:00 +02:00
"context"
2022-02-05 14:25:59 +01:00
"errors"
2017-04-29 19:12:12 +02:00
"fmt"
"net/http"
"os"
"strings"
2018-07-28 04:45:04 +02:00
2020-10-01 13:38:03 +02:00
alpm "github.com/Jguer/go-alpm/v2"
"github.com/leonelquinteros/gotext"
2021-09-08 22:28:08 +02:00
"github.com/Jguer/yay/v11/pkg/completion"
"github.com/Jguer/yay/v11/pkg/db"
"github.com/Jguer/yay/v11/pkg/download"
"github.com/Jguer/yay/v11/pkg/intrange"
"github.com/Jguer/yay/v11/pkg/news"
"github.com/Jguer/yay/v11/pkg/query"
"github.com/Jguer/yay/v11/pkg/settings"
"github.com/Jguer/yay/v11/pkg/settings/parser"
"github.com/Jguer/yay/v11/pkg/text"
"github.com/Jguer/yay/v11/pkg/upgrade"
"github.com/Jguer/yay/v11/pkg/vcs"
2017-04-29 19:12:12 +02:00
)
func usage() {
fmt.Println(`Usage:
yay
yay <operation> [...]
yay <package(s)>
2018-01-14 18:12:51 +01:00
operations:
yay {-h --help}
yay {-V --version}
yay {-D --database} <options> <package(s)>
yay {-F --files} [options] [package(s)]
yay {-Q --query} [options] [package(s)]
yay {-R --remove} [options] <package(s)>
yay {-S --sync} [options] [package(s)]
yay {-T --deptest} [options] [package(s)]
yay {-U --upgrade} [options] <file(s)>
New operations:
yay {-Y --yay} [options] [package(s)]
2021-01-31 19:06:32 +01:00
yay {-P --show} [options]
yay {-G --getpkgbuild} [options] [package(s)]
If no arguments are provided 'yay -Syu' will be performed
2020-01-30 14:03:10 +01:00
If no operation is provided -Y will be assumed
2018-06-04 20:16:43 +02:00
New options:
--repo Assume targets are from the repositories
-a --aur Assume targets are from the AUR
Permanent configuration options:
--save Causes the following options to be saved back to the
config file when used
2018-03-07 23:37:44 +01:00
2018-08-29 21:37:25 +02:00
--aururl <url> Set an alternative AUR URL
--aurrpcurl <url> Set an alternative URL for the AUR /rpc endpoint
2019-02-03 02:36:46 +01:00
--builddir <dir> Directory used to download and run PKGBUILDS
--editor <file> Editor to use when editing PKGBUILDs
--editorflags <flags> Pass arguments to editor
--makepkg <file> makepkg command to use
--mflags <flags> Pass arguments to makepkg
--pacman <file> pacman command to use
--git <file> git command to use
--gitflags <flags> Pass arguments to git
--gpg <file> gpg command to use
--gpgflags <flags> Pass arguments to gpg
--config <file> pacman.conf file to use
2018-07-28 14:40:07 +02:00
--makepkgconf <file> makepkg.conf file to use
--nomakepkgconf Use the default makepkg.conf
--requestsplitn <n> Max amount of packages to query per AUR request
2020-03-05 15:30:43 +01:00
--completioninterval <n> Time in days to refresh completion cache
2018-06-04 20:16:43 +02:00
--sortby <field> Sort AUR results by a specific field during search
2019-10-21 16:02:38 +02:00
--searchby <field> Search for packages using a specified field
--answerclean <a> Set a predetermined answer for the clean build menu
2018-06-12 20:27:19 +02:00
--answerdiff <a> Set a predetermined answer for the diff menu
--answeredit <a> Set a predetermined answer for the edit pkgbuild menu
--answerupgrade <a> Set a predetermined answer for the upgrade menu
--noanswerclean Unset the answer for the clean build menu
2018-06-11 20:38:53 +02:00
--noanswerdiff Unset the answer for the edit diff menu
--noansweredit Unset the answer for the edit pkgbuild menu
--noanswerupgrade Unset the answer for the upgrade menu
2018-06-11 20:38:53 +02:00
--cleanmenu Give the option to clean build PKGBUILDS
--diffmenu Give the option to show diffs for build files
--editmenu Give the option to edit/view PKGBUILDS
2018-06-11 21:09:29 +02:00
--upgrademenu Show a detailed list of updates with the option to skip any
2018-06-11 20:38:53 +02:00
--nocleanmenu Don't clean build PKGBUILDS
--nodiffmenu Don't show diffs for build files
--noeditmenu Don't edit/view PKGBUILDS
2018-06-11 21:09:29 +02:00
--noupgrademenu Don't show the upgrade menu
2018-07-28 14:40:07 +02:00
--askremovemake Ask to remove makedepends after install
--removemake Remove makedepends after install
--noremovemake Don't remove makedepends after install
--cleanafter Remove package sources after successful install
--nocleanafter Do not remove package sources after successful build
--bottomup Shows AUR's packages first and then repository's
--topdown Shows repository's packages first and then AUR's
--singlelineresults List each search result on its own line
--doublelineresults List each search result on two lines, like pacman
--devel Check development packages during sysupgrade
--nodevel Do not check development packages
--rebuild Always build target packages
--rebuildall Always build all AUR packages
--norebuild Skip package build if in cache and up to date
--rebuildtree Always build all AUR packages even if installed
--redownload Always download pkgbuilds of targets
--noredownload Skip pkgbuild download if in cache and up to date
--redownloadall Always download pkgbuilds of all AUR packages
2019-02-03 02:36:46 +01:00
--provides Look for matching providers when searching for packages
2018-06-04 20:16:43 +02:00
--noprovides Just look for packages by pkgname
--pgpfetch Prompt to import PGP keys from PKGBUILDs
--nopgpfetch Don't prompt to import PGP keys
--useask Automatically resolve conflicts using pacman's ask flag
--nouseask Confirm conflicts manually during the install
--combinedupgrade Refresh then perform the repo and AUR upgrade together
--nocombinedupgrade Perform the repo upgrade and AUR upgrade separately
2019-10-21 16:02:38 +02:00
--batchinstall Build multiple AUR packages then install them together
--nobatchinstall Build and install each AUR package one by one
2019-03-19 22:10:58 +01:00
--sudo <file> sudo command to use
--sudoflags <flags> Pass arguments to sudo
--sudoloop Loop sudo calls in the background to avoid timeout
--nosudoloop Do not loop sudo calls in the background
2018-04-23 02:42:58 +02:00
--timeupdate Check packages' AUR page for changes during sysupgrade
--notimeupdate Do not check packages' AUR page for changes
show specific options:
-c --complete Used for completions
-d --defaultconfig Print default yay configuration
2018-08-02 23:01:41 +02:00
-g --currentconfig Print current yay configuration
-s --stats Display system package statistics
2018-05-06 03:31:09 +02:00
-w --news Print arch news
yay specific options:
-c --clean Remove unneeded dependencies
--gendb Generates development package DB used for updating
getpkgbuild specific options:
2021-01-31 19:06:32 +01:00
-f --force Force download for existing ABS packages
-p --print Print pkgbuild of packages`)
2017-04-29 19:12:12 +02:00
}
2021-08-12 18:56:23 +02:00
func handleCmd(ctx context.Context, cmdArgs *parser.Arguments, dbExecutor db.Executor) error {
2020-07-05 02:45:23 +02:00
if cmdArgs.ExistsArg("h", "help") {
2021-08-12 18:56:23 +02:00
return handleHelp(ctx, cmdArgs)
}
if config.SudoLoop && cmdArgs.NeedRoot(config.Runtime.Mode) {
config.Runtime.CmdBuilder.SudoLoop()
2018-02-13 19:20:15 +01:00
}
2020-07-05 02:45:23 +02:00
switch cmdArgs.Op {
Foundation for re writing the argument parsing system Currently the foundation for a new fuller argument parsing has been implemented in parser.go. Most of the parsing is now done through the argParser object instead of seperate arrays for options and packages. The rest of the code still expects the old system so I have left most of the operations unimplemented for now until I redo it with the new system. Currently only '-S' and number menu have any functionality for testing purposes. This new system parses arguments fully instead of just looking for predefined strings such as: '-Sqi' '-Siq'. This allows: '-Syu', '-S -y -u', '--sync -y -u' to all be parsed as the same. This system tries to be as similar to pacman as possible, eventually aming to fully wrap pacman, allowing yay to be used instead of pacman in all instances. The current implementation is not as strict as pacman when checking arguments. If you pass --someinvalidflag to yay then yay will simply ignore it. The flag should still be passed to pacman which should then cause an error. Although operations '-S' '-R' '-U' ect. are checked to make sure you can not try to use two operations at once. conflicting flags such as: '--quiet' and '--info' will not raise an error and which options gains precedence is depend on the implementation. Another minor issue which is worth noting is. Due to the way double arguments are parsed: '-dd' '-cc' '--deps --deps' if you pass the long version and the short version: '-d --deps' yay will not realize its a double argument. Meanwhile pacman will reconise it when yay calls pacman. Currently there are a few things that need to be done before this new system can be fuly released: Reimplement all operations to use to new parsing system so that the new system is at least as functional as the old one Strip yay specific flags before passing them to pacman Move parts of config into the argument system and only use config for options that are meant to be saved to disk Move yay specific operations into its own operator '-Y' Update documentation to show the altered syntax
2017-12-31 16:18:12 +01:00
case "V", "version":
handleVersion()
2021-08-11 20:13:28 +02:00
return nil
Foundation for re writing the argument parsing system Currently the foundation for a new fuller argument parsing has been implemented in parser.go. Most of the parsing is now done through the argParser object instead of seperate arrays for options and packages. The rest of the code still expects the old system so I have left most of the operations unimplemented for now until I redo it with the new system. Currently only '-S' and number menu have any functionality for testing purposes. This new system parses arguments fully instead of just looking for predefined strings such as: '-Sqi' '-Siq'. This allows: '-Syu', '-S -y -u', '--sync -y -u' to all be parsed as the same. This system tries to be as similar to pacman as possible, eventually aming to fully wrap pacman, allowing yay to be used instead of pacman in all instances. The current implementation is not as strict as pacman when checking arguments. If you pass --someinvalidflag to yay then yay will simply ignore it. The flag should still be passed to pacman which should then cause an error. Although operations '-S' '-R' '-U' ect. are checked to make sure you can not try to use two operations at once. conflicting flags such as: '--quiet' and '--info' will not raise an error and which options gains precedence is depend on the implementation. Another minor issue which is worth noting is. Due to the way double arguments are parsed: '-dd' '-cc' '--deps --deps' if you pass the long version and the short version: '-d --deps' yay will not realize its a double argument. Meanwhile pacman will reconise it when yay calls pacman. Currently there are a few things that need to be done before this new system can be fuly released: Reimplement all operations to use to new parsing system so that the new system is at least as functional as the old one Strip yay specific flags before passing them to pacman Move parts of config into the argument system and only use config for options that are meant to be saved to disk Move yay specific operations into its own operator '-Y' Update documentation to show the altered syntax
2017-12-31 16:18:12 +01:00
case "D", "database":
2021-08-12 18:56:23 +02:00
return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(ctx,
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
Foundation for re writing the argument parsing system Currently the foundation for a new fuller argument parsing has been implemented in parser.go. Most of the parsing is now done through the argParser object instead of seperate arrays for options and packages. The rest of the code still expects the old system so I have left most of the operations unimplemented for now until I redo it with the new system. Currently only '-S' and number menu have any functionality for testing purposes. This new system parses arguments fully instead of just looking for predefined strings such as: '-Sqi' '-Siq'. This allows: '-Syu', '-S -y -u', '--sync -y -u' to all be parsed as the same. This system tries to be as similar to pacman as possible, eventually aming to fully wrap pacman, allowing yay to be used instead of pacman in all instances. The current implementation is not as strict as pacman when checking arguments. If you pass --someinvalidflag to yay then yay will simply ignore it. The flag should still be passed to pacman which should then cause an error. Although operations '-S' '-R' '-U' ect. are checked to make sure you can not try to use two operations at once. conflicting flags such as: '--quiet' and '--info' will not raise an error and which options gains precedence is depend on the implementation. Another minor issue which is worth noting is. Due to the way double arguments are parsed: '-dd' '-cc' '--deps --deps' if you pass the long version and the short version: '-d --deps' yay will not realize its a double argument. Meanwhile pacman will reconise it when yay calls pacman. Currently there are a few things that need to be done before this new system can be fuly released: Reimplement all operations to use to new parsing system so that the new system is at least as functional as the old one Strip yay specific flags before passing them to pacman Move parts of config into the argument system and only use config for options that are meant to be saved to disk Move yay specific operations into its own operator '-Y' Update documentation to show the altered syntax
2017-12-31 16:18:12 +01:00
case "F", "files":
2021-08-12 18:56:23 +02:00
return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(ctx,
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
Foundation for re writing the argument parsing system Currently the foundation for a new fuller argument parsing has been implemented in parser.go. Most of the parsing is now done through the argParser object instead of seperate arrays for options and packages. The rest of the code still expects the old system so I have left most of the operations unimplemented for now until I redo it with the new system. Currently only '-S' and number menu have any functionality for testing purposes. This new system parses arguments fully instead of just looking for predefined strings such as: '-Sqi' '-Siq'. This allows: '-Syu', '-S -y -u', '--sync -y -u' to all be parsed as the same. This system tries to be as similar to pacman as possible, eventually aming to fully wrap pacman, allowing yay to be used instead of pacman in all instances. The current implementation is not as strict as pacman when checking arguments. If you pass --someinvalidflag to yay then yay will simply ignore it. The flag should still be passed to pacman which should then cause an error. Although operations '-S' '-R' '-U' ect. are checked to make sure you can not try to use two operations at once. conflicting flags such as: '--quiet' and '--info' will not raise an error and which options gains precedence is depend on the implementation. Another minor issue which is worth noting is. Due to the way double arguments are parsed: '-dd' '-cc' '--deps --deps' if you pass the long version and the short version: '-d --deps' yay will not realize its a double argument. Meanwhile pacman will reconise it when yay calls pacman. Currently there are a few things that need to be done before this new system can be fuly released: Reimplement all operations to use to new parsing system so that the new system is at least as functional as the old one Strip yay specific flags before passing them to pacman Move parts of config into the argument system and only use config for options that are meant to be saved to disk Move yay specific operations into its own operator '-Y' Update documentation to show the altered syntax
2017-12-31 16:18:12 +01:00
case "Q", "query":
2021-08-12 18:56:23 +02:00
return handleQuery(ctx, cmdArgs, dbExecutor)
Foundation for re writing the argument parsing system Currently the foundation for a new fuller argument parsing has been implemented in parser.go. Most of the parsing is now done through the argParser object instead of seperate arrays for options and packages. The rest of the code still expects the old system so I have left most of the operations unimplemented for now until I redo it with the new system. Currently only '-S' and number menu have any functionality for testing purposes. This new system parses arguments fully instead of just looking for predefined strings such as: '-Sqi' '-Siq'. This allows: '-Syu', '-S -y -u', '--sync -y -u' to all be parsed as the same. This system tries to be as similar to pacman as possible, eventually aming to fully wrap pacman, allowing yay to be used instead of pacman in all instances. The current implementation is not as strict as pacman when checking arguments. If you pass --someinvalidflag to yay then yay will simply ignore it. The flag should still be passed to pacman which should then cause an error. Although operations '-S' '-R' '-U' ect. are checked to make sure you can not try to use two operations at once. conflicting flags such as: '--quiet' and '--info' will not raise an error and which options gains precedence is depend on the implementation. Another minor issue which is worth noting is. Due to the way double arguments are parsed: '-dd' '-cc' '--deps --deps' if you pass the long version and the short version: '-d --deps' yay will not realize its a double argument. Meanwhile pacman will reconise it when yay calls pacman. Currently there are a few things that need to be done before this new system can be fuly released: Reimplement all operations to use to new parsing system so that the new system is at least as functional as the old one Strip yay specific flags before passing them to pacman Move parts of config into the argument system and only use config for options that are meant to be saved to disk Move yay specific operations into its own operator '-Y' Update documentation to show the altered syntax
2017-12-31 16:18:12 +01:00
case "R", "remove":
2021-08-12 18:56:23 +02:00
return handleRemove(ctx, cmdArgs, config.Runtime.VCSStore)
Foundation for re writing the argument parsing system Currently the foundation for a new fuller argument parsing has been implemented in parser.go. Most of the parsing is now done through the argParser object instead of seperate arrays for options and packages. The rest of the code still expects the old system so I have left most of the operations unimplemented for now until I redo it with the new system. Currently only '-S' and number menu have any functionality for testing purposes. This new system parses arguments fully instead of just looking for predefined strings such as: '-Sqi' '-Siq'. This allows: '-Syu', '-S -y -u', '--sync -y -u' to all be parsed as the same. This system tries to be as similar to pacman as possible, eventually aming to fully wrap pacman, allowing yay to be used instead of pacman in all instances. The current implementation is not as strict as pacman when checking arguments. If you pass --someinvalidflag to yay then yay will simply ignore it. The flag should still be passed to pacman which should then cause an error. Although operations '-S' '-R' '-U' ect. are checked to make sure you can not try to use two operations at once. conflicting flags such as: '--quiet' and '--info' will not raise an error and which options gains precedence is depend on the implementation. Another minor issue which is worth noting is. Due to the way double arguments are parsed: '-dd' '-cc' '--deps --deps' if you pass the long version and the short version: '-d --deps' yay will not realize its a double argument. Meanwhile pacman will reconise it when yay calls pacman. Currently there are a few things that need to be done before this new system can be fuly released: Reimplement all operations to use to new parsing system so that the new system is at least as functional as the old one Strip yay specific flags before passing them to pacman Move parts of config into the argument system and only use config for options that are meant to be saved to disk Move yay specific operations into its own operator '-Y' Update documentation to show the altered syntax
2017-12-31 16:18:12 +01:00
case "S", "sync":
2021-08-12 18:56:23 +02:00
return handleSync(ctx, cmdArgs, dbExecutor)
Foundation for re writing the argument parsing system Currently the foundation for a new fuller argument parsing has been implemented in parser.go. Most of the parsing is now done through the argParser object instead of seperate arrays for options and packages. The rest of the code still expects the old system so I have left most of the operations unimplemented for now until I redo it with the new system. Currently only '-S' and number menu have any functionality for testing purposes. This new system parses arguments fully instead of just looking for predefined strings such as: '-Sqi' '-Siq'. This allows: '-Syu', '-S -y -u', '--sync -y -u' to all be parsed as the same. This system tries to be as similar to pacman as possible, eventually aming to fully wrap pacman, allowing yay to be used instead of pacman in all instances. The current implementation is not as strict as pacman when checking arguments. If you pass --someinvalidflag to yay then yay will simply ignore it. The flag should still be passed to pacman which should then cause an error. Although operations '-S' '-R' '-U' ect. are checked to make sure you can not try to use two operations at once. conflicting flags such as: '--quiet' and '--info' will not raise an error and which options gains precedence is depend on the implementation. Another minor issue which is worth noting is. Due to the way double arguments are parsed: '-dd' '-cc' '--deps --deps' if you pass the long version and the short version: '-d --deps' yay will not realize its a double argument. Meanwhile pacman will reconise it when yay calls pacman. Currently there are a few things that need to be done before this new system can be fuly released: Reimplement all operations to use to new parsing system so that the new system is at least as functional as the old one Strip yay specific flags before passing them to pacman Move parts of config into the argument system and only use config for options that are meant to be saved to disk Move yay specific operations into its own operator '-Y' Update documentation to show the altered syntax
2017-12-31 16:18:12 +01:00
case "T", "deptest":
2021-08-12 18:56:23 +02:00
return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(ctx,
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
Foundation for re writing the argument parsing system Currently the foundation for a new fuller argument parsing has been implemented in parser.go. Most of the parsing is now done through the argParser object instead of seperate arrays for options and packages. The rest of the code still expects the old system so I have left most of the operations unimplemented for now until I redo it with the new system. Currently only '-S' and number menu have any functionality for testing purposes. This new system parses arguments fully instead of just looking for predefined strings such as: '-Sqi' '-Siq'. This allows: '-Syu', '-S -y -u', '--sync -y -u' to all be parsed as the same. This system tries to be as similar to pacman as possible, eventually aming to fully wrap pacman, allowing yay to be used instead of pacman in all instances. The current implementation is not as strict as pacman when checking arguments. If you pass --someinvalidflag to yay then yay will simply ignore it. The flag should still be passed to pacman which should then cause an error. Although operations '-S' '-R' '-U' ect. are checked to make sure you can not try to use two operations at once. conflicting flags such as: '--quiet' and '--info' will not raise an error and which options gains precedence is depend on the implementation. Another minor issue which is worth noting is. Due to the way double arguments are parsed: '-dd' '-cc' '--deps --deps' if you pass the long version and the short version: '-d --deps' yay will not realize its a double argument. Meanwhile pacman will reconise it when yay calls pacman. Currently there are a few things that need to be done before this new system can be fuly released: Reimplement all operations to use to new parsing system so that the new system is at least as functional as the old one Strip yay specific flags before passing them to pacman Move parts of config into the argument system and only use config for options that are meant to be saved to disk Move yay specific operations into its own operator '-Y' Update documentation to show the altered syntax
2017-12-31 16:18:12 +01:00
case "U", "upgrade":
2022-11-16 01:11:16 +01:00
return handleUpgrade(ctx, config, cmdArgs)
2022-11-16 00:51:57 +01:00
case "B", "build":
return handleBuild(ctx, config, dbExecutor, cmdArgs)
case "G", "getpkgbuild":
2021-08-12 18:56:23 +02:00
return handleGetpkgbuild(ctx, cmdArgs, dbExecutor)
case "P", "show":
2021-08-12 18:56:23 +02:00
return handlePrint(ctx, cmdArgs, dbExecutor)
2022-05-16 23:05:23 +02:00
case "Y", "yay":
return handleYay(ctx, cmdArgs, dbExecutor, config.Runtime.QueryBuilder)
case "W", "web":
return handleWeb(ctx, cmdArgs)
}
2018-01-14 18:12:51 +01:00
2022-02-05 14:25:59 +01:00
return errors.New(gotext.Get("unhandled operation"))
Foundation for re writing the argument parsing system Currently the foundation for a new fuller argument parsing has been implemented in parser.go. Most of the parsing is now done through the argParser object instead of seperate arrays for options and packages. The rest of the code still expects the old system so I have left most of the operations unimplemented for now until I redo it with the new system. Currently only '-S' and number menu have any functionality for testing purposes. This new system parses arguments fully instead of just looking for predefined strings such as: '-Sqi' '-Siq'. This allows: '-Syu', '-S -y -u', '--sync -y -u' to all be parsed as the same. This system tries to be as similar to pacman as possible, eventually aming to fully wrap pacman, allowing yay to be used instead of pacman in all instances. The current implementation is not as strict as pacman when checking arguments. If you pass --someinvalidflag to yay then yay will simply ignore it. The flag should still be passed to pacman which should then cause an error. Although operations '-S' '-R' '-U' ect. are checked to make sure you can not try to use two operations at once. conflicting flags such as: '--quiet' and '--info' will not raise an error and which options gains precedence is depend on the implementation. Another minor issue which is worth noting is. Due to the way double arguments are parsed: '-dd' '-cc' '--deps --deps' if you pass the long version and the short version: '-d --deps' yay will not realize its a double argument. Meanwhile pacman will reconise it when yay calls pacman. Currently there are a few things that need to be done before this new system can be fuly released: Reimplement all operations to use to new parsing system so that the new system is at least as functional as the old one Strip yay specific flags before passing them to pacman Move parts of config into the argument system and only use config for options that are meant to be saved to disk Move yay specific operations into its own operator '-Y' Update documentation to show the altered syntax
2017-12-31 16:18:12 +01:00
}
2021-02-06 18:43:53 +01:00
// getFilter returns filter function which can keep packages which were only
// explicitly installed or ones installed as dependencies for showing available
// updates or their count.
func getFilter(cmdArgs *parser.Arguments) (upgrade.Filter, error) {
deps, explicit := cmdArgs.ExistsArg("d", "deps"), cmdArgs.ExistsArg("e", "explicit")
2021-08-11 20:13:28 +02:00
switch {
case deps && explicit:
2022-02-05 14:25:59 +01:00
return nil, errors.New(gotext.Get("invalid option: '--deps' and '--explicit' may not be used together"))
case deps:
return func(pkg upgrade.Upgrade) bool {
return pkg.Reason == alpm.PkgReasonDepend
}, nil
case explicit:
return func(pkg upgrade.Upgrade) bool {
return pkg.Reason == alpm.PkgReasonExplicit
}, nil
}
2021-08-11 20:13:28 +02:00
return func(pkg upgrade.Upgrade) bool {
return true
}, nil
}
2021-08-12 18:56:23 +02:00
func handleQuery(ctx context.Context, cmdArgs *parser.Arguments, dbExecutor db.Executor) error {
2020-07-05 02:45:23 +02:00
if cmdArgs.ExistsArg("u", "upgrades") {
filter, err := getFilter(cmdArgs)
if err != nil {
return err
}
2021-08-11 20:13:28 +02:00
2021-08-12 18:56:23 +02:00
return printUpdateList(ctx, cmdArgs, dbExecutor, cmdArgs.ExistsDouble("u", "sysupgrade"), filter)
}
2021-08-11 20:13:28 +02:00
if err := config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(ctx,
cmdArgs, config.Runtime.Mode, settings.NoConfirm)); err != nil {
if str := err.Error(); strings.Contains(str, "exit status") {
// yay -Qdt should not output anything in case of error
return fmt.Errorf("")
}
return err
}
return nil
}
2021-08-12 18:56:23 +02:00
func handleHelp(ctx context.Context, cmdArgs *parser.Arguments) error {
switch cmdArgs.Op {
2022-11-16 00:51:57 +01:00
case "Y", "yay", "G", "getpkgbuild", "P", "show", "W", "web", "B", "build":
usage()
return nil
}
2021-08-11 20:13:28 +02:00
2021-08-12 18:56:23 +02:00
return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(ctx,
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
}
func handleVersion() {
fmt.Printf("yay v%s - libalpm v%s\n", yayVersion, alpm.Version())
}
2021-08-12 18:56:23 +02:00
func handlePrint(ctx context.Context, cmdArgs *parser.Arguments, dbExecutor db.Executor) error {
switch {
2020-07-05 02:45:23 +02:00
case cmdArgs.ExistsArg("d", "defaultconfig"):
tmpConfig := settings.DefaultConfig(yayVersion)
fmt.Printf("%v", tmpConfig)
2021-08-11 20:13:28 +02:00
2020-12-14 22:30:07 +01:00
return nil
2020-07-05 02:45:23 +02:00
case cmdArgs.ExistsArg("g", "currentconfig"):
fmt.Printf("%v", config)
2021-08-11 20:13:28 +02:00
2020-12-14 22:30:07 +01:00
return nil
2020-07-05 02:45:23 +02:00
case cmdArgs.ExistsArg("n", "numberupgrades"):
filter, err := getFilter(cmdArgs)
if err != nil {
return err
}
2021-08-11 20:13:28 +02:00
2021-08-12 18:56:23 +02:00
return printNumberOfUpdates(ctx, dbExecutor, cmdArgs.ExistsDouble("u", "sysupgrade"), filter)
2020-07-05 02:45:23 +02:00
case cmdArgs.ExistsArg("w", "news"):
double := cmdArgs.ExistsDouble("w", "news")
quiet := cmdArgs.ExistsArg("q", "quiet")
2021-08-11 20:13:28 +02:00
return news.PrintNewsFeed(ctx, config.Runtime.HTTPClient, dbExecutor.LastBuildTime(), config.BottomUp, double, quiet)
2020-07-05 02:45:23 +02:00
case cmdArgs.ExistsDouble("c", "complete"):
2021-08-12 18:56:23 +02:00
return completion.Show(ctx, config.Runtime.HTTPClient, dbExecutor,
config.AURURL, config.Runtime.CompletionPath, config.CompletionInterval, true)
2020-07-05 02:45:23 +02:00
case cmdArgs.ExistsArg("c", "complete"):
2021-08-12 18:56:23 +02:00
return completion.Show(ctx, config.Runtime.HTTPClient, dbExecutor,
config.AURURL, config.Runtime.CompletionPath, config.CompletionInterval, false)
2020-07-05 02:45:23 +02:00
case cmdArgs.ExistsArg("s", "stats"):
2021-08-12 18:56:23 +02:00
return localStatistics(ctx, dbExecutor)
}
2021-08-11 20:13:28 +02:00
2020-12-14 22:30:07 +01:00
return nil
}
func handleYay(ctx context.Context, cmdArgs *parser.Arguments, dbExecutor db.Executor, queryBuilder query.Builder) error {
2021-08-11 20:13:28 +02:00
switch {
case cmdArgs.ExistsArg("gendb"):
2021-08-12 18:56:23 +02:00
return createDevelDB(ctx, config, dbExecutor)
2021-08-11 20:13:28 +02:00
case cmdArgs.ExistsDouble("c"):
2021-08-12 18:56:23 +02:00
return cleanDependencies(ctx, cmdArgs, dbExecutor, true)
2021-08-11 20:13:28 +02:00
case cmdArgs.ExistsArg("c", "clean"):
2021-08-12 18:56:23 +02:00
return cleanDependencies(ctx, cmdArgs, dbExecutor, false)
2021-08-11 20:13:28 +02:00
case len(cmdArgs.Targets) > 0:
return displayNumberMenu(ctx, cmdArgs.Targets, dbExecutor, queryBuilder, cmdArgs)
2018-07-31 10:42:17 +02:00
}
2021-08-11 20:13:28 +02:00
2018-07-31 10:42:17 +02:00
return nil
Foundation for re writing the argument parsing system Currently the foundation for a new fuller argument parsing has been implemented in parser.go. Most of the parsing is now done through the argParser object instead of seperate arrays for options and packages. The rest of the code still expects the old system so I have left most of the operations unimplemented for now until I redo it with the new system. Currently only '-S' and number menu have any functionality for testing purposes. This new system parses arguments fully instead of just looking for predefined strings such as: '-Sqi' '-Siq'. This allows: '-Syu', '-S -y -u', '--sync -y -u' to all be parsed as the same. This system tries to be as similar to pacman as possible, eventually aming to fully wrap pacman, allowing yay to be used instead of pacman in all instances. The current implementation is not as strict as pacman when checking arguments. If you pass --someinvalidflag to yay then yay will simply ignore it. The flag should still be passed to pacman which should then cause an error. Although operations '-S' '-R' '-U' ect. are checked to make sure you can not try to use two operations at once. conflicting flags such as: '--quiet' and '--info' will not raise an error and which options gains precedence is depend on the implementation. Another minor issue which is worth noting is. Due to the way double arguments are parsed: '-dd' '-cc' '--deps --deps' if you pass the long version and the short version: '-d --deps' yay will not realize its a double argument. Meanwhile pacman will reconise it when yay calls pacman. Currently there are a few things that need to be done before this new system can be fuly released: Reimplement all operations to use to new parsing system so that the new system is at least as functional as the old one Strip yay specific flags before passing them to pacman Move parts of config into the argument system and only use config for options that are meant to be saved to disk Move yay specific operations into its own operator '-Y' Update documentation to show the altered syntax
2017-12-31 16:18:12 +01:00
}
func handleWeb(ctx context.Context, cmdArgs *parser.Arguments) error {
switch {
case cmdArgs.ExistsArg("v", "vote"):
return handlePackageVote(ctx, cmdArgs.Targets, config.Runtime.AURClient,
config.Runtime.VoteClient, config.RequestSplitN, true)
case cmdArgs.ExistsArg("u", "unvote"):
return handlePackageVote(ctx, cmdArgs.Targets, config.Runtime.AURClient,
config.Runtime.VoteClient, config.RequestSplitN, false)
}
return nil
}
2021-08-12 18:56:23 +02:00
func handleGetpkgbuild(ctx context.Context, cmdArgs *parser.Arguments, dbExecutor download.DBSearcher) error {
2021-01-31 19:06:32 +01:00
if cmdArgs.ExistsArg("p", "print") {
return printPkgbuilds(dbExecutor, config.Runtime.HTTPClient, cmdArgs.Targets, config.Runtime.Mode, config.AURURL)
2020-12-14 22:30:07 +01:00
}
2021-08-11 20:13:28 +02:00
2021-08-12 18:56:23 +02:00
return getPkgbuilds(ctx, dbExecutor, config, cmdArgs.Targets, cmdArgs.ExistsArg("f", "force"))
}
2022-08-21 07:08:01 +02:00
func handleUpgrade(ctx context.Context,
2022-11-16 01:11:16 +01:00
config *settings.Configuration, cmdArgs *parser.Arguments,
2022-08-21 07:08:01 +02:00
) error {
return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(ctx,
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
}
2022-11-16 00:51:57 +01:00
// -B* options
func handleBuild(ctx context.Context,
config *settings.Configuration, dbExecutor db.Executor, cmdArgs *parser.Arguments,
) error {
if cmdArgs.ExistsArg("i", "install") {
return installLocalPKGBUILD(ctx, config, cmdArgs, dbExecutor)
}
return nil
}
2021-08-12 18:56:23 +02:00
func handleSync(ctx context.Context, cmdArgs *parser.Arguments, dbExecutor db.Executor) error {
2020-07-05 02:45:23 +02:00
targets := cmdArgs.Targets
2018-01-14 18:12:51 +01:00
2021-08-11 20:13:28 +02:00
switch {
case cmdArgs.ExistsArg("s", "search"):
return syncSearch(ctx, targets, dbExecutor, config.Runtime.QueryBuilder, !cmdArgs.ExistsArg("q", "quiet"))
2021-08-11 20:13:28 +02:00
case cmdArgs.ExistsArg("p", "print", "print-format"):
2021-08-12 18:56:23 +02:00
return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(ctx,
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
2021-08-11 20:13:28 +02:00
case cmdArgs.ExistsArg("c", "clean"):
2021-08-12 18:56:23 +02:00
return syncClean(ctx, cmdArgs, dbExecutor)
2021-08-11 20:13:28 +02:00
case cmdArgs.ExistsArg("l", "list"):
2021-08-12 18:56:23 +02:00
return syncList(ctx, config.Runtime.HTTPClient, cmdArgs, dbExecutor)
2021-08-11 20:13:28 +02:00
case cmdArgs.ExistsArg("g", "groups"):
2021-08-12 18:56:23 +02:00
return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(ctx,
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
2021-08-11 20:13:28 +02:00
case cmdArgs.ExistsArg("i", "info"):
2021-08-12 18:56:23 +02:00
return syncInfo(ctx, cmdArgs, targets, dbExecutor)
2021-12-18 21:39:01 +01:00
case cmdArgs.ExistsArg("u", "sysupgrade") || len(cmdArgs.Targets) > 0:
2022-09-20 00:01:19 +02:00
if config.NewInstallEngine {
return syncInstall(ctx, config, cmdArgs, dbExecutor)
}
2022-11-15 15:44:50 +01:00
2021-08-12 18:56:23 +02:00
return install(ctx, cmdArgs, dbExecutor, false)
2021-08-11 20:13:28 +02:00
case cmdArgs.ExistsArg("y", "refresh"):
2021-08-12 18:56:23 +02:00
return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(ctx,
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
2018-07-31 10:42:17 +02:00
}
2021-08-11 20:13:28 +02:00
2018-07-31 10:42:17 +02:00
return nil
2017-04-29 19:12:12 +02:00
}
2021-08-12 18:56:23 +02:00
func handleRemove(ctx context.Context, cmdArgs *parser.Arguments, localCache *vcs.InfoStore) error {
err := config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(ctx,
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
if err == nil {
localCache.RemovePackage(cmdArgs.Targets)
}
return err
2017-04-29 19:12:12 +02:00
}
// NumberMenu presents a CLI for selecting packages to install.
func displayNumberMenu(ctx context.Context, pkgS []string, dbExecutor db.Executor,
queryBuilder query.Builder, cmdArgs *parser.Arguments,
) error {
queryBuilder.Execute(ctx, dbExecutor, pkgS)
2021-08-11 20:13:28 +02:00
if err := queryBuilder.Results(os.Stdout, dbExecutor, query.NumberMenu); err != nil {
return err
2017-04-29 19:12:12 +02:00
}
if queryBuilder.Len() == 0 {
// no results were found
return nil
}
text.Infoln(gotext.Get("Packages to install (eg: 1 2 3, 1-3 or ^4)"))
2018-03-09 06:25:05 +01:00
numberBuf, err := text.GetInput("", false)
2018-03-09 06:25:05 +01:00
if err != nil {
return err
2017-04-29 19:12:12 +02:00
}
2021-08-11 20:13:28 +02:00
include, exclude, _, otherExclude := intrange.ParseNumberMenu(numberBuf)
2018-03-09 06:25:05 +01:00
targets, err := queryBuilder.GetTargets(include, exclude, otherExclude)
if err != nil {
return err
2017-04-29 19:12:12 +02:00
}
arguments := cmdArgs.CopyGlobal()
arguments.AddTarget(targets...)
2020-07-05 02:45:23 +02:00
if len(arguments.Targets) == 0 {
2020-05-08 18:13:51 +02:00
fmt.Println(gotext.Get(" there is nothing to do"))
2018-07-30 15:14:16 +02:00
return nil
}
2022-09-20 00:44:06 +02:00
if config.NewInstallEngine {
2022-10-28 00:38:11 +02:00
return syncInstall(ctx, config, arguments, dbExecutor)
2022-09-20 00:44:06 +02:00
}
2021-08-12 18:56:23 +02:00
return install(ctx, arguments, dbExecutor, true)
2017-04-29 19:12:12 +02:00
}
2021-08-12 18:56:23 +02:00
func syncList(ctx context.Context, httpClient *http.Client, cmdArgs *parser.Arguments, dbExecutor db.Executor) error {
aur := false
2020-07-08 03:22:01 +02:00
for i := len(cmdArgs.Targets) - 1; i >= 0; i-- {
2021-08-09 13:26:32 +02:00
if cmdArgs.Targets[i] == "aur" && config.Runtime.Mode.AtLeastAUR() {
2020-07-08 03:22:01 +02:00
cmdArgs.Targets = append(cmdArgs.Targets[:i], cmdArgs.Targets[i+1:]...)
aur = true
}
}
2021-08-09 13:26:32 +02:00
if config.Runtime.Mode.AtLeastAUR() && (len(cmdArgs.Targets) == 0 || aur) {
2022-08-14 19:41:54 +02:00
req, err := http.NewRequestWithContext(ctx, http.MethodGet, config.AURURL+"/packages.gz", http.NoBody)
2021-05-16 22:49:00 +02:00
if err != nil {
return err
}
resp, err := httpClient.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
scanner := bufio.NewScanner(resp.Body)
scanner.Scan()
2021-08-11 20:13:28 +02:00
for scanner.Scan() {
name := scanner.Text()
2020-07-05 02:45:23 +02:00
if cmdArgs.ExistsArg("q", "quiet") {
fmt.Println(name)
} else {
2020-08-17 00:09:43 +02:00
fmt.Printf("%s %s %s", text.Magenta("aur"), text.Bold(name), text.Bold(text.Green(gotext.Get("unknown-version"))))
2020-08-08 18:43:37 +02:00
if dbExecutor.LocalPackage(name) != nil {
2020-08-17 00:09:43 +02:00
fmt.Print(text.Bold(text.Blue(gotext.Get(" [Installed]"))))
}
fmt.Println()
}
}
}
2021-08-09 13:26:32 +02:00
if config.Runtime.Mode.AtLeastRepo() && (len(cmdArgs.Targets) != 0 || !aur) {
2021-08-12 18:56:23 +02:00
return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(ctx,
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
}
return nil
}