git-lfs/commands/commands.go

108 lines
1.9 KiB
Go
Raw Normal View History

package commands
import (
"flag"
"github.com/github/git-media/gitmedia"
"os"
"os/exec"
2013-09-27 14:39:45 +00:00
"path/filepath"
)
2013-09-23 01:08:31 +00:00
var commands = make(map[string]func(*Command) RunnableCommand)
2013-09-23 00:39:26 +00:00
func Run() {
2013-09-23 05:42:16 +00:00
runcmd := true
2013-09-23 05:57:21 +00:00
subname := SubCommand(1)
2013-09-23 05:42:16 +00:00
2013-09-23 05:57:21 +00:00
if subname == "help" {
2013-09-23 05:42:16 +00:00
runcmd = false
2013-09-23 05:57:21 +00:00
subname = SubCommand(2)
2013-09-23 05:42:16 +00:00
}
2013-09-23 01:08:31 +00:00
2013-09-23 05:57:21 +00:00
cmd := NewCommand(filepath.Base(os.Args[0]), subname)
cmdcb, ok := commands[subname]
2013-09-23 00:39:26 +00:00
if ok {
2013-09-23 05:57:21 +00:00
subcmd := cmdcb(cmd)
subcmd.Setup()
2013-09-23 05:42:16 +00:00
if runcmd {
2013-09-23 05:57:21 +00:00
subcmd.Parse()
subcmd.Run()
2013-09-23 05:42:16 +00:00
} else {
2013-09-23 05:57:21 +00:00
subcmd.Usage()
2013-09-23 05:42:16 +00:00
}
2013-09-23 00:39:26 +00:00
} else {
2013-09-23 05:57:21 +00:00
missingCommand(cmd, subname)
2013-09-23 00:39:26 +00:00
}
}
2013-09-23 05:42:16 +00:00
func SubCommand(pos int) string {
if len(os.Args) < (pos + 1) {
return "version"
} else {
2013-09-23 05:42:16 +00:00
return os.Args[pos]
}
}
2013-09-23 05:57:21 +00:00
func NewCommand(name, subname string) *Command {
var args []string
if len(os.Args) > 1 {
args = os.Args[2:]
}
2013-12-05 23:39:10 +00:00
fs := flag.NewFlagSet(os.Args[0], flag.ExitOnError)
gitmedia.SetupDebugging(fs)
fs.SetOutput(gitmedia.ErrorWriter)
2013-12-05 23:39:10 +00:00
return &Command{name, subname, fs, args, args}
2013-09-23 01:08:31 +00:00
}
func PipeMediaCommand(name string, args ...string) error {
return PipeCommand("bin/"+name, args...)
}
func PipeCommand(name string, args ...string) error {
cmd := exec.Command(name, args...)
cmd.Stdin = os.Stdin
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
return cmd.Run()
}
2013-09-23 01:08:31 +00:00
type RunnableCommand interface {
Setup()
Parse()
Run()
2013-09-23 05:42:16 +00:00
Usage()
}
type Command struct {
Name string
SubCommand string
FlagSet *flag.FlagSet
Args []string
SubCommands []string
}
2013-09-23 05:42:16 +00:00
func (c *Command) Usage() {
gitmedia.Print("usage: %s %s", c.Name, c.SubCommand)
2013-09-23 05:42:16 +00:00
c.FlagSet.PrintDefaults()
}
2013-09-23 01:08:31 +00:00
func (c *Command) Parse() {
c.FlagSet.Parse(c.Args)
c.SubCommands = c.FlagSet.Args()
}
2013-09-23 01:08:31 +00:00
func (c *Command) Setup() {}
2013-09-27 14:39:45 +00:00
func (c *Command) Run() {}
2013-09-23 01:08:31 +00:00
func registerCommand(name string, cmdcb func(*Command) RunnableCommand) {
commands[name] = cmdcb
}
2013-09-23 05:57:21 +00:00
func missingCommand(cmd *Command, subname string) {
gitmedia.Error("%s: '%s' is not a %s command. See %s help.",
2013-09-23 05:57:21 +00:00
cmd.Name, subname, cmd.Name, cmd.Name)
}