File view with blame information shown in the left gutter beside each line.

barerepo / server / internal/sshx/serve.go
53 lines · 1.5kb · 133728eaa05486504991b230f9d4c7e986b7defc
log files threads runs releases config jump to file t
133728e barerepo 1mo
1
package sshx
133728e barerepo 1mo
2
133728e barerepo 1mo
3
import (
133728e barerepo 1mo
4
"context"
133728e barerepo 1mo
5
"errors"
133728e barerepo 1mo
6
"fmt"
133728e barerepo 1mo
7
"os"
133728e barerepo 1mo
8
133728e barerepo 1mo
9
"github.com/barerepo/server/internal/gitx"
133728e barerepo 1mo
10
"github.com/barerepo/server/internal/hook"
133728e barerepo 1mo
11
"github.com/barerepo/server/internal/transport"
133728e barerepo 1mo
12
)
133728e barerepo 1mo
13
133728e barerepo 1mo
14
// Serve decides whether this named account may do this, then hands git the connection.
133728e barerepo 1mo
15
func Serve(ctx context.Context, t *transport.Server, account, cmd string) error {
133728e barerepo 1mo
16
r, err := Parse(cmd)
133728e barerepo 1mo
17
if err != nil {
133728e barerepo 1mo
18
return err
133728e barerepo 1mo
19
}
133728e barerepo 1mo
20
intent := transport.Read
133728e barerepo 1mo
21
if r.Write() {
133728e barerepo 1mo
22
// ssh runs one receive-pack per push, so there is no advertise to hold creation back from.
133728e barerepo 1mo
23
intent = transport.Write
133728e barerepo 1mo
24
}
133728e barerepo 1mo
25
res, err := t.Open(ctx, r.Owner, r.Name, account, intent)
133728e barerepo 1mo
26
var moved transport.Redirect
133728e barerepo 1mo
27
switch {
133728e barerepo 1mo
28
case errors.As(err, &moved):
133728e barerepo 1mo
29
// ssh has no redirect, so say where it went and what to run about it.
133728e barerepo 1mo
30
user := t.Cfg.Server.SSHUser
133728e barerepo 1mo
31
if user == "" {
133728e barerepo 1mo
32
user = "git"
133728e barerepo 1mo
33
}
133728e barerepo 1mo
34
return fmt.Errorf("%s/%s moved to %s/%s. update your remote:\n"+
133728e barerepo 1mo
35
" git remote set-url origin %s@%s:%s/%s",
133728e barerepo 1mo
36
r.Owner, r.Name, moved.Owner, moved.Name,
133728e barerepo 1mo
37
user, t.Cfg.Server.SSHHost, moved.Owner, moved.Name)
133728e barerepo 1mo
38
case err != nil:
133728e barerepo 1mo
39
return err
133728e barerepo 1mo
40
}
133728e barerepo 1mo
41
if res.Warning != "" {
133728e barerepo 1mo
42
fmt.Fprintln(os.Stderr, res.Warning)
133728e barerepo 1mo
43
}
133728e barerepo 1mo
44
133728e barerepo 1mo
45
env := hook.Env{
133728e barerepo 1mo
46
Account: account, Owner: res.Owner, Name: res.Name, Dir: res.Dir,
133728e barerepo 1mo
47
Created: res.Created,
133728e barerepo 1mo
48
URL: t.Cfg.Server.ExternalURL + "/" + res.Owner + "/" + res.Name,
133728e barerepo 1mo
49
Config: t.Cfg.Path,
133728e barerepo 1mo
50
}
133728e barerepo 1mo
51
verb := r.Verb[len("git-"):]
133728e barerepo 1mo
52
return gitx.Pipe(ctx, res.Dir, os.Stdin, os.Stdout, os.Stderr, env.Vars(), verb, ".")
133728e barerepo 1mo
53
}
history · rawbarerepo 0.1.0