mirror of
https://gitee.com/IrisVega/frp.git
synced 2024-11-01 22:31:29 +08:00
109 lines
3.0 KiB
Go
109 lines
3.0 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/docopt/docopt-go"
|
|
"os"
|
|
"os/exec"
|
|
)
|
|
|
|
func main() {
|
|
usage := `usage: git [--version] [--exec-path=<path>] [--html-path]
|
|
[-p|--paginate|--no-pager] [--no-replace-objects]
|
|
[--bare] [--git-dir=<path>] [--work-tree=<path>]
|
|
[-c <name>=<value>] [--help]
|
|
<command> [<args>...]
|
|
|
|
options:
|
|
-c <name=value>
|
|
-h, --help
|
|
-p, --paginate
|
|
|
|
The most commonly used git commands are:
|
|
add Add file contents to the index
|
|
branch List, create, or delete branches
|
|
checkout Checkout a branch or paths to the working tree
|
|
clone Clone a repository into a new directory
|
|
commit Record changes to the repository
|
|
push Update remote refs along with associated objects
|
|
remote Manage set of tracked repositories
|
|
|
|
See 'git help <command>' for more information on a specific command.
|
|
`
|
|
args, _ := docopt.Parse(usage, nil, true, "git version 1.7.4.4", true)
|
|
|
|
fmt.Println("global arguments:")
|
|
fmt.Println(args)
|
|
|
|
fmt.Println("command arguments:")
|
|
cmd := args["<command>"].(string)
|
|
cmdArgs := args["<args>"].([]string)
|
|
|
|
err := runCommand(cmd, cmdArgs)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
func goRun(scriptName string, args []string) (err error) {
|
|
cmdArgs := make([]string, 2)
|
|
cmdArgs[0] = "run"
|
|
cmdArgs[1] = scriptName
|
|
cmdArgs = append(cmdArgs, args...)
|
|
osCmd := exec.Command("go", cmdArgs...)
|
|
var out []byte
|
|
out, err = osCmd.Output()
|
|
fmt.Println(string(out))
|
|
if err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
func runCommand(cmd string, args []string) (err error) {
|
|
argv := make([]string, 1)
|
|
argv[0] = cmd
|
|
argv = append(argv, args...)
|
|
switch cmd {
|
|
case "add":
|
|
// subcommand is a function call
|
|
return cmdAdd(argv)
|
|
case "branch":
|
|
// subcommand is a script
|
|
return goRun("branch/git_branch.go", argv)
|
|
case "checkout", "clone", "commit", "push", "remote":
|
|
// subcommand is a script
|
|
scriptName := fmt.Sprintf("%s/git_%s.go", cmd, cmd)
|
|
return goRun(scriptName, argv)
|
|
case "help", "":
|
|
return goRun("git.go", []string{"git_add.go", "--help"})
|
|
}
|
|
|
|
return fmt.Errorf("%s is not a git command. See 'git help'", cmd)
|
|
}
|
|
|
|
func cmdAdd(argv []string) (err error) {
|
|
usage := `usage: git add [options] [--] [<filepattern>...]
|
|
|
|
options:
|
|
-h, --help
|
|
-n, --dry-run dry run
|
|
-v, --verbose be verbose
|
|
-i, --interactive interactive picking
|
|
-p, --patch select hunks interactively
|
|
-e, --edit edit current diff and apply
|
|
-f, --force allow adding otherwise ignored files
|
|
-u, --update update tracked files
|
|
-N, --intent-to-add record only the fact that the path will be added later
|
|
-A, --all add all, noticing removal of tracked files
|
|
--refresh don't add, only refresh the index
|
|
--ignore-errors just skip files which cannot be added because of errors
|
|
--ignore-missing check if - even missing - files are ignored in dry run
|
|
`
|
|
|
|
args, _ := docopt.Parse(usage, nil, true, "", false)
|
|
fmt.Println(args)
|
|
return
|
|
}
|