summaryrefslogtreecommitdiff
path: root/argv.go
blob: f5551b3fcde97eb3a1a02d87ec736be7a2b0c2ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package main

import (
	"fmt"
	"os"
)

/*
	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 git branches"`
	Config   *ConfigCmd   `arg:"subcommand:config"                    help:"show your .config/forge/ settings"`
	Dirty    *DirtyCmd    `arg:"subcommand:dirty"                     help:"check if your git repos are dirty"`
	GitReset *EmptyCmd    `arg:"subcommand:hard-reset"                help:"hard reset your user git branches"`
	List     *FindCmd     `arg:"subcommand:list"                      help:"just show a table of the current state"`
	Patch    *PatchCmd    `arg:"subcommand:patch"                     help:"examine and make patch sets"`
	GitPull  *FindCmd     `arg:"subcommand:pull"                      help:"run 'git pull'"`
	Rescan   *EmptyCmd    `arg:"subcommand:rescan"                    help:"recreate the git protobuf repos.pb file"`
	Delete   *EmptyCmd    `arg:"subcommand:delete"                    help:"untrack a repo"`
	Commit   *EmptyCmd    `arg:"subcommand:commit"                    help:"smart 'git commit' (errors out if on wrong branch)"`
	Clean    *CleanCmd    `arg:"subcommand:clean"                     help:"clean out all local branches (safely)"`
	Examine  *ExamineCmd  `arg:"subcommand:examine"                   help:"examine branches"`
	URL      string       `arg:"--connect"                            help:"gowebd url"`
	All      bool         `arg:"--all"                                help:"git commit --all"`
	Show     string       `arg:"--show"                               help:"show a repo"`
	Bash     bool         `arg:"--bash"                               help:"generate bash completion"`
	BashAuto []string     `arg:"--auto-complete"                      help:"does the actual autocompletion"`
	Force    bool         `arg:"--force"                              help:"try to strong arm things"`
	Verbose  bool         `arg:"--verbose"                            help:"show more output"`
}

type EmptyCmd struct {
}

type testCmd string

type ExamineCmd struct {
	Fix    *EmptyCmd `arg:"subcommand:fix"           help:"try to auto fix branches"`
	Show   *EmptyCmd `arg:"subcommand:show"          help:"show a specific patch"`
	Submit string    `arg:"--submit"                 help:"name of patchset"`
}

type CleanCmd struct {
	Force *EmptyCmd `arg:"subcommand:force"         help:"dangerously delete things that are not pushed upstream"`
	User  *EmptyCmd `arg:"subcommand:user"          help:"dump all the user branches"`
}

type PatchCmd struct {
	List   *EmptyCmd `arg:"subcommand:list"          help:"list available patches"`
	Show   *EmptyCmd `arg:"subcommand:show"          help:"show a specific patch"`
	Submit string    `arg:"--submit"                 help:"submit a new patchset with name"`
}

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"    default:"false"    help:"repo is a directory to match against"`
	ReadOnly    bool   `arg:"--readonly"     default:"false"    help:"repo is readonly"`
	Writable    bool   `arg:"--writable"     default:"false"    help:"repo is writable"`
	Favorite    bool   `arg:"--favorite"     default:"false"    help:"forge will always go-clone or git clone this"`
	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"`
}

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 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 DirtyCmd struct {
	Show bool `arg:"--show-files"                         help:"also list every dirty file"`
}

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"`
	User      bool `arg:"--user"                          help:"show repos on the user branch"`
	// ReadOnly  bool `arg:"--readonly"                      help:"include read-only repos"`
}

func (args) Version() string {
	return ARGNAME + " " + VERSION + "    Built on " + BUILDTIME
}

func (a args) Description() string {
	return `
forge -- in the spirit of things like sourceforge

	This supports GO projects so far.
		It will work from ~/go/src or where your go.work file is.
		Since I mostly use ~/go/src, that has been tested more.

Examples:
	forge                                        # opens the GUI
	forge list                                   # show every repo state
	forge dirty                                  # check for dirty git repos
	forge pull                                   # run 'git pull' in every repo
	forge checkout                               # switch git branches

	forge config add --private --path /opt/bob   # add a private repo /opt/bob
	forge config add --directory --writable \
		--gopath 'go.wit.com/user/bob'       # directory contains r/w repos
	forge config add --private --writeable \
		--gopath 'go.wit.com/user/bob/work'  # a GO repo that can not be published

	`
}

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, "")
}