aboutsummaryrefslogtreecommitdiffstats
path: root/cli
diff options
context:
space:
mode:
authorSantiago M. Mola <santi@mola.io>2017-01-04 11:18:41 +0100
committerGitHub <noreply@github.com>2017-01-04 11:18:41 +0100
commit841abfb7dc640755c443432064252907e3e55c95 (patch)
tree8af69dcd3b301a10a3e493e2cd805cdec6dcaecd /cli
parent90d67bb648ae32d5b1a0f7b1af011da6dfb24315 (diff)
downloadgo-git-841abfb7dc640755c443432064252907e3e55c95.tar.gz
server: add git server implementation (#190)
* server: add generic server implementation (transport-independent), both for git-upload-pack and git-receive-pack. * server: move internal functions to internal/common. * cli: add git-receive-pack and git-upload-pack implementations. * format/packfile: add UpdateObjectStorage function, extracted from Remote. * transport: implement tranport RPC-like, only with git-upload-pack and git-receive-pack methods. Client renamed to Transport. * storer: add storer.Storer interface. * protocol/packp: add UploadPackResponse constructor with packfile. * protocol/packp: fix UploadPackResponse encoding, add tests. * protocol/packp/capability: implement All.
Diffstat (limited to 'cli')
-rw-r--r--cli/go-git/main.go41
-rw-r--r--cli/go-git/receive_pack.go36
-rw-r--r--cli/go-git/upload_pack.go37
-rw-r--r--cli/go-git/version.go14
4 files changed, 128 insertions, 0 deletions
diff --git a/cli/go-git/main.go b/cli/go-git/main.go
new file mode 100644
index 0000000..97b8c3e
--- /dev/null
+++ b/cli/go-git/main.go
@@ -0,0 +1,41 @@
+package main
+
+import (
+ "os"
+ "path/filepath"
+
+ "github.com/jessevdk/go-flags"
+)
+
+const (
+ bin = "go-git"
+ receivePackBin = "git-receive-pack"
+ uploadPackBin = "git-upload-pack"
+)
+
+func main() {
+ switch filepath.Base(os.Args[0]) {
+ case receivePackBin:
+ os.Args = append([]string{"git", "receive-pack"}, os.Args[1:]...)
+ case uploadPackBin:
+ os.Args = append([]string{"git", "upload-pack"}, os.Args[1:]...)
+ }
+
+ parser := flags.NewNamedParser(bin, flags.Default)
+ parser.AddCommand("receive-pack", "", "", &CmdReceivePack{})
+ parser.AddCommand("upload-pack", "", "", &CmdUploadPack{})
+ parser.AddCommand("version", "Show the version information.", "", &CmdVersion{})
+
+ _, err := parser.Parse()
+ if err != nil {
+ if e, ok := err.(*flags.Error); ok && e.Type == flags.ErrCommandRequired {
+ parser.WriteHelp(os.Stdout)
+ }
+
+ os.Exit(1)
+ }
+}
+
+type cmd struct {
+ Verbose bool `short:"v" description:"Activates the verbose mode"`
+}
diff --git a/cli/go-git/receive_pack.go b/cli/go-git/receive_pack.go
new file mode 100644
index 0000000..0f96a28
--- /dev/null
+++ b/cli/go-git/receive_pack.go
@@ -0,0 +1,36 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+
+ "gopkg.in/src-d/go-git.v4/plumbing/transport/file"
+)
+
+type CmdReceivePack struct {
+ cmd
+
+ Args struct {
+ GitDir string `positional-arg-name:"git-dir" required:"true"`
+ } `positional-args:"yes"`
+}
+
+func (CmdReceivePack) Usage() string {
+ //TODO: git-receive-pack returns error code 129 if arguments are invalid.
+ return fmt.Sprintf("usage: %s <git-dir>", os.Args[0])
+}
+
+func (c *CmdReceivePack) Execute(args []string) error {
+ gitDir, err := filepath.Abs(c.Args.GitDir)
+ if err != nil {
+ return err
+ }
+
+ if err := file.ServeReceivePack(gitDir); err != nil {
+ fmt.Fprintln(os.Stderr, "ERR:", err)
+ os.Exit(128)
+ }
+
+ return nil
+}
diff --git a/cli/go-git/upload_pack.go b/cli/go-git/upload_pack.go
new file mode 100644
index 0000000..c45fe48
--- /dev/null
+++ b/cli/go-git/upload_pack.go
@@ -0,0 +1,37 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+
+ "gopkg.in/src-d/go-git.v4/plumbing/transport/file"
+)
+
+//TODO: usage: git upload-pack [--strict] [--timeout=<n>] <dir>
+type CmdUploadPack struct {
+ cmd
+
+ Args struct {
+ GitDir string `positional-arg-name:"git-dir" required:"true"`
+ } `positional-args:"yes"`
+}
+
+func (CmdUploadPack) Usage() string {
+ //TODO: git-upload-pack returns error code 129 if arguments are invalid.
+ return fmt.Sprintf("usage: %s <git-dir>", os.Args[0])
+}
+
+func (c *CmdUploadPack) Execute(args []string) error {
+ gitDir, err := filepath.Abs(c.Args.GitDir)
+ if err != nil {
+ return err
+ }
+
+ if err := file.ServeUploadPack(gitDir); err != nil {
+ fmt.Fprintln(os.Stderr, "ERR:", err)
+ os.Exit(128)
+ }
+
+ return nil
+}
diff --git a/cli/go-git/version.go b/cli/go-git/version.go
new file mode 100644
index 0000000..b0e773d
--- /dev/null
+++ b/cli/go-git/version.go
@@ -0,0 +1,14 @@
+package main
+
+import "fmt"
+
+var version string
+var build string
+
+type CmdVersion struct{}
+
+func (c *CmdVersion) Execute(args []string) error {
+ fmt.Printf("%s (%s) - build %s\n", bin, version, build)
+
+ return nil
+}