// Copyright 2017-2025 WIT.COM Inc. All rights reserved. // Use of this source code is governed by the GPL 3.0 package main import ( "fmt" "os" "path/filepath" "strings" "go.wit.com/dev/alexflint/arg" "go.wit.com/gui" "go.wit.com/lib/config" "go.wit.com/lib/debugger" "go.wit.com/lib/env" "go.wit.com/lib/fhelp" "go.wit.com/lib/protobuf/argvpb" "go.wit.com/log" ) // sent via -ldflags // is there a better way? var VERSION string var BUILDTIME string // used for shell auto completion var APPNAME string = "forge" func (args) InitGui() error { // panic("got here") arg.Register(&gui.ArgvGui) // me.gui = gui.PreInit() me.myGui = fhelp.Gui() return nil } func (args) Exit() { gui.UnloadToolkits() if env.Verbose() { log.Info("argv.Exit() called", APPNAME+".Exit() because env.Verbose() == true") } // remove this from the template for your app (or make one for youself if you need it) forgeExit() // custom forge shutdown function } func (args) MustParse() error { me.pp = arg.MustParse(&argv) return nil } func (a args) Description() string { // doHelp() return ` forge -- a tool to manage lots of git repos. forge includes a GUI and TUI. forge only executes the 'git' command. Everything it does, you can run by hand with 'git'. Orginally written to maintain the +50 GO git repositories for the WIT Private Cloud ` } // arg.Register(&argGui) // log.Info("ArgvGui() started") func (args) ArgvGui() error { me.myGui = fhelp.Gui() // adds the GUI package argv support me.origGui = gui.New() return nil } func (args) ArgvDebugger() bool { debugger.InitDebugger() // me.myGui = gui.Init() return true } func (args) Examples() string { var out string out += "forge show # show the state of all your repos\n" out += "forge normal # the defaults for 'normal' forge distributed development\n" out += " # it will makes a user branch in every git repo\n" out += "forge clean # removes changes forge might have made\n" out += " # purges all untracked git files, etc\n" out += "forge pull --force # 'git pull' on all repos\n" out += "forge commit --al # 'git commit' in every dirty repo\n" out += "forge merge --all # 'git merge' all patches to devel & master\n" out += "forge add # scan your current directory for all git repos\n" return out } // matches func (c CleanCmd) Match(partial string) []string { // return repos here return []string{"go.wit.com/apps/forge", "go.wit.com/apps/virtigo"} } // sends the strings to bash or zsh that will be your options func (a args) DoAutoComplete() error { var err error if me.pp == nil { me.pp, err = arg.ParseFlagsArgv(&argv) if err != nil { fmt.Fprintf(argvpb.Stderr, "returned from parseFlagsArgv(%v)\n", err) } } if argvpb.PB.IsMatch("cache") { matches, _ := matchCacheFiles() fmt.Fprintf(argvpb.Stdout, matches) return nil } if argvpb.PB.IsMatch("mode.--config") { matches, _ := matchModeDirs() fmt.Fprintf(argvpb.Stdout, matches) return nil } if argvpb.PB.IsMatch("mode") { err = me.pp.WriteHelpForAutocomplete("", "mode") matches := []string{"jwc", "false"} fmt.Fprintf(argvpb.Stdout, " "+strings.Join(matches, " ")) return nil } if argvpb.PB.GetCmd() == "" { // these are base autocomplete strings matches := []string{"clean", "commit", "merge", "patch", "normal", "pull", "rebuild", "generate", "config", "cache"} matches = append(matches, "show", "add", "fixer", "dev", "verify", "mode", "gui", "whatchanged") matches = append(matches, "--version", "--force", "--all", "--verbose") fmt.Fprintf(argvpb.Stdout, strings.Join(matches, " ")) return nil } err = me.pp.WriteHelpForAutocomplete(argvpb.PB.Partial, argvpb.PB.Real...) if err != nil { fmt.Fprintf(argvpb.Stderr, "returned from WriteHelpForAutocomplete() pb.Real(%v)\n", argvpb.PB.Real) fmt.Fprintf(argvpb.Stderr, "returned from WriteHelpForAutocomplete(%v)\n", err) } return err } func matchModeDirs() (string, error) { configDir, _ := os.UserConfigDir() globPattern := filepath.Join(configDir, "forge", "*") files, err := filepath.Glob(globPattern) var match string for _, file := range files { if config.IsDir(file) { _, base := filepath.Split(file) match += base + " " } } // log.Info("glob:", globPattern, "matchdirs:", match) return match, err } func matchCacheFiles() (string, error) { configDir, _ := os.UserCacheDir() globPattern := filepath.Join(configDir, "forge", "repos*.pb") files, err := filepath.Glob(globPattern) match := "all golang homedir" for _, file := range files { if config.IsDir(file) { _, base := filepath.Split(file) match += base + " " } } // log.Info("glob:", globPattern, "matchdirs:", match) return match, err }