// 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/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 only executes the 'git' command. Everything it does, you can run by hand with 'git'. Orginally written to maintain the 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) 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 } func (args) Match() bool { if argvpb.PB.IsMatch("cache") { matches, _ := matchCacheFiles() fmt.Fprintf(argvpb.Stdout, "%s", matches) return true } if argvpb.PB.IsMatch("mode.--config") { matches, _ := matchModeDirs() fmt.Fprintf(argvpb.Stdout, "%s", matches) return true } if argvpb.PB.IsMatch("mode") { matches := []string{"jwc", "false"} fmt.Fprintf(argvpb.Stdout, "%s", " "+strings.Join(matches, " ")) return true } return false } // sends the strings to bash or zsh that will be your options func (a args) DoAutoComplete() error { var err error me.pp, err = arg.ParseFlagsArgv(&argv) if err != nil { fmt.Fprintf(argvpb.Stddbg, "go-args parseFlagsArgv(%v) finished autocomplete\n", err) // counter intuitive. return nil on err for now return nil } if argvpb.PB.IsMatch("cache") { matches, _ := matchCacheFiles() fmt.Fprintf(argvpb.Stdout, "%s", matches) return nil } if argvpb.PB.IsMatch("mode.--config") { matches, _ := matchModeDirs() fmt.Fprintf(argvpb.Stdout, "%s", matches) return nil } if argvpb.PB.IsMatch("mode") { err = me.pp.WriteHelpForAutocomplete("", "mode") matches := []string{"jwc", "false"} fmt.Fprintf(argvpb.Stdout, "%s", " "+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", "--help") fmt.Fprintf(argvpb.Stdout, "%s", strings.Join(matches, " ")) return nil } 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 }