diff options
Diffstat (limited to 'cgit-clone/argv.go')
| -rw-r--r-- | cgit-clone/argv.go | 213 | 
1 files changed, 213 insertions, 0 deletions
diff --git a/cgit-clone/argv.go b/cgit-clone/argv.go new file mode 100644 index 0000000..524c91f --- /dev/null +++ b/cgit-clone/argv.go @@ -0,0 +1,213 @@ +// Copyright 2017-2025 WIT.COM Inc. All rights reserved. +// Use of this source code is governed by the GPL 3.0 + +package main + +import ( +	"os" + +	"go.wit.com/lib/gui/prep" +	"go.wit.com/log" +) + +/* +	this parses the command line arguements using alex flint's go-arg +*/ + +var argv args + +type args struct { +	Checkout *CheckoutCmd `arg:"subcommand:checkout"                  help:"switch branches using 'git checkout'"` +	Clean    *CleanCmd    `arg:"subcommand:reset"                     help:"reset all git repos to the original state"` +	Commit   *CommitCmd   `arg:"subcommand:commit"                    help:"'git commit' but errors out if on wrong branch"` +	Config   *ConfigCmd   `arg:"subcommand:config"                    help:"show your .config/forge/ settings"` +	Gui      *EmptyCmd    `arg:"subcommand:gui"                       help:"open the gui"` +	Merge    *MergeCmd    `arg:"subcommand:merge"                     help:"merge branches"` +	Normal   *NormalCmd   `arg:"subcommand:normal"                    help:"set every repo to the default state for software development"` +	Patch    *PatchCmd    `arg:"subcommand:patch"                     help:"make patchsets"` +	Pull     *PullCmd     `arg:"subcommand:pull"                      help:"run 'git pull'"` +	Show     *ShowCmd     `arg:"subcommand:show"                      help:"print out things"` +	Dev      *DevCmd      `arg:"subcommand:dev"                       help:"features under development"` +	All      bool         `arg:"--all"                                help:"git commit --all"` +	Force    bool         `arg:"--force"                              help:"try to strong-arm things"` +	Verbose  bool         `arg:"--verbose"                            help:"show more output"` +} + +func (args) Examples() string { +	var out string +	out += "forge pull --force    # 'git pull' on all repos\n" +	out += "forge merge --all     # merge all patches to devel & master\n" +	out += "forge normal fix      # the defaults for 'normal' forge distributed development (makes local user branches)\n" +	out += "forge reset fix       # smartly restore all git repos to the upstream state (removes changes forge might have made)\n" +	return out +} + +type EmptyCmd struct { +} + +type testCmd string + +type ShowCmd struct { +	Dirty *EmptyCmd `arg:"subcommand:dirty"                     help:"show dirty git repos"` +	Repo  *RepoCmd  `arg:"subcommand:repos"                     help:"print a table of the current repos"` +	Tag   *TagCmd   `arg:"subcommand:tag"                       help:"show git tags"` +} + +func (ShowCmd) Examples() string { +	return "forge show dirty\nforge show repos --all" +} + +type RepoCmd 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/"` +	User      bool `arg:"--user"                          help:"show repos on the user branch"` +	Full      bool `arg:"--full"                          help:"show full repo names"` +	// ReadOnly  bool `arg:"--readonly"                      help:"include read-only repos"` +} + +type NormalCmd struct { +	Fix *EmptyCmd `arg:"subcommand:fix"              help:"try to fix problems"` +	On  *EmptyCmd `arg:"subcommand:on"                help:"turn normal mode on"` +	Off *EmptyCmd `arg:"subcommand:off"               help:"turn normal mode off"` +} + +type CommitCmd struct { +	// Submit bool `arg:"--submit"                    help:"submit the patches to forge"` +	All bool `arg:"--all"                             help:"git commit in all dirty repos"` +} + +type DevCmd struct { +	Build      string `arg:"--build"                  help:"build a repo"` +	Install    string `arg:"--install"                help:"install a repo"` +	BuildForge bool   `arg:"--forge-rebuild"          help:"download and rebuild forge"` +	URL        string `arg:"--connect"                help:"forge url"` +} + +type CleanCmd struct { +	Fix  *EmptyCmd `arg:"subcommand:fix"              help:"try to fix problems"` +	Repo string    `arg:"--repo"                      help:"work on one specific git repository"` +} + +// matches +func (c CleanCmd) Match(partial string) []string { +	// return repos here +	return []string{"go.wit.com/apps/forge", "go.wit.com/apps/virtigo"} +} + +type CleanDevelCmd struct { +	Force bool `arg:"--force"                         help:"try to strong arm things"` +} + +type PatchCmd struct { +	Check  *EmptyCmd  `arg:"subcommand:check"         help:"check the state of the patches"` +	List   *EmptyCmd  `arg:"subcommand:list"          help:"your downloaded patchsets"` +	Get    *EmptyCmd  `arg:"subcommand:get"           help:"get the new patchsets"` +	Show   *EmptyCmd  `arg:"subcommand:show"          help:"your pending commits to your code"` +	Submit *SubmitCmd `arg:"subcommand:submit"        help:"submit your commits"` +	Repos  *SubmitCmd `arg:"subcommand:repos"         help:"show repos with patches"` +} + +type SubmitCmd struct { +	Match string `arg:"positional"` +} + +type PullCmd struct { +	Force bool      `arg:"--force"                    help:"try to strong-arm things"` +	List  *EmptyCmd `arg:"subcommand:list"            help:"list repo versions"` +	Check *EmptyCmd `arg:"subcommand:check"           help:"check for repo changes"` +} + +type TagCmd struct { +	List   *EmptyCmd `arg:"subcommand:list"           help:"list the tags"` +	Clean  *EmptyCmd `arg:"subcommand:clean"          help:"clean out old and duplicate tags"` +	Delete string    `arg:"--delete"                  help:"delete a tag"` +} + +type CheckoutCmd struct { +	User   *EmptyCmd `arg:"subcommand:user"           help:"git checkout user"` +	Devel  *EmptyCmd `arg:"subcommand:devel"          help:"git checkout devel"` +	Master *EmptyCmd `arg:"subcommand:master"         help:"git checkout master"` +} + +type MergeCmd struct { +	All     bool      `arg:"--all"                    help:"merge all"` +	Devel   *EmptyCmd `arg:"subcommand:devel"         help:"merge user to devel"` +	Master  *EmptyCmd `arg:"subcommand:master"        help:"merge devel to master"` +	Publish *EmptyCmd `arg:"subcommand:publish"       help:"increment versions and publish master branch"` +} + +type ConfigCmd struct { +	Add      *ConfigAddCmd `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)"` +} + +type ConfigAddCmd struct { +	Path        string `arg:"--path"                            help:"absolute path of the git repo"` +	GoPath      string `arg:"--gopath"                          help:"GO path of the git repo"` +	Directory   bool   `arg:"--directory"                       help:"repo is a directory to match against"` +	ReadOnly    bool   `arg:"--readonly"                        help:"repo is readonly"` +	Writable    bool   `arg:"--writable"                        help:"repo is writable"` +	Favorite    bool   `arg:"--favorite"                        help:"forge will always go-clone or git clone this" default:"false"` +	Private     bool   `arg:"--private"      default:"false"    help:"repo can not be published"` +	Interesting bool   `arg:"--interesting"  default:"false"    help:"something you decided was cool"` +	DebName     string `arg:"--debname"                         help:"the name of the debian package (or rpm, etc)"` +	Master      string `arg:"--master"                          help:"the git 'master' or 'main' branch name"` +	Devel       string `arg:"--devel"                           help:"the git devel branch name"` +	User        string `arg:"--user"                            help:"the git user branch name"` +} + +func (args) Version() string { +	return ARGNAME + " " + VERSION + "    Built on " + BUILDTIME +} + +// keep this small +func doHelp() { +	log.Info("") +	log.Info("forge -h       : to see the available options") +	log.Info("forge --bash   : will create a bash autocomplete file") +	log.Info("forge          : with no arguements, forge tries to load a GO GUI plugin") +	log.Info("               : there are two GUI plugins. terminal & GTK") +	log.Info("") +	log.Info("forge list     : shows a table of all your repos") +	log.Info("forge checkout : checks out all your repos to the same branch") +	log.Info("               : the default is your user branch") +	log.Info("forge clean    : reverts all repos to the master branch") +	log.Info("forge dirty    : show all repos git reports as dirty") +	log.Info("") +} + +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'. +` +} + +func ifBlank(arg string) bool { +	if arg == "''" { +		// if empty, the user has not typed something +		return true +	} +	return false +} + +func (args) Appname() string { +	return ARGNAME +} + +func (a args) DoAutoComplete(pb *prep.Auto) { +	if pb.Cmd == "" { +		pb.Autocomplete3([]string{"checkout", "reset", "commit", "config", "gui", "merge", "normal", "patch", "pull", "show"}) +	} else { +		pb.SubCommand(pb.Argv...) +	} +	os.Exit(0) +}  | 
