add git example
eg: go run git.go git_add.go remote rename old new
diff --git a/examples/git/git.go b/examples/git/git.go
new file mode 100644
index 0000000..00b0965
--- /dev/null
+++ b/examples/git/git.go
@@ -0,0 +1,84 @@
+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("git_branch.go", argv)
+ case "checkout", "clone", "commit", "push", "remote":
+ // subcommand is a script
+ scriptName := fmt.Sprintf("git_%s.go", 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)
+}
diff --git a/examples/git/git_add.go b/examples/git/git_add.go
new file mode 100644
index 0000000..250ac7c
--- /dev/null
+++ b/examples/git/git_add.go
@@ -0,0 +1,30 @@
+package main
+
+import (
+ "fmt"
+ "github.com/docopt/docopt.go"
+)
+
+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
+}
diff --git a/examples/git/git_branch.go b/examples/git/git_branch.go
new file mode 100644
index 0000000..a34220a
--- /dev/null
+++ b/examples/git/git_branch.go
@@ -0,0 +1,38 @@
+package main
+
+import (
+ "fmt"
+ "github.com/docopt/docopt.go"
+)
+
+func main() {
+ usage := `usage: git branch [options] [-r | -a] [--merged=<commit> | --no-merged=<commit>]
+ git branch [options] [-l] [-f] <branchname> [<start-point>]
+ git branch [options] [-r] (-d | -D) <branchname>
+ git branch [options] (-m | -M) [<oldbranch>] <newbranch>
+
+Generic options:
+ -h, --help
+ -v, --verbose show hash and subject, give twice for upstream branch
+ -t, --track set up tracking mode (see git-pull(1))
+ --set-upstream change upstream info
+ --color=<when> use colored output
+ -r act on remote-tracking branches
+ --contains=<commit> print only branches that contain the commit
+ --abbrev=<n> use <n> digits to display SHA-1s
+
+Specific git-branch actions:
+ -a list both remote-tracking and local branches
+ -d delete fully merged branch
+ -D delete branch (even if not merged)
+ -m move/rename a branch and its reflog
+ -M move/rename a branch, even if target exists
+ -l create the branch's reflog
+ -f, --force force creation (when already exists)
+ --no-merged=<commit> print only not merged branches
+ --merged=<commit> print only merged branches
+`
+
+ args, _ := docopt.Parse(usage, nil, true, "", false)
+ fmt.Println(args)
+}
diff --git a/examples/git/git_checkout.go b/examples/git/git_checkout.go
new file mode 100644
index 0000000..4730fd6
--- /dev/null
+++ b/examples/git/git_checkout.go
@@ -0,0 +1,30 @@
+package main
+
+import (
+ "fmt"
+ "github.com/docopt/docopt.go"
+)
+
+func main() {
+ usage := `usage: git checkout [options] <branch>
+ git checkout [options] <branch> -- <file>...
+
+options:
+ -q, --quiet suppress progress reporting
+ -b <branch> create and checkout a new branch
+ -B <branch> create/reset and checkout a branch
+ -l create reflog for new branch
+ -t, --track set upstream info for new branch
+ --orphan <new branch>
+ new unparented branch
+ -2, --ours checkout our version for unmerged files
+ -3, --theirs checkout their version for unmerged files
+ -f, --force force checkout (throw away local modifications)
+ -m, --merge perform a 3-way merge with the new branch
+ --conflict <style> conflict style (merge or diff3)
+ -p, --patch select hunks interactively
+`
+
+ args, _ := docopt.Parse(usage, nil, true, "", false)
+ fmt.Println(args)
+}
diff --git a/examples/git/git_clone.go b/examples/git/git_clone.go
new file mode 100644
index 0000000..fac90b0
--- /dev/null
+++ b/examples/git/git_clone.go
@@ -0,0 +1,37 @@
+package main
+
+import (
+ "fmt"
+ "github.com/docopt/docopt.go"
+)
+
+func main() {
+ usage := `usage: git clone [options] [--] <repo> [<dir>]
+
+options:
+ -v, --verbose be more verbose
+ -q, --quiet be more quiet
+ --progress force progress reporting
+ -n, --no-checkout don't create a checkout
+ --bare create a bare repository
+ --mirror create a mirror repository (implies bare)
+ -l, --local to clone from a local repository
+ --no-hardlinks don't use local hardlinks, always copy
+ -s, --shared setup as shared repository
+ --recursive initialize submodules in the clone
+ --recurse-submodules initialize submodules in the clone
+ --template <template-directory>
+ directory from which templates will be used
+ --reference <repo> reference repository
+ -o, --origin <branch>
+ use <branch> instead of 'origin' to track upstream
+ -b, --branch <branch>
+ checkout <branch> instead of the remote's HEAD
+ -u, --upload-pack <path>
+ path to git-upload-pack on the remote
+ --depth <depth> create a shallow clone of that depth
+`
+
+ args, _ := docopt.Parse(usage, nil, true, "", false)
+ fmt.Println(args)
+}
diff --git a/examples/git/git_push.go b/examples/git/git_push.go
new file mode 100644
index 0000000..bddba2e
--- /dev/null
+++ b/examples/git/git_push.go
@@ -0,0 +1,34 @@
+package main
+
+import (
+ "fmt"
+ "github.com/docopt/docopt.go"
+)
+
+func main() {
+ usage := `usage: git push [options] [<repository> [<refspec>...]]
+
+options:
+ -h, --help
+ -v, --verbose be more verbose
+ -q, --quiet be more quiet
+ --repo <repository> repository
+ --all push all refs
+ --mirror mirror all refs
+ --delete delete refs
+ --tags push tags (can't be used with --all or --mirror)
+ -n, --dry-run dry run
+ --porcelain machine-readable output
+ -f, --force force updates
+ --thin use thin pack
+ --receive-pack <receive-pack>
+ receive pack program
+ --exec <receive-pack>
+ receive pack program
+ -u, --set-upstream set upstream for git pull/status
+ --progress force progress reporting
+`
+
+ args, _ := docopt.Parse(usage, nil, true, "", false)
+ fmt.Println(args)
+}
diff --git a/examples/git/git_remote.go b/examples/git/git_remote.go
new file mode 100644
index 0000000..5ee32ac
--- /dev/null
+++ b/examples/git/git_remote.go
@@ -0,0 +1,28 @@
+package main
+
+import (
+ "fmt"
+ "github.com/docopt/docopt.go"
+)
+
+func main() {
+ usage := `usage: git remote [-v | --verbose]
+ git remote add [-t <branch>] [-m <master>] [-f] [--mirror] <name> <url>
+ git remote rename <old> <new>
+ git remote rm <name>
+ git remote set-head <name> (-a | -d | <branch>)
+ git remote [-v | --verbose] show [-n] <name>
+ git remote prune [-n | --dry-run] <name>
+ git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]
+ git remote set-branches <name> [--add] <branch>...
+ git remote set-url <name> <newurl> [<oldurl>]
+ git remote set-url --add <name> <newurl>
+ git remote set-url --delete <name> <url>
+
+options:
+ -v, --verbose be verbose; must be placed before a subcommand
+`
+
+ args, _ := docopt.Parse(usage, nil, true, "", false)
+ fmt.Println(args)
+}