2017-08-31 00:50:03 +00:00
package main
2017-08-31 09:48:00 +00:00
import (
"fmt"
"os"
2022-11-13 07:00:32 +00:00
"path/filepath"
2017-08-31 22:35:04 +00:00
"strings"
2017-08-31 09:48:00 +00:00
2021-08-26 21:31:43 +00:00
"git.rawtext.club/slope-lang/slp/operators"
2017-08-31 09:48:00 +00:00
)
2017-08-31 00:50:03 +00:00
2021-08-26 21:52:22 +00:00
const (
2022-11-13 07:00:32 +00:00
version string = "1.1"
2021-12-24 17:33:39 +00:00
globalText string = " (\033[36mglobal\033[0m)"
globalPath string = "/usr/local/lib/slope/modules/"
banner string = "\033[32;1mslp - slope package manager\033[0m"
helptext string = `
2022-11-13 07:00:32 +00:00
slp deps [ [ - g ] ] [ file ] # install the dependencies of ' file '
slp fetch # fetches the updated registry
2022-11-14 21:48:49 +00:00
slp gen [ [ - s | -- solo ] ] # creates new module dir / skeleton
2022-11-13 07:00:32 +00:00
slp help # print usage information
slp install [ [ - g ] ] [ module ... ] # installs module ( s )
slp installed [ [ - g ] ] # lists all installed packages
slp list # lists all available packages
slp local [ [ - g ] ] [ filepath ] # installs the module at filepath
slp remove [ [ - g ] ] [ module ... ] # removes module ( s )
slp search [ term ... ] # searches for modules
slp show [ module ... ] # shows details for module ( s )
slp update [ [ - g ] ] [ module ... ] # updates module ( s )
slp update - all [ [ - g ] ] [ module ... ] # updates all installed modules
slp version # print the current slp version
2021-12-24 17:33:39 +00:00
Operations that accept a - g flag will attempt to install a module systemwide ( this may require root access ) . A -- global flag may be passed in lieu of a - g flag if desired for clarity .
2022-11-14 21:48:49 +00:00
slp gen will automatically init a git repository in the created folder . The - s / -- solo flag will change that behavior to create a solo repository instead .
2021-12-30 18:30:07 +00:00
The install location for global modules is : / usr / local / lib / slope / modules
2021-12-24 17:33:39 +00:00
Globals modules must be dealt with separately from local modules and cannot be combined in a single command . `
2021-08-26 21:52:22 +00:00
)
2017-08-31 00:50:03 +00:00
func main ( ) {
2017-08-31 09:48:00 +00:00
arg := os . Args
2021-12-24 17:33:39 +00:00
if len ( arg ) <= 1 || arg [ 1 ] == "--help" || arg [ 1 ] == "-h" || arg [ 1 ] == "help" {
printHelp ( )
2021-08-26 21:52:22 +00:00
return
2022-11-13 07:00:32 +00:00
} else if arg [ 1 ] == "version" || arg [ 1 ] == "-v" || arg [ 1 ] == "--version" {
fmt . Println ( version )
return
2021-08-26 21:52:22 +00:00
}
2017-08-31 09:48:00 +00:00
2021-12-24 17:33:39 +00:00
global := false
globalTxt := ""
modules := arg [ 2 : ]
if len ( arg ) > 3 && ( arg [ 2 ] == "-g" || arg [ 2 ] == "--global" ) {
checkGlobalEnv ( )
global = true
modules = arg [ 3 : ]
2021-12-24 18:22:27 +00:00
globalTxt = globalText
2017-08-31 09:48:00 +00:00
}
2022-11-13 07:00:32 +00:00
MainSwitch :
2021-09-16 21:43:08 +00:00
switch arg [ 1 ] {
2022-11-13 07:00:32 +00:00
case "deps" :
if len ( modules ) == 0 {
fmt . Fprint ( os . Stderr , "The 'deps' command requires a path to a slope file: `slp deps [file]`\n" )
break
2021-08-27 06:07:02 +00:00
}
2022-11-13 07:00:32 +00:00
mods , err := operators . Deps ( modules [ 0 ] )
2021-08-27 06:07:02 +00:00
if err != nil {
fmt . Println ( err )
os . Exit ( 1 )
}
2022-11-13 07:00:32 +00:00
modules = mods
arg [ 1 ] = "install"
goto MainSwitch
2022-05-20 05:04:46 +00:00
case "fetch" :
err := operators . Fetch ( )
if err != nil {
2022-11-13 07:00:32 +00:00
fmt . Fprintf ( os . Stderr , "%s\n" , err . Error ( ) )
2022-05-20 05:04:46 +00:00
os . Exit ( 1 )
}
2021-09-16 21:43:08 +00:00
case "list" :
2017-08-31 12:00:45 +00:00
err := operators . List ( )
if err != nil {
2022-11-13 07:00:32 +00:00
fmt . Fprintf ( os . Stderr , "%s\n" , err . Error ( ) )
2017-08-31 12:00:45 +00:00
os . Exit ( 1 )
}
2022-05-09 22:40:53 +00:00
case "local" :
locals := make ( [ ] string , 0 , 5 )
for _ , mod := range modules {
fmt . Printf ( "installing from local %s%s\n" , mod , globalTxt )
err := operators . LocalInstall ( mod , global )
if err != nil {
2022-11-13 07:00:32 +00:00
fmt . Fprintf ( os . Stderr , " \033[2m└\033[0m \033[31mERROR:\033[0m %s\n\n" , err . Error ( ) )
2022-05-09 22:40:53 +00:00
continue
}
locals = append ( locals , mod )
fmt . Print ( " \033[2m└\033[0m \033[32mdone\033[0m\n\n" )
}
printStat ( "\033[1;32m" , "LOCALED" , locals )
2021-09-16 21:43:08 +00:00
case "installed" :
2021-12-24 18:22:27 +00:00
if len ( arg ) > 2 && ( arg [ 2 ] == "-g" || arg [ 2 ] == "--global" ) {
global = true
globalTxt = globalText
}
2021-12-24 17:33:39 +00:00
err := operators . ShowInstalled ( global , globalTxt )
2021-08-30 04:24:51 +00:00
if err != nil {
2022-11-13 07:00:32 +00:00
fmt . Fprintf ( os . Stderr , "%s\n" , err . Error ( ) )
2021-08-30 04:24:51 +00:00
os . Exit ( 1 )
}
2021-09-16 21:43:08 +00:00
case "gen" :
2022-11-14 21:48:49 +00:00
solo := false
if len ( arg ) > 2 && arg [ 2 ] == "-s" || arg [ 2 ] == "--solo" {
solo = true
}
err := operators . Generate ( solo )
2017-08-31 20:23:55 +00:00
if err != nil {
2022-11-13 07:00:32 +00:00
fmt . Fprintf ( os . Stderr , "%s\n" , err . Error ( ) )
2017-08-31 20:23:55 +00:00
os . Exit ( 1 )
}
2021-09-16 21:43:08 +00:00
case "install" :
installs := make ( [ ] string , 0 , 5 )
2021-12-24 17:33:39 +00:00
for _ , mod := range modules {
fmt . Printf ( "installing %s%s\n" , mod , globalTxt )
err := operators . Install ( mod , global )
2021-09-16 21:43:08 +00:00
if err != nil {
2022-11-13 07:00:32 +00:00
fmt . Fprintf ( os . Stderr , " \033[2m└\033[0m \033[31mERROR:\033[0m %s\n\n" , err . Error ( ) )
2021-09-16 21:43:08 +00:00
continue
}
installs = append ( installs , mod )
2022-11-13 07:00:32 +00:00
fmt . Fprint ( os . Stderr , " \033[2m└\033[0m \033[32mdone\033[0m\n\n" )
2017-08-31 10:55:23 +00:00
}
2021-09-16 21:43:08 +00:00
printStat ( "\033[1;32m" , "INSTALLED" , installs )
case "remove" :
removes := make ( [ ] string , 0 , 5 )
2021-12-24 17:33:39 +00:00
for _ , mod := range modules {
fmt . Printf ( "removing %s%s\n" , mod , globalTxt )
err := operators . Remove ( mod , global )
2021-09-16 21:43:08 +00:00
if err != nil {
fmt . Println ( err )
continue
}
removes = append ( removes , mod )
2021-09-17 06:23:32 +00:00
fmt . Print ( " \033[2m└\033[0m \033[32mdone\033[0m\n\n" )
2021-09-16 21:43:08 +00:00
}
printStat ( "\033[1;31m" , "REMOVED" , removes )
case "update" :
updates := make ( [ ] string , 0 , 5 )
2021-12-24 17:33:39 +00:00
for _ , mod := range modules {
fmt . Printf ( "updating %s%s\n" , mod , globalTxt )
err := operators . Update ( mod , global )
2021-09-16 21:43:08 +00:00
if err != nil {
fmt . Println ( err )
continue
}
updates = append ( updates , mod )
2021-09-17 06:23:32 +00:00
fmt . Print ( " \033[2m└\033[0m \033[32mdone\033[0m\n\n" )
2021-09-16 21:43:08 +00:00
}
printStat ( "\033[1;36m" , "UPDATED" , updates )
2022-11-13 07:00:32 +00:00
case "update-all" :
baseDir := operators . GetModBaseDir ( )
if global {
baseDir = operators . GlobalPath
}
mods , _ := filepath . Glob ( filepath . Join ( baseDir , "*" ) )
for i := range mods {
mods [ i ] = filepath . Base ( mods [ i ] )
}
modules = mods
arg [ 1 ] = "update"
goto MainSwitch
2021-09-16 21:43:08 +00:00
case "search" :
2021-12-24 17:33:39 +00:00
for _ , term := range modules {
2021-09-16 21:43:08 +00:00
fmt . Printf ( "searching for %q\n\n" , term )
err := operators . Search ( term )
if err != nil {
fmt . Println ( err )
continue
}
2017-08-31 10:55:23 +00:00
}
2021-09-16 21:43:08 +00:00
case "show" :
2021-12-24 17:33:39 +00:00
for _ , mod := range modules {
2021-09-16 21:43:08 +00:00
err := operators . Show ( mod )
if err != nil {
fmt . Println ( err )
continue
}
}
default :
fmt . Fprintf ( os . Stderr , "Unknown command %s\n\n%s\n" , arg [ 1 ] , helptext )
2017-08-31 10:55:23 +00:00
}
2017-08-31 19:31:16 +00:00
}
2021-08-26 21:31:43 +00:00
func printStat ( color , prefix string , pkgs [ ] string ) {
2017-08-31 22:35:04 +00:00
count := len ( pkgs )
2017-08-31 19:31:16 +00:00
if count > 0 {
2021-08-26 21:52:22 +00:00
fmt . Printf ( "%s%10s\033[0m " , color , prefix )
2017-08-31 19:31:16 +00:00
if count > 1 {
fmt . Printf ( "%d packages" , count )
} else {
fmt . Printf ( "1 package" )
}
2017-08-31 22:35:04 +00:00
fmt . Printf ( " (%s)\n" , strings . Join ( pkgs , ", " ) )
2017-08-31 19:31:16 +00:00
}
2017-08-31 00:50:03 +00:00
}
2021-12-24 17:33:39 +00:00
func checkGlobalEnv ( ) {
err := os . MkdirAll ( globalPath , 0755 )
if err != nil {
fmt . Fprintf ( os . Stderr , "\033[1;31mError:\033[0m Unable to access global environment.\n\nAre you root? Using a \033[3m-g\033[0m or \033[3m--global\033[0m flag accesses the /usr/local/lib heirarchy,\nwhich will require root access on most systems\n" )
os . Exit ( 1 )
}
}
func printHelp ( ) {
fmt . Printf ( "%s\n%s\n" , banner , helptext )
}