diff options
author | Santiago M. Mola <santi@mola.io> | 2017-01-04 11:18:41 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-01-04 11:18:41 +0100 |
commit | 841abfb7dc640755c443432064252907e3e55c95 (patch) | |
tree | 8af69dcd3b301a10a3e493e2cd805cdec6dcaecd /cli | |
parent | 90d67bb648ae32d5b1a0f7b1af011da6dfb24315 (diff) | |
download | go-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.go | 41 | ||||
-rw-r--r-- | cli/go-git/receive_pack.go | 36 | ||||
-rw-r--r-- | cli/go-git/upload_pack.go | 37 | ||||
-rw-r--r-- | cli/go-git/version.go | 14 |
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 +} |