ref(server): move command middleware to its own dir

Ayman Bagabas created

Change summary

server/cmd/middleware.go      | 13 ++++++-------
server/cmd/middleware_test.go |  4 ++--
server/server.go              | 30 ++++++------------------------
3 files changed, 14 insertions(+), 33 deletions(-)

Detailed changes

server/middleware.go → server/cmd/middleware.go 🔗

@@ -1,17 +1,16 @@
-package server
+package cmd
 
 import (
 	"context"
 	"fmt"
 
 	appCfg "github.com/charmbracelet/soft-serve/config"
-	"github.com/charmbracelet/soft-serve/server/cmd"
 	"github.com/charmbracelet/wish"
 	"github.com/gliderlabs/ssh"
 )
 
-// softMiddleware is the Soft Serve middleware that handles SSH commands.
-func softMiddleware(ac *appCfg.Config) wish.Middleware {
+// Middleware is the Soft Serve middleware that handles SSH commands.
+func Middleware(ac *appCfg.Config) wish.Middleware {
 	return func(sh ssh.Handler) ssh.Handler {
 		return func(s ssh.Session) {
 			func() {
@@ -19,8 +18,8 @@ func softMiddleware(ac *appCfg.Config) wish.Middleware {
 				if active {
 					return
 				}
-				ctx := context.WithValue(s.Context(), cmd.ConfigCtxKey, ac)
-				ctx = context.WithValue(ctx, cmd.SessionCtxKey, s)
+				ctx := context.WithValue(s.Context(), ConfigCtxKey, ac)
+				ctx = context.WithValue(ctx, SessionCtxKey, s)
 
 				use := "ssh"
 				port := ac.Port
@@ -28,7 +27,7 @@ func softMiddleware(ac *appCfg.Config) wish.Middleware {
 					use += fmt.Sprintf(" -p%d", port)
 				}
 				use += fmt.Sprintf(" %s", ac.Host)
-				cmd := cmd.RootCommand()
+				cmd := RootCommand()
 				cmd.Use = use
 				cmd.CompletionOptions.DisableDefaultCmd = true
 				cmd.SetIn(s)

server/middleware_test.go → server/cmd/middleware_test.go 🔗

@@ -1,4 +1,4 @@
-package server
+package cmd
 
 import (
 	"os"
@@ -26,7 +26,7 @@ func TestMiddleware(t *testing.T) {
 	})
 	is.NoErr(err)
 	_ = testsession.New(t, &ssh.Server{
-		Handler: softMiddleware(appCfg)(func(s ssh.Session) {
+		Handler: Middleware(appCfg)(func(s ssh.Session) {
 			t.Run("TestCatConfig", func(t *testing.T) {
 				_, err := s.Write([]byte("cat config/config.json"))
 				if err == nil {

server/server.go 🔗

@@ -5,10 +5,9 @@ import (
 	"fmt"
 	"log"
 	"net"
-	"path/filepath"
-	"strings"
 
 	appCfg "github.com/charmbracelet/soft-serve/config"
+	cm "github.com/charmbracelet/soft-serve/server/cmd"
 	"github.com/charmbracelet/soft-serve/server/config"
 	gm "github.com/charmbracelet/soft-serve/server/git"
 	"github.com/charmbracelet/wish"
@@ -39,30 +38,13 @@ func NewServer(cfg *config.Config) *Server {
 	mw := []wish.Middleware{
 		rm.MiddlewareWithLogger(
 			cfg.ErrorLog,
-			softMiddleware(ac),
+			// BubbleTea middleware.
 			bm.MiddlewareWithProgramHandler(SessionHandler(ac), termenv.ANSI256),
+			// Command middleware must come after the git middleware.
+			cm.Middleware(ac),
+			// Git middleware.
 			gm.Middleware(cfg.RepoPath, ac),
-			// Note: disable pushing to subdirectories as it can create
-			// conflicts with existing repos. This only affects the git
-			// middleware.
-			//
-			// This is related to
-			// https://github.com/charmbracelet/soft-serve/issues/120
-			// https://github.com/charmbracelet/wish/commit/8808de520d3ea21931f13113c6b0b6d0141272d4
-			func(sh ssh.Handler) ssh.Handler {
-				return func(s ssh.Session) {
-					cmds := s.Command()
-					if len(cmds) == 2 && strings.HasPrefix(cmds[0], "git") {
-						repo := strings.TrimSuffix(strings.TrimPrefix(cmds[1], "/"), "/")
-						repo = filepath.Clean(repo)
-						if n := strings.Count(repo, "/"); n != 0 {
-							wish.Fatalln(s, fmt.Errorf("invalid repo path: subdirectories not allowed"))
-							return
-						}
-					}
-					sh(s)
-				}
-			},
+			// Logging middleware must be last to be executed first.
 			lm.Middleware(),
 		),
 	}