Skip to content

Commit

Permalink
refactor: tidy up files and use middlewares
Browse files Browse the repository at this point in the history
  • Loading branch information
aymanbagabas committed Jul 13, 2023
1 parent 03380fe commit ca51947
Show file tree
Hide file tree
Showing 43 changed files with 532 additions and 443 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ require (
require (
github.com/caarlos0/env/v8 v8.0.0
github.com/charmbracelet/keygen v0.4.3
github.com/charmbracelet/log v0.2.2
github.com/charmbracelet/log v0.2.3-0.20230713155356-557335e40e35
github.com/charmbracelet/ssh v0.0.0-20230712221603-7e03c5063afc
github.com/gobwas/glob v0.2.3
github.com/gogs/git-module v1.8.2
Expand Down
6 changes: 3 additions & 3 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ github.com/charmbracelet/keygen v0.4.3 h1:ywOZRwkDlpmkawl0BgLTxaYWDSqp6Y4nfVVmgy
github.com/charmbracelet/keygen v0.4.3/go.mod h1:4e4FT3HSdLU/u83RfJWvzJIaVb8aX4MxtDlfXwpDJaI=
github.com/charmbracelet/lipgloss v0.7.1 h1:17WMwi7N1b1rVWOjMT+rCh7sQkvDU75B2hbZpc5Kc1E=
github.com/charmbracelet/lipgloss v0.7.1/go.mod h1:yG0k3giv8Qj8edTCbbg6AlQ5e8KNWpFujkNawKNhE2c=
github.com/charmbracelet/log v0.2.2 h1:CaXgos+ikGn5tcws5Cw3paQuk9e/8bIwuYGhnkqQFjo=
github.com/charmbracelet/log v0.2.2/go.mod h1:Zs11hKpb8l+UyX4y1srwZIGW+MPCXJHIty3MB9l/sno=
github.com/charmbracelet/log v0.2.3-0.20230713155356-557335e40e35 h1:VXEaJ1iM2L5N8T2WVbv4y631pzCD3O9s75dONqK+87g=
github.com/charmbracelet/log v0.2.3-0.20230713155356-557335e40e35/go.mod h1:ZApwwzDbbETVTIRTk7724yQRJAXIktt98yGVMMaa3y8=
github.com/charmbracelet/ssh v0.0.0-20230712221603-7e03c5063afc h1:JUm+5HigAM5utFiThwIDX9iU0BaheKpuNVr+umi3sFg=
github.com/charmbracelet/ssh v0.0.0-20230712221603-7e03c5063afc/go.mod h1:F1vgddWsb/Yr/OZilFeRZEh5sE/qU0Dt1mKkmke6Zvg=
github.com/charmbracelet/wish v1.1.1 h1:KdICASKd2oh2JPvk1Z4CJtAi97cFErXF7NKienPICO4=
Expand Down Expand Up @@ -161,7 +161,7 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.5.2 h1:ALmeCk/px5FSm1MAcFBAsVKZjDuMVj8Tm7FFIlMJnqU=
github.com/yuin/goldmark v1.5.2/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
Expand Down
7 changes: 4 additions & 3 deletions server/backend/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ package backend

import "context"

var contextKey = &struct{ string }{"backend"}
// ContextKey is the key for the backend in the context.
var ContextKey = &struct{ string }{"backend"}

// FromContext returns the backend from a context.
func FromContext(ctx context.Context) *Backend {
if b, ok := ctx.Value(contextKey).(*Backend); ok {
if b, ok := ctx.Value(ContextKey).(*Backend); ok {
return b
}

Expand All @@ -15,5 +16,5 @@ func FromContext(ctx context.Context) *Backend {

// WithContext returns a new context with the backend attached.
func WithContext(ctx context.Context, b *Backend) context.Context {
return context.WithValue(ctx, contextKey, b)
return context.WithValue(ctx, ContextKey, b)
}
7 changes: 4 additions & 3 deletions server/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -371,16 +371,17 @@ func (c *Config) AdminKeys() []ssh.PublicKey {
return parseAuthKeys(c.InitialAdminKeys)
}

var configCtxKey = struct{ string }{"config"}
// ContextKey is the context key for the config.
var ContextKey = struct{ string }{"config"}

// WithContext returns a new context with the configuration attached.
func WithContext(ctx context.Context, cfg *Config) context.Context {
return context.WithValue(ctx, configCtxKey, cfg)
return context.WithValue(ctx, ContextKey, cfg)
}

// FromContext returns the configuration from the context.
func FromContext(ctx context.Context) *Config {
if c, ok := ctx.Value(configCtxKey).(*Config); ok {
if c, ok := ctx.Value(ContextKey).(*Config); ok {
return c
}

Expand Down
13 changes: 10 additions & 3 deletions server/git/git.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,22 @@ var (
)

// WritePktline encodes and writes a pktline to the given writer.
func WritePktline(w io.Writer, v ...interface{}) {
func WritePktline(w io.Writer, v ...interface{}) error {
msg := fmt.Sprintln(v...)
pkt := pktline.NewEncoder(w)
if err := pkt.EncodeString(msg); err != nil {
log.Debugf("git: error writing pkt-line message: %s", err)
return fmt.Errorf("git: error writing pkt-line message: %w", err)
}
if err := pkt.Flush(); err != nil {
log.Debugf("git: error flushing pkt-line message: %s", err)
return fmt.Errorf("git: error flushing pkt-line message: %w", err)
}

return nil
}

// WritePktlineErr writes an error pktline to the given writer.
func WritePktlineErr(w io.Writer, err error) error {
return WritePktline(w, "ERR ", err.Error())
}

// EnsureWithin ensures the given repo is within the repos directory.
Expand Down
57 changes: 20 additions & 37 deletions server/git/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,45 +97,47 @@ func gitServiceHandler(ctx context.Context, svc Service, scmd ServiceCommand) er

log.Debugf("git service command in %q: %s", cmd.Dir, cmd.String())
if err := cmd.Start(); err != nil {
if errors.Is(err, os.ErrNotExist) {
return ErrInvalidRepo
}
return err
}

errg, ctx := errgroup.WithContext(ctx)
errg, _ := errgroup.WithContext(ctx)

// stdin
if scmd.Stdin != nil {
errg.Go(func() error {
if scmd.StdinHandler != nil {
return scmd.StdinHandler(scmd.Stdin, stdin)
} else {
return defaultStdinHandler(scmd.Stdin, stdin)
}
defer stdin.Close() // nolint: errcheck
_, err := io.Copy(stdin, scmd.Stdin)
return err
})
}

// stdout
if scmd.Stdout != nil {
errg.Go(func() error {
if scmd.StdoutHandler != nil {
return scmd.StdoutHandler(scmd.Stdout, stdout)
} else {
return defaultStdoutHandler(scmd.Stdout, stdout)
}
_, err := io.Copy(scmd.Stdout, stdout)
return err
})
}

// stderr
if scmd.Stderr != nil {
errg.Go(func() error {
if scmd.StderrHandler != nil {
return scmd.StderrHandler(scmd.Stderr, stderr)
} else {
return defaultStderrHandler(scmd.Stderr, stderr)
}
_, erro := io.Copy(scmd.Stderr, stderr)
return erro
})
}

return errors.Join(errg.Wait(), cmd.Wait())
err = errors.Join(errg.Wait(), cmd.Wait())
if err != nil && errors.Is(err, os.ErrNotExist) {
return ErrInvalidRepo
} else if err != nil {
return err
}

return nil
}

// ServiceCommand is used to run a git service command.
Expand All @@ -148,26 +150,7 @@ type ServiceCommand struct {
Args []string

// Modifier functions
CmdFunc func(*exec.Cmd)
StdinHandler func(io.Reader, io.WriteCloser) error
StdoutHandler func(io.Writer, io.ReadCloser) error
StderrHandler func(io.Writer, io.ReadCloser) error
}

func defaultStdinHandler(in io.Reader, stdin io.WriteCloser) error {
defer stdin.Close() // nolint: errcheck
_, err := io.Copy(stdin, in)
return err
}

func defaultStdoutHandler(out io.Writer, stdout io.ReadCloser) error {
_, err := io.Copy(out, stdout)
return err
}

func defaultStderrHandler(err io.Writer, stderr io.ReadCloser) error {
_, erro := io.Copy(err, stderr)
return erro
CmdFunc func(*exec.Cmd)
}

// UploadPack runs the git upload-pack protocol against the provided repo.
Expand Down
17 changes: 17 additions & 0 deletions server/ssh/cmd.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package ssh

import (
"github.com/charmbracelet/log"
"github.com/charmbracelet/soft-serve/server/ssh/cmd"
"github.com/charmbracelet/ssh"
)

func handleCli(s ssh.Session) {
ctx := s.Context()
logger := log.FromContext(ctx)
rootCmd := cmd.RootCommand(s)
if err := rootCmd.ExecuteContext(ctx); err != nil {
logger.Error("error executing command", "err", err)
_ = s.Exit(1)
}
}
3 changes: 2 additions & 1 deletion server/cmd/blob.go → server/ssh/cmd/blob.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
gansi "github.com/charmbracelet/glamour/ansi"
"github.com/charmbracelet/lipgloss"
"github.com/charmbracelet/soft-serve/git"
"github.com/charmbracelet/soft-serve/server/backend"
"github.com/charmbracelet/soft-serve/server/ui/common"
"github.com/muesli/termenv"
"github.com/spf13/cobra"
Expand Down Expand Up @@ -35,7 +36,7 @@ func blobCommand() *cobra.Command {
PersistentPreRunE: checkIfReadable,
RunE: func(cmd *cobra.Command, args []string) error {
ctx := cmd.Context()
_, be, _ := fromContext(cmd)
be := backend.FromContext(ctx)
rn := args[0]
ref := ""
fp := ""
Expand Down
7 changes: 4 additions & 3 deletions server/cmd/branch.go → server/ssh/cmd/branch.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"strings"

"github.com/charmbracelet/soft-serve/git"
"github.com/charmbracelet/soft-serve/server/backend"
gitm "github.com/gogs/git-module"
"github.com/spf13/cobra"
)
Expand Down Expand Up @@ -32,7 +33,7 @@ func branchListCommand() *cobra.Command {
PersistentPreRunE: checkIfReadable,
RunE: func(cmd *cobra.Command, args []string) error {
ctx := cmd.Context()
_, be, _ := fromContext(cmd)
be := backend.FromContext(ctx)
rn := strings.TrimSuffix(args[0], ".git")
rr, err := be.Repository(ctx, rn)
if err != nil {
Expand Down Expand Up @@ -63,7 +64,7 @@ func branchDefaultCommand() *cobra.Command {
Args: cobra.RangeArgs(1, 2),
RunE: func(cmd *cobra.Command, args []string) error {
ctx := cmd.Context()
_, be, _ := fromContext(cmd)
be := backend.FromContext(ctx)
rn := strings.TrimSuffix(args[0], ".git")
switch len(args) {
case 1:
Expand Down Expand Up @@ -135,7 +136,7 @@ func branchDeleteCommand() *cobra.Command {
PersistentPreRunE: checkIfCollab,
RunE: func(cmd *cobra.Command, args []string) error {
ctx := cmd.Context()
_, be, _ := fromContext(cmd)
be := backend.FromContext(ctx)
rn := strings.TrimSuffix(args[0], ".git")
rr, err := be.Repository(ctx, rn)
if err != nil {
Expand Down
Loading

0 comments on commit ca51947

Please sign in to comment.