213 lines
9.1 KiB
Go
213 lines
9.1 KiB
Go
// 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:clean" help:"start over at the beginning"`
|
|
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 merge --all # merge all patches to devel & master\n"
|
|
out += "forge pull --force # 'git pull' on all repos\n"
|
|
out += "forge normal # the defaults for 'normal' forge distributed development\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 {
|
|
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:"which repo to look at"`
|
|
}
|
|
|
|
// 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"`
|
|
// Check *EmptyCmd `arg:"subcommand:check" help:"check repo versions"`
|
|
// Dirty *EmptyCmd `arg:"subcommand:dirty" help:"only check dirty repos"`
|
|
// Patches *EmptyCmd `arg:"subcommand:patches" help:"only check repos with patches"`
|
|
}
|
|
|
|
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", "clean", "commit", "config", "gui", "merge", "normal", "patch", "pull", "show"})
|
|
} else {
|
|
pb.SubCommand(pb.Argv...)
|
|
}
|
|
os.Exit(0)
|
|
}
|