Monorepo for Tangled
tangled.org
1package ssh
2
3import (
4 "fmt"
5
6 tea "github.com/charmbracelet/bubbletea"
7 "github.com/charmbracelet/ssh"
8 wishtea "github.com/charmbracelet/wish/bubbletea"
9 "tangled.org/core/appview/db"
10 "tangled.org/core/orm"
11)
12
13func (s *Server) teaHandler(sess ssh.Session) (tea.Model, []tea.ProgramOption) {
14 remote := sess.RemoteAddr().String()
15 args := sess.Command()
16 l := s.logger.With("remote", remote)
17 l.Info("SSH connection", "args", args)
18 defer l.Info("SSH connection closed", "remote", remote)
19
20 renderer := wishtea.MakeRenderer(sess)
21
22 if len(args) != 2 {
23 l.Warn("bad invocation", "args", args)
24 return newErrorModel(renderer, "usage: ssh -t -p <port> <host> <repoDID> <sha>"), wishtea.MakeOptions(sess)
25 }
26
27 repoDID := args[0]
28 sha := args[1]
29
30 l = l.With("repoDID", repoDID, "sha", sha)
31
32 pipelines, err := db.GetPipelineStatuses(s.db, 1,
33 orm.FilterEq("p.repo_did", repoDID),
34 orm.FilterEq("p.sha", sha),
35 )
36 if err != nil || len(pipelines) == 0 {
37 l.Warn("pipeline not found", "err", err)
38 return newErrorModel(renderer, fmt.Sprintf("pipeline not found for repo %s @ %s", repoDID, sha)), wishtea.MakeOptions(sess)
39 }
40
41 pipeline := pipelines[0]
42 l.Info("serving pipeline", "workflows", len(pipeline.Statuses))
43 pty, _, _ := sess.Pty()
44 opts := append(wishtea.MakeOptions(sess), tea.WithAltScreen())
45 return newPipelineModel(renderer, s, pipeline, pty.Window.Width, pty.Window.Height), opts
46}