move commands to ssh/commands
--- a/commands/commands.go Mon Sep 09 22:58:35 2019 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
- "github.com/alecthomas/kong"
- "github.com/kballard/go-shellquote"
- "golang.org/x/crypto/ssh"
- Repo string `kong:"flag,short='R'"`
- Stdio bool `kong:"flag,name='stdio'"`
- Repo string `kong:"arg"`
-type Command interface {
- Run(conn ssh.Channel, serverConn *ssh.ServerConn, username string, req *ssh.Request) error
-func parse(cmd string) (cli, string, error) {
- args, err := shellquote.Split(cmd)
- parser := kong.Must(&values)
- ctx, err := parser.Parse(args)
- return values, ctx.Command(), nil
-func Find(cmd, reposPath string) (Command, error) {
- values, pcmd, err := parse(cmd)
- return NewServe(reposPath, values.Hg.Repo), nil
- return NewInit(reposPath, values.Hg.Init.Repo), nil
- return nil, fmt.Errorf("unknown command %s", cmd)
--- a/commands/commands_test.go Mon Sep 09 22:58:35 2019 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
- "github.com/stretchr/testify/assert"
-func TestRepoFromCommand(t *testing.T) {
- assert := assert.New(t)
- "hg -R foo serve --stdio",
- NewServe("repos", "foo"),
- "hg -R foo/bar serve --stdio",
- NewServe("repos", "foo/bar"),
- for _, testCase := range cases {
- cmd, err := Find(testCase.input, "repos")
- assert.Equal(cmd, testCase.expected)
--- a/commands/init.go Mon Sep 09 22:58:35 2019 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
- "golang.org/x/crypto/ssh"
- "bitbucket.org/rw_grim/hgkeeper/access"
- "bitbucket.org/rw_grim/hgkeeper/hg"
-func NewInit(reposPath, repoName string) *Init {
- repoPath: filepath.Join(reposPath, repoName),
-func (i *Init) Run(conn ssh.Channel, serverConn *ssh.ServerConn, username string, req *ssh.Request) error {
- if !access.CanInit(username, "/"+i.repoName) {
- return fmt.Errorf("access denied")
- return run(hg.Init(i.repoPath), conn, serverConn, req)
-func (i *Init) String() string {
--- a/commands/run.go Mon Sep 09 22:58:35 2019 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
- log "github.com/sirupsen/logrus"
- "golang.org/x/crypto/ssh"
-func run(cmd *exec.Cmd, conn ssh.Channel, serverConn *ssh.ServerConn, req *ssh.Request) error {
- if err := cmd.Wait(); err != nil {
- "%s command %q failed: %v",
- serverConn.RemoteAddr(),
- strings.Join(cmd.Args, " "),
- "%s command %s finished",
- serverConn.RemoteAddr(),
- strings.Join(cmd.Args, " "),
- stdinWriter, err := cmd.StdinPipe()
- stdoutReader, err := cmd.StdoutPipe()
- stderrReader, err := cmd.StderrPipe()
- // now wire up stdin/stdout/stderr
- io.Copy(stdinWriter, conn)
- io.Copy(conn, stdoutReader)
- io.Copy(conn.Stderr(), stderrReader)
- if err := cmd.Start(); err != nil {
--- a/commands/serve.go Mon Sep 09 22:58:35 2019 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
- "golang.org/x/crypto/ssh"
- "bitbucket.org/rw_grim/hgkeeper/access"
- "bitbucket.org/rw_grim/hgkeeper/hg"
-func NewServe(reposPath, repoName string) *Serve {
- repoPath: filepath.Join(reposPath, repoName),
-func (s *Serve) Run(conn ssh.Channel, serverConn *ssh.ServerConn, username string, req *ssh.Request) error {
- if !access.CanRead(username, "/"+s.repoName) {
- return fmt.Errorf("repository %q not found", s.repoName)
- writeable := access.CanWrite(username, "/"+s.repoName)
- return run(hg.Serve(s.repoPath, writeable), conn, serverConn, req)
-func (s *Serve) String() string {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ssh/commands/commands.go Mon Sep 09 23:11:01 2019 -0500
@@ -0,0 +1,60 @@
+ "github.com/alecthomas/kong" + "github.com/kballard/go-shellquote" + "golang.org/x/crypto/ssh" + Repo string `kong:"flag,short='R'"` + Stdio bool `kong:"flag,name='stdio'"` + Repo string `kong:"arg"` +type Command interface { + Run(conn ssh.Channel, serverConn *ssh.ServerConn, username string, req *ssh.Request) error +func parse(cmd string) (cli, string, error) { + args, err := shellquote.Split(cmd) + parser := kong.Must(&values) + ctx, err := parser.Parse(args) + return values, ctx.Command(), nil +func Find(cmd, reposPath string) (Command, error) { + values, pcmd, err := parse(cmd) + return NewServe(reposPath, values.Hg.Repo), nil + return NewInit(reposPath, values.Hg.Init.Repo), nil + return nil, fmt.Errorf("unknown command %s", cmd) --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ssh/commands/commands_test.go Mon Sep 09 23:11:01 2019 -0500
@@ -0,0 +1,39 @@
+ "github.com/stretchr/testify/assert" +func TestRepoFromCommand(t *testing.T) { + assert := assert.New(t) + "hg -R foo serve --stdio", + NewServe("repos", "foo"), + "hg -R foo/bar serve --stdio", + NewServe("repos", "foo/bar"), + for _, testCase := range cases { + cmd, err := Find(testCase.input, "repos") + assert.Equal(cmd, testCase.expected) --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ssh/commands/init.go Mon Sep 09 23:11:01 2019 -0500
@@ -0,0 +1,35 @@
+ "golang.org/x/crypto/ssh" + "bitbucket.org/rw_grim/hgkeeper/access" + "bitbucket.org/rw_grim/hgkeeper/hg" +func NewInit(reposPath, repoName string) *Init { + repoPath: filepath.Join(reposPath, repoName), +func (i *Init) Run(conn ssh.Channel, serverConn *ssh.ServerConn, username string, req *ssh.Request) error { + if !access.CanInit(username, "/"+i.repoName) { + return fmt.Errorf("access denied") + return run(hg.Init(i.repoPath), conn, serverConn, req) +func (i *Init) String() string { --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ssh/commands/run.go Mon Sep 09 23:11:01 2019 -0500
@@ -0,0 +1,78 @@
+ log "github.com/sirupsen/logrus" + "golang.org/x/crypto/ssh" +func run(cmd *exec.Cmd, conn ssh.Channel, serverConn *ssh.ServerConn, req *ssh.Request) error { + if err := cmd.Wait(); err != nil { + "%s command %q failed: %v", + serverConn.RemoteAddr(), + strings.Join(cmd.Args, " "), + "%s command %s finished", + serverConn.RemoteAddr(), + strings.Join(cmd.Args, " "), + stdinWriter, err := cmd.StdinPipe() + stdoutReader, err := cmd.StdoutPipe() + stderrReader, err := cmd.StderrPipe() + // now wire up stdin/stdout/stderr + io.Copy(stdinWriter, conn) + io.Copy(conn, stdoutReader) + io.Copy(conn.Stderr(), stderrReader) + if err := cmd.Start(); err != nil { --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ssh/commands/serve.go Mon Sep 09 23:11:01 2019 -0500
@@ -0,0 +1,37 @@
+ "golang.org/x/crypto/ssh" + "bitbucket.org/rw_grim/hgkeeper/access" + "bitbucket.org/rw_grim/hgkeeper/hg" +func NewServe(reposPath, repoName string) *Serve { + repoPath: filepath.Join(reposPath, repoName), +func (s *Serve) Run(conn ssh.Channel, serverConn *ssh.ServerConn, username string, req *ssh.Request) error { + if !access.CanRead(username, "/"+s.repoName) { + return fmt.Errorf("repository %q not found", s.repoName) + writeable := access.CanWrite(username, "/"+s.repoName) + return run(hg.Serve(s.repoPath, writeable), conn, serverConn, req) +func (s *Serve) String() string { --- a/ssh/server.go Mon Sep 09 22:58:35 2019 -0500
+++ b/ssh/server.go Mon Sep 09 23:11:01 2019 -0500
@@ -8,7 +8,7 @@
"golang.org/x/crypto/ssh"
"bitbucket.org/rw_grim/hgkeeper/access"
- "bitbucket.org/rw_grim/hgkeeper/commands"
+ "bitbucket.org/rw_grim/hgkeeper/ssh/commands"