summaryrefslogtreecommitdiff
path: root/cgit-clone/argv.go
diff options
context:
space:
mode:
Diffstat (limited to 'cgit-clone/argv.go')
-rw-r--r--cgit-clone/argv.go213
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)
+}