Skip to content

Commit

Permalink
Add GitMiddleware
Browse files Browse the repository at this point in the history
  • Loading branch information
Toby Padilla committed Jul 30, 2021
1 parent daeb6bf commit 7c823a0
Show file tree
Hide file tree
Showing 6 changed files with 156 additions and 4 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
smoothie
.ssh
.repos
90 changes: 90 additions & 0 deletions git.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package main

import (
"context"
"fmt"
"os"
"os/exec"

"github.com/gliderlabs/ssh"
)

func GitMiddleware(repoDir string) Middleware {
return func(sh ssh.Handler) ssh.Handler {
return func(s ssh.Session) {
cmd := s.Command()
if len(cmd) == 2 {
switch cmd[0] {
case "git-upload-pack", "git-receive-pack", "git-upload-archive":
r := cmd[1]
rp := fmt.Sprintf("%s%s", repoDir, r)
ctx := s.Context()
err := ensureRepo(ctx, repoDir, r)
if err != nil {
fatalGit(s, err)
break
}
c := exec.CommandContext(ctx, cmd[0], rp)
c.Dir = "./"
c.Stdout = s
c.Stdin = s
err = c.Run()
if err != nil {
fatalGit(s, err)
break
}
}
}
sh(s)
}
}
}

func fileExists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return true, err
}

func fatalGit(s ssh.Session, err error) {
// hex length includes 4 byte length prefix and ending newline
logError(s, err)
msg := err.Error()
pktLine := fmt.Sprintf("%04x%s\n", len(msg)+5, msg)
_, err = s.Write([]byte(pktLine))
if err != nil {
logError(s, err)
}
s.Exit(1)
}

func ensureRepo(ctx context.Context, dir string, repo string) error {
exists, err := fileExists(dir)
if err != nil {
return err
}
if !exists {
err = os.MkdirAll(dir, os.ModeDir|os.FileMode(0700))
if err != nil {
return err
}
}
rp := fmt.Sprintf("%s%s", dir, repo)
exists, err = fileExists(rp)
if err != nil {
return err
}
if !exists {
c := exec.CommandContext(ctx, "git", "init", "--bare", rp)
err = c.Run()
if err != nil {
return err
}
}
return nil
}
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ require (
github.com/charmbracelet/charm v0.8.6
github.com/charmbracelet/lipgloss v0.2.1
github.com/gliderlabs/ssh v0.3.3
github.com/go-git/go-git/v5 v5.4.2
github.com/meowgorithm/babyenv v1.3.0
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97
)
Loading

0 comments on commit 7c823a0

Please sign in to comment.