package main import ( "fmt" "os" ) /* this parses the command line arguements */ var argv args type EmptyCmd struct { } type PatchCmd struct { List bool `arg:"--list" help:"list available patches"` Show string `arg:"--show" help:"show a specific patch"` } 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"` } type FindCmd struct { All bool `arg:"--all" help:"select every repo (the default)"` Mine bool `arg:"--mine" help:"your repos as defined in the forge config"` Favorites bool `arg:"--favorites" help:"your repos configured as favorites"` Private bool `arg:"--private" help:"your private repos from your .config/forge/"` Dirty bool `arg:"--dirty" help:"only use dirty git repos"` // ReadOnly bool `arg:"--readonly" help:"include read-only repos"` } type args struct { List *FindCmd `arg:"subcommand:list" help:"just show a table of the current state"` Dirty *EmptyCmd `arg:"subcommand:dirty" help:"check if your git repos are dirty"` // 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"` Checkout *CheckoutCmd `arg:"subcommand:checkout" help:"switch git branches"` Patch *PatchCmd `arg:"subcommand:patch" help:"examine and make patch sets"` GitPull *FindCmd `arg:"subcommand:pull" help:"run 'git pull'"` Config *FindCmd `arg:"subcommand:config" help:"show your .config/forge/ settings"` ListPatchSet bool `arg:"--list-patchset" help:"list patch sets"` DryRun bool `arg:"--dry-run" help:"show what would be run"` Fix bool `arg:"--fix" help:"fix config, save config & exit"` Delete string `arg:"--delete" help:"delete this repo"` URL string `arg:"--connect" help:"gowebd url"` Register string `arg:"--register" help:"register your git URL (foo.com/mystuff) or (github.com/foo/bar)"` GitReset bool `arg:"--git-reset" help:"run 'git reset --hard'"` Scan bool `arg:"--scan" help:"reload protobuf from .git/"` Force bool `arg:"--force" help:"force redo things"` PatchSet string `arg:"--patchset" help:"make patch set"` Apply string `arg:"--apply" help:"apply a patch set"` Bash bool `arg:"--bash" help:"generage bash completion"` BashAuto []string `arg:"--bash-auto" help:"generage bash completion"` } 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: forge config # shows your forge config (~/.config/forge/) forge list # show every repo state forge dirty # show only dirty repos forge pull # run 'git pull' in every repo forge checkout user # git checkout the user branch forge checkout devel # git checkout the devel branch forge checkout master # git checkout the master branch ` } // 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 } 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() { 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 "list": fmt.Println("--all --mine --favorites --private") case "checkout": fmt.Println("user devel master") case "patch": fmt.Println("--list --submit --show") case "pull": case "dirty": case "user": case "devel": case "master": default: if argv.BashAuto[0] == name { // list the subcommands here fmt.Println("patch checkout list dirty pull") } } os.Exit(0) } // complete -F forge --bash forge func (args) doBash() { name := "forge" fmt.Println("# add this in your bashrc:") fmt.Println("") fmt.Println("# if we add a 'hidden' go-arg option --bash") fmt.Println("#") fmt.Println("# then this is all we have to output:") 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") fmt.Println(" GOARGS=$(" + name + " --bash-auto $prev \\'$cur\\' $all)") 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) os.Exit(0) }