Compare commits

...

2 Commits

Author SHA1 Message Date
Elara 0bffa3e2a4 Switch to TOML config [skip ci] 2020-11-30 15:27:29 -08:00
Elara e4dcb180be Use golang flag package [skip ci] 2020-11-30 14:25:31 -08:00
12 changed files with 109 additions and 126 deletions

5
go.mod Normal file
View File

@ -0,0 +1,5 @@
module pak
go 1.15
require github.com/pelletier/go-toml v1.8.2-0.20201124181426-2e01f733df54

3
go.sum Normal file
View File

@ -0,0 +1,3 @@
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/pelletier/go-toml v1.8.2-0.20201124181426-2e01f733df54 h1:U7n5zyrdmyUTvXR7DRuSRrdFBkjcIPeCjSG2GScQSL8=
github.com/pelletier/go-toml v1.8.2-0.20201124181426-2e01f733df54/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=

75
main.go
View File

@ -19,7 +19,9 @@
package main
import (
"flag"
"fmt"
"github.com/pelletier/go-toml"
"io/ioutil"
"log"
"os"
@ -37,21 +39,39 @@ func main() {
currentUser, err := user.Current()
if err != nil { log.Fatal(err) }
// Create help flags
var helpFlagGiven bool
flag.BoolVar(&helpFlagGiven, "help", false, "Show help screen")
flag.BoolVar(&helpFlagGiven, "h", false, "Show help screen (shorthand)")
// Check to make sure root is not being used unless -r/--root specified
if !Contains(args, "-r") && !Contains(args, "--root") {
var rootCheckBypass bool
// Create --root and -r flags for root check bypass
flag.BoolVar(&rootCheckBypass,"root", false, "Bypass root check")
flag.BoolVar(&rootCheckBypass,"r", false, "Bypass root check (shorthand)")
// Parse arguments for flags
flag.Parse()
// If flag not given
if !rootCheckBypass {
// If current user is root
if strings.Contains(currentUser.Username, "root") {
// Print warning message and exit
fmt.Println("Do not run as root, this program will invoke root for you if selected in config.")
fmt.Println("If you would like to bypass this, run this command with -r or --root.")
os.Exit(1)
}
} else {
if Contains(args, "-r") {
args = removeAtIndex(args, Find(args, "-r"))
} else if Contains(args, "--root") {
args = removeAtIndex(args, Find(args, "--root"))
}
}
// Create regex to remove all flags using ";;;" as it is uncommon to use in command line
flagRegex := regexp.MustCompile(`-+[^;]*;;;`)
// Join args into string
argsStr := strings.Join(args, ";;;")
// Remove all flags from join args
argsStr = flagRegex.ReplaceAllString(argsStr, "")
// Separate args back into slice
args = strings.Split(argsStr, ";;;")
// Define variables for config file location, and override state boolean
var configFileLocation string
var isOverridden bool
@ -72,54 +92,38 @@ func main() {
// Parse config file removing all comments and empty lines
config, err := ioutil.ReadFile(configFileLocation)
if err != nil { log.Fatal(err) }
commentRegex := regexp.MustCompile(`#.*`)
emptyLineRegex := regexp.MustCompile(`(?m)^\s*\n`)
parsedConfig := commentRegex.ReplaceAllString(string(config), "")
parsedConfig = emptyLineRegex.ReplaceAllString(parsedConfig, "")
cfg := strings.Split(parsedConfig, "\n")
//fmt.Println(cfg) //DEBUG
parsedConfig, _ := toml.Load(string(config))
// Set first line of config to variable
packageManagerCommand := cfg[0]
packageManagerCommand := parsedConfig.Get("packageManager").(string)
//fmt.Println(packageManagerCommand) //DEBUG
// Parse list of commands in config line 2 and set to variable as array
commands := strings.Split(cfg[1], ",")
commands := InterfaceToString(parsedConfig.Get("commands").([]interface{}))
//fmt.Println(commands) //DEBUG
// Set the root option in config line 3 to a variable
useRoot := cfg[2]
useRoot := parsedConfig.Get("useRoot").(bool)
//fmt.Println(useRoot) //DEBUG
// Set command to use to invoke root at config line 4 to a variable
rootCommand := cfg[3]
rootCommand := parsedConfig.Get("rootCommand").(string)
//fmt.Println(rootCommand) //DEBUG
// Parse list of shortcuts in config and line 5 set to variable as an array
shortcuts := strings.Split(cfg[4], ",")
shortcuts := InterfaceToString(parsedConfig.Get("shortcuts").([]interface{}))
//fmt.Println(shortcuts) //DEBUG
// Parse list of shortcuts in config line 6 and set to variable as array
shortcutMappings := strings.Split(cfg[5], ",")
shortcutMappings := InterfaceToString(parsedConfig.Get("shortcutMappings").([]interface{}))
//fmt.Println(shortcutMappings) //DEBUG
// Check if config file allows root and set boolean to a variable
var useRootBool bool
if useRoot == "yes" {
useRootBool = true
} else if useRoot == "no" {
useRootBool = false
}
//fmt.Println(useRootBool) //DEBUG
// Create similar to slice to put all matched commands into
var similarTo []string
// Displays help message if no arguments provided or -h/--help is passed
if len(args) == 0 || Contains(args, "-h") || Contains(args, "--help") || Contains(args, "help") {
printHelpMessage(packageManagerCommand, useRootBool, rootCommand, commands, shortcuts, shortcutMappings, isOverridden)
if len(args) == 0 || helpFlagGiven || Contains(args, "help") {
printHelpMessage(packageManagerCommand, useRoot, rootCommand, commands, shortcuts, shortcutMappings, isOverridden)
os.Exit(0)
}
@ -149,13 +153,14 @@ func main() {
// If similarTo is still empty, log it fatally as something is wrong with the config or the code
if len(similarTo) == 0 { log.Fatalln("This command does not match any known commands or shortcuts") }
// Anonymous function to decide whether to print (overridden)
printOverridden := func() string { if isOverridden { return "(overridden)" } else { return "" } }
// Print text showing command being run and package manager being used
fmt.Println("Running:", strings.Title(similarTo[0]), "using", strings.Title(packageManagerCommand))
fmt.Println("Running:", strings.Title(similarTo[0]), "using", strings.Title(packageManagerCommand), printOverridden())
// Run package manager with the proper arguments passed if more than one argument exists
var cmdArr []string
// If root is to be used, append it to cmdArr
if useRootBool { cmdArr = append(cmdArr, rootCommand) }
if useRoot { cmdArr = append(cmdArr, rootCommand) }
// Create slice with all commands and arguments for the package manager
cmdArr = append(cmdArr, []string{packageManagerCommand, similarTo[0]}...)
// If greater than 2 arguments, append them to cmdArr

View File

@ -1,13 +1,7 @@
# Write the name of the package manager in all lowercase below
apt
# Write a comma separated list of commands from the manager below
install,remove,update,upgrade,search,download
# Write "yes" or "no" depending on whether you want to use sudo
yes
# Write command to use for root
sudo
# Write a comma separated list of shortcuts below
rm,inst
# Write a comma separated list of shortcut mappings from the manager below
remove,install
# Config for the pak package manager wrapper
packageManager = "apt"
commands = ["install", "remove", "update", "upgrade", "search", "download"]
useRoot = true
rootCommand = "sudo"
shortcuts = ["rm", "inst"]
shortcutMappings = ["remove", "install"]

View File

@ -1,13 +1,7 @@
# Write the name of the package manager in all lowercase below
aptitude
# Write a comma separated list of commands from the manager below
install,remove,download,update,upgrade,full-upgrade,safe-upgrade,clean,hold,unhold,markauto,unmarkauto,why,whynot,reinstall,search,show,changelog
# Write "yes" or "no" depending on whether you want to use sudo
yes
# Write command to use for root
sudo
# Write a comma separated list of shortcuts below
rm,inst
# Write a comma separated list of shortcut mappings from the manager below
remove,install
# Config for the pak package manager wrapper
packageManager = "aptitude"
commands = ["install", "remove", "download", "update", "upgrade", "full-upgrade", "safe-upgrade", "clean", "hold", "unhold", "markauto", "unmarkauto", "why", "whynot", "reinstall", "search", "show", "changelog"]
useRoot = true
rootCommand = "sudo"
shortcuts = ["rm", "inst"]
shortcutMappings = ["remove", "install"]

View File

@ -1,13 +1,7 @@
# Write the name of the package manager in all lowercase below
brew
# Write a comma separated list of commands from the manager below
install,reinstall,remove,upgrade,update,search,cask,list,doctor,edit
# Write "yes" or "no" depending on whether you want to use sudo
no
# Write command to use for root
sudo
# Write a comma separated list of shortcuts below
rm,src,dl,ci,cr,cre
# Write a comma separated list of shortcut mappings from the manager below
remove,search,download,cask install,cask remove,cask reinstall
# Config for the pak package manager wrapper
packageManager = "brew"
commands = ["install", "reinstall", "remove", "upgrade", "update", "search", "cask", "list", "doctor", "edit"]
useRoot = false
rootCommand = "sudo"
shortcuts = ["rm", "src", "dl", "ci", "cr", "cre"]
shortcutMappings = ["remove", "search", "download", "cask install", "cask remove", "cask reinstall"]

View File

@ -1,12 +1,7 @@
# Write the name of the package manager in all lowercase below
aptman
# Write a comma separated list of commands from the manager below
install,remove,upgrade,update,refresh,autoremove,search,filesearch,list
# Write "yes" or "no" depending on whether you want to use sudo
yes
# Write command to use for root
sudo
# Write a comma separated list of shortcuts below
rm,arm,ls
# Write a comma separated list of shortcut mappings from the manager below
remove,autoremove,list
# Config for the pak package manager wrapper
packageManager = "aptman"
commands = ["install", "remove", "upgrade", "update", "refresh", "autoremove", "search", "filesearch", "list"]
useRoot = true
rootCommand = "sudo"
shortcuts = ["rm", "arm", "ls"]
shortcutMappings = ["remove", "autoremove", "list"]

View File

@ -1,13 +1,7 @@
# Write the name of the package manager in all lowercase below
snap
# Write a comma separated list of commands from the manager below
install,remove,refresh,revert,run,download
# Write "yes" or "no" depending on whether you want to use sudo
yes
# Write command to use for root
sudo
# Write a comma separated list of shortcuts below
rm,inst
# Write a comma separated list of shortcut mappings from the manager below
remove,install
# Config for the pak package manager wrapper
packageManager = "snap"
commands = ["install", "remove", "refresh", "revert", "run", "download"]
useRoot = true
rootCommand = "sudo"
shortcuts = ["rm", "inst"]
shortcutMappings = ["remove", "install"]

View File

@ -1,12 +1,7 @@
# Write the name of the package manager in all lowercase below
aptyay
# Write a comma separated list of commands from the manager below
install,remove,upgrade,update,refresh,autoremove,search,filesearch,list,interactive
# Write "yes" or "no" depending on whether you want to use sudo
no
# Write command to use for root
sudo
# Write a comma separated list of shortcuts below
rm,arm,ls,int
# Write a comma separated list of shortcut mappings from the manager below
remove,autoremove,list,interactive
# Config for the pak package manager wrapper
packageManager = "aptyay"
commands = ["install", "remove", "upgrade", "update", "refresh", "autoremove", "search", "filesearch", "list", "interactive"]
useRoot = false
rootCommand = "sudo"
shortcuts = ["rm", "arm", "ls", "int"]
shortcutMappings = ["remove", "autoremove", "list", "interactive"]

View File

@ -1,13 +1,7 @@
# Write the name of the package manager in all lowercase below
zypper
# Write a comma separated list of commands from the manager below
install,remove,refresh,search,update,addrepo
# Write "yes" or "no" depending on whether you want to use sudo
yes
# Write command to use for root
sudo
# Write a comma separated list of shortcuts below
rm,ar,inst
# Write a comma separated list of shortcut mappings from the manager below
remove,addrepo,install
# Config for the pak package manager wrapper
packageManager = "zypper"
commands = ["install", "remove", "refresh", "search", "update", "addrepo"]
useRoot = true
rootCommand = "sudo"
shortcuts = ["rm", "ar", "inst"]
shortcutMappings = ["remove", "addrepo", "install"]

View File

@ -1,5 +1,7 @@
package main
import "fmt"
// Remove an element at an index from a slice
func removeAtIndex(s []string, index int) []string {
return append(s[:index], s[index+1:]...)
@ -36,4 +38,12 @@ func Find(slice []string, val string) int {
}
}
return -1
}
func InterfaceToString(interfaceSlice []interface{}) []string {
returnedSlice := make([]string, len(interfaceSlice))
for index, element := range interfaceSlice {
returnedSlice[index] = fmt.Sprint(element)
}
return returnedSlice
}

View File

@ -6,11 +6,11 @@ import (
)
// Print help screen
func printHelpMessage(packageManagerCommand string, useRootBool bool, rootCommand string, commands []string, shortcuts []string, shortcutMappings []string, isOverridden bool) {
func printHelpMessage(packageManagerCommand string, useRoot bool, rootCommand string, commands []string, shortcuts []string, shortcutMappings []string, isOverridden bool) {
fmt.Println("Arsen Musayelyan's Package Manager Wrapper")
fmt.Print("Current package manager is: ", packageManagerCommand)
if isOverridden { fmt.Println(" (overridden)") } else { fmt.Print("\n") }
if useRootBool { fmt.Println("Using root with command:", rootCommand) } else { fmt.Println("Not using root") }
if useRoot { fmt.Println("Using root with command:", rootCommand) } else { fmt.Println("Not using root") }
fmt.Println()
fmt.Println("Usage: pak <command> [package]")
fmt.Println("Example: pak in hello")