2024-12-02 06:59:56 -06:00
|
|
|
package main
|
|
|
|
|
2025-01-06 15:44:56 -06:00
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
)
|
|
|
|
|
2024-12-02 06:59:56 -06:00
|
|
|
/*
|
|
|
|
this parses the command line arguements
|
|
|
|
*/
|
|
|
|
|
|
|
|
var argv args
|
|
|
|
|
2025-01-05 01:18:47 -06:00
|
|
|
type EmptyCmd struct {
|
|
|
|
}
|
|
|
|
|
2025-01-06 15:44:56 -06:00
|
|
|
type PatchCmd struct {
|
|
|
|
List bool `arg:"--list" help:"list available patches"`
|
|
|
|
Show string `arg:"--show" help:"show a specific patch"`
|
|
|
|
}
|
|
|
|
|
2025-01-06 17:53:20 -06:00
|
|
|
type ConfigCmd struct {
|
|
|
|
Add *EmptyCmd `arg:"subcommand:add" help:"add a config setting"`
|
|
|
|
Fix *EmptyCmd `arg:"subcommand:fix" help:"fix .config/forge/ and/or repos.pb protobuf file"`
|
|
|
|
List *EmptyCmd `arg:"subcommand:list" help:"list your config settings"`
|
|
|
|
Delete string `arg:"--delete" help:"delete this repo"`
|
|
|
|
Register string `arg:"--register" help:"register your git URL (foo.com/mystuff) or (github.com/foo/bar)"`
|
|
|
|
}
|
|
|
|
|
2025-01-06 15:44:56 -06:00
|
|
|
type CheckoutCmd struct {
|
|
|
|
User *FindCmd `arg:"subcommand:user" help:"git checkout user"`
|
|
|
|
Devel *FindCmd `arg:"subcommand:devel" help:"git checkout devel"`
|
|
|
|
Master *FindCmd `arg:"subcommand:master" help:"git checkout master"`
|
|
|
|
}
|
|
|
|
|
2024-12-24 01:54:33 -06:00
|
|
|
type FindCmd struct {
|
2024-12-27 04:36:29 -06:00
|
|
|
All bool `arg:"--all" help:"select every repo (the default)"`
|
2024-12-24 01:54:33 -06:00
|
|
|
Mine bool `arg:"--mine" help:"your repos as defined in the forge config"`
|
|
|
|
Favorites bool `arg:"--favorites" help:"your repos configured as favorites"`
|
2024-12-27 04:36:29 -06:00
|
|
|
Private bool `arg:"--private" help:"your private repos from your .config/forge/"`
|
2025-01-05 01:18:47 -06:00
|
|
|
Dirty bool `arg:"--dirty" help:"only use dirty git repos"`
|
2024-12-27 04:36:29 -06:00
|
|
|
// ReadOnly bool `arg:"--readonly" help:"include read-only repos"`
|
2024-12-24 01:54:33 -06:00
|
|
|
}
|
|
|
|
|
2024-12-02 06:59:56 -06:00
|
|
|
type args struct {
|
2025-01-06 17:53:20 -06:00
|
|
|
Checkout *CheckoutCmd `arg:"subcommand:checkout" help:"switch git branches"`
|
|
|
|
Config *ConfigCmd `arg:"subcommand:config" help:"show your .config/forge/ settings"`
|
|
|
|
Dirty *EmptyCmd `arg:"subcommand:dirty" help:"check if your git repos are dirty"`
|
|
|
|
GitReset *EmptyCmd `arg:"subcommand:hard-reset" help:"hard reset your user git branch"`
|
|
|
|
List *FindCmd `arg:"subcommand:list" help:"just show a table of the current state"`
|
|
|
|
Patch *PatchCmd `arg:"subcommand:patch" help:"examine and make patch sets"`
|
|
|
|
GitPull *FindCmd `arg:"subcommand:pull" help:"run 'git pull'"`
|
|
|
|
Rescan *EmptyCmd `arg:"subcommand:rescan" help:"recreate the git protobuf repos.pb file"`
|
|
|
|
URL string `arg:"--connect" help:"gowebd url"`
|
|
|
|
Bash bool `arg:"--bash" help:"generate bash completion"`
|
|
|
|
BashAuto []string `arg:"--auto-complete" help:"does the actual autocompletion"`
|
2024-12-02 06:59:56 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
func (args) Version() string {
|
|
|
|
return "forge " + VERSION + " Built on " + BUILDTIME
|
|
|
|
}
|
|
|
|
|
|
|
|
func (a args) Description() string {
|
|
|
|
return `
|
|
|
|
forge -- in the spirit of things like sourceforge
|
|
|
|
|
|
|
|
Examples:
|
2025-01-06 17:53:20 -06:00
|
|
|
forge # opens the GUI
|
2025-01-06 15:44:56 -06:00
|
|
|
forge list # show every repo state
|
2025-01-06 17:53:20 -06:00
|
|
|
forge dirty # check for dirty git repos
|
2025-01-06 15:44:56 -06:00
|
|
|
forge pull # run 'git pull' in every repo
|
2025-01-06 17:53:20 -06:00
|
|
|
forge checkout # switch git branches
|
2024-12-05 12:29:47 -06:00
|
|
|
|
2024-12-23 11:15:16 -06:00
|
|
|
`
|
2024-12-02 06:59:56 -06:00
|
|
|
}
|
2025-01-06 15:44:56 -06:00
|
|
|
|
|
|
|
// prints help to STDERR
|
|
|
|
func (args) doBashHelp() {
|
|
|
|
name := "forge"
|
|
|
|
if argv.BashAuto[1] != "''" {
|
|
|
|
// if this is not blank, then the user has typed something
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if argv.BashAuto[0] != name {
|
|
|
|
// if this is not the name of the command, the user already started doing something
|
|
|
|
return
|
|
|
|
}
|
2025-01-06 16:53:13 -06:00
|
|
|
if argv.BashAuto[0] == name {
|
|
|
|
me.pp.WriteHelp(os.Stderr)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
fmt.Fprintln(os.Stderr, "")
|
|
|
|
fmt.Fprintln(os.Stderr, "hello world")
|
|
|
|
fmt.Fprintln(os.Stderr, "")
|
|
|
|
}
|
|
|
|
|
|
|
|
func (args) doBashHelpDebug() {
|
2025-01-06 15:44:56 -06:00
|
|
|
fmt.Fprintln(os.Stderr, "")
|
|
|
|
fmt.Fprintln(os.Stderr, "hello world")
|
|
|
|
var more string
|
|
|
|
p0 := "0" + argv.BashAuto[0]
|
|
|
|
p1 := "1" + argv.BashAuto[1]
|
|
|
|
p2 := "2" + argv.BashAuto[2]
|
|
|
|
if len(argv.BashAuto[1]) >= 0 {
|
|
|
|
more = "more"
|
|
|
|
} else {
|
|
|
|
more = "less"
|
|
|
|
}
|
|
|
|
p1a := fmt.Sprintf("1a.%s.%+v.\n", argv.BashAuto[1], len(argv.BashAuto[1]))
|
|
|
|
fmt.Fprintln(os.Stderr, "pull something else", argv.BashAuto, len(argv.BashAuto), p0, p1, p2, p1a, "end", more)
|
|
|
|
fmt.Fprintln(os.Stderr, "")
|
|
|
|
}
|
|
|
|
|
|
|
|
func (args) doBashAuto() {
|
|
|
|
name := "forge"
|
|
|
|
argv.doBashHelp()
|
|
|
|
switch argv.BashAuto[0] {
|
|
|
|
case "checkout":
|
|
|
|
fmt.Println("user devel master")
|
2025-01-06 17:53:20 -06:00
|
|
|
case "config":
|
|
|
|
fmt.Println("add fix list delete")
|
|
|
|
case "list":
|
|
|
|
fmt.Println("--all --mine --favorites --private")
|
|
|
|
case "pull":
|
|
|
|
fmt.Println("--all --mine --favorites --private")
|
2025-01-06 16:53:13 -06:00
|
|
|
case "patch":
|
2025-01-06 15:44:56 -06:00
|
|
|
fmt.Println("--list --submit --show")
|
2025-01-06 16:53:13 -06:00
|
|
|
case "dirty":
|
|
|
|
case "user":
|
|
|
|
case "devel":
|
|
|
|
case "master":
|
2025-01-06 15:44:56 -06:00
|
|
|
default:
|
|
|
|
if argv.BashAuto[0] == name {
|
|
|
|
// list the subcommands here
|
2025-01-06 17:53:20 -06:00
|
|
|
fmt.Println("--bash checkout config dirty hard-reset list patch pull rescan")
|
2025-01-06 15:44:56 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
os.Exit(0)
|
|
|
|
}
|
|
|
|
|
|
|
|
// complete -F forge --bash forge
|
|
|
|
func (args) doBash() {
|
|
|
|
name := "forge"
|
|
|
|
fmt.Println("# add this in your bashrc:")
|
|
|
|
fmt.Println("")
|
2025-01-06 17:53:20 -06:00
|
|
|
fmt.Println("# todo: add this to go-arg as a 'hidden' go-arg option --bash")
|
2025-01-06 15:44:56 -06:00
|
|
|
fmt.Println("#")
|
2025-01-06 17:53:20 -06:00
|
|
|
fmt.Println("# todo: make this output work/parse with:")
|
2025-01-06 15:44:56 -06:00
|
|
|
fmt.Println("# complete -C " + name + " --bash go")
|
|
|
|
fmt.Println("")
|
|
|
|
fmt.Println("_" + name + "_complete()")
|
|
|
|
fmt.Println("{")
|
|
|
|
fmt.Println(" # sets local to this func vars")
|
|
|
|
fmt.Println(" local cur prev all")
|
|
|
|
fmt.Println(" cur=${COMP_WORDS[COMP_CWORD]}")
|
|
|
|
fmt.Println(" prev=${COMP_WORDS[COMP_CWORD-1]}")
|
|
|
|
fmt.Println(" all=${COMP_WORDS[@]}")
|
|
|
|
fmt.Println("")
|
|
|
|
fmt.Println(" # this is where we generate the go-arg output")
|
2025-01-06 17:53:20 -06:00
|
|
|
fmt.Println(" GOARGS=$(" + name + " --auto-complete $prev \\'$cur\\' $all)")
|
2025-01-06 15:44:56 -06:00
|
|
|
fmt.Println("")
|
|
|
|
fmt.Println(" # this compares the command line input from the user")
|
|
|
|
fmt.Println(" # to whatever strings we output")
|
|
|
|
fmt.Println(" COMPREPLY=( $(compgen -W \"$GOARGS\" -- $cur) ) # THIS WORKS")
|
|
|
|
fmt.Println(" return 0")
|
|
|
|
fmt.Println("}")
|
|
|
|
fmt.Println("complete -F _" + name + "_complete " + name)
|
2025-01-06 17:53:20 -06:00
|
|
|
fmt.Println("")
|
|
|
|
fmt.Println("# copy and paste the above into your bash shell should work")
|
2025-01-06 15:44:56 -06:00
|
|
|
os.Exit(0)
|
|
|
|
}
|