Allow for direct linking to a repo

Toby Padilla created

Change summary

tui/bubble.go                   |  3 +++
tui/bubbles/selection/bubble.go | 24 ++++++++++++------------
tui/commands.go                 | 18 ++++++++++++++++--
tui/session.go                  | 30 ++++++++++++++++++------------
4 files changed, 49 insertions(+), 26 deletions(-)

Detailed changes

tui/bubble.go 🔗

@@ -42,6 +42,7 @@ type SessionConfig struct {
 	Width         int
 	Height        int
 	WindowChanges <-chan ssh.Window
+	InitialRepo   string
 }
 
 type Bubble struct {
@@ -52,6 +53,7 @@ type Bubble struct {
 	height        int
 	windowChanges <-chan ssh.Window
 	repoSource    *git.RepoSource
+	initialRepo   string
 	repoMenu      []MenuEntry
 	repos         []*git.Repo
 	boxes         []tea.Model
@@ -69,6 +71,7 @@ func NewBubble(cfg *Config, sCfg *SessionConfig) *Bubble {
 		repoSource:    cfg.RepoSource,
 		repoMenu:      make([]MenuEntry, 0),
 		boxes:         make([]tea.Model, 2),
+		initialRepo:   sCfg.InitialRepo,
 	}
 	b.state = startState
 	return b

tui/bubbles/selection/bubble.go 🔗

@@ -19,7 +19,7 @@ type Bubble struct {
 	NormalStyle   lipgloss.Style
 	SelectedStyle lipgloss.Style
 	Items         []string
-	selectedItem  int
+	SelectedItem  int
 }
 
 func NewBubble(items []string) *Bubble {
@@ -37,7 +37,7 @@ func (b *Bubble) Init() tea.Cmd {
 func (b *Bubble) View() string {
 	s := ""
 	for i, item := range b.Items {
-		if i == b.selectedItem {
+		if i == b.SelectedItem {
 			s += b.SelectedStyle.Render(item) + "\n"
 		} else {
 			s += b.NormalStyle.Render(item) + "\n"
@@ -52,13 +52,13 @@ func (b *Bubble) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 	case tea.KeyMsg:
 		switch msg.String() {
 		case "k", "up":
-			if b.selectedItem > 0 {
-				b.selectedItem--
+			if b.SelectedItem > 0 {
+				b.SelectedItem--
 				cmds = append(cmds, b.sendActiveMessage)
 			}
 		case "j", "down":
-			if b.selectedItem < len(b.Items)-1 {
-				b.selectedItem++
+			if b.SelectedItem < len(b.Items)-1 {
+				b.SelectedItem++
 				cmds = append(cmds, b.sendActiveMessage)
 			}
 		case "enter":
@@ -69,20 +69,20 @@ func (b *Bubble) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 }
 
 func (b *Bubble) sendActiveMessage() tea.Msg {
-	if b.selectedItem >= 0 && b.selectedItem < len(b.Items) {
+	if b.SelectedItem >= 0 && b.SelectedItem < len(b.Items) {
 		return ActiveMsg{
-			Name:  b.Items[b.selectedItem],
-			Index: b.selectedItem,
+			Name:  b.Items[b.SelectedItem],
+			Index: b.SelectedItem,
 		}
 	}
 	return nil
 }
 
 func (b *Bubble) sendSelectedMessage() tea.Msg {
-	if b.selectedItem >= 0 && b.selectedItem < len(b.Items) {
+	if b.SelectedItem >= 0 && b.SelectedItem < len(b.Items) {
 		return SelectedMsg{
-			Name:  b.Items[b.selectedItem],
-			Index: b.selectedItem,
+			Name:  b.Items[b.SelectedItem],
+			Index: b.SelectedItem,
 		}
 	}
 	return nil

tui/commands.go 🔗

@@ -69,8 +69,22 @@ func (b *Bubble) setupCmd() tea.Msg {
 		boxRightWidth-horizontalPadding-2,
 		b.repoSource.GetCommits(200),
 	)
-	b.boxes[1] = b.repoMenu[0].bubble
-	b.activeBox = 0
+	ir := -1
+	if b.initialRepo != "" {
+		for i, me := range b.repoMenu {
+			if me.Repo == b.initialRepo {
+				ir = i
+			}
+		}
+	}
+	if ir == -1 {
+		b.boxes[1] = b.repoMenu[0].bubble
+		b.activeBox = 0
+	} else {
+		b.boxes[1] = b.repoMenu[ir].bubble
+		b.repoSelect.SelectedItem = ir
+		b.activeBox = 1
+	}
 	b.state = loadedState
 	return nil
 }

tui/session.go 🔗

@@ -45,19 +45,25 @@ func SessionHandler(reposPath string, repoPoll time.Duration) func(ssh.Session)
 	}()
 
 	return func(s ssh.Session) (tea.Model, []tea.ProgramOption) {
-		if len(s.Command()) == 0 {
-			pty, changes, active := s.Pty()
-			if !active {
-				return nil, nil
-			}
-			cfg := &SessionConfig{
-				Width:         pty.Window.Width,
-				Height:        pty.Window.Height,
-				WindowChanges: changes,
-			}
-			return NewBubble(appCfg, cfg), []tea.ProgramOption{tea.WithAltScreen()}
+		cmd := s.Command()
+		cfg := &SessionConfig{}
+		switch len(cmd) {
+		case 0:
+			cfg.InitialRepo = ""
+		case 1:
+			cfg.InitialRepo = cmd[0]
+		default:
+			return nil, nil
+		}
+		pty, changes, active := s.Pty()
+		if !active {
+			fmt.Println("not active")
+			return nil, nil
 		}
-		return nil, nil
+		cfg.Width = pty.Window.Width
+		cfg.Height = pty.Window.Height
+		cfg.WindowChanges = changes
+		return NewBubble(appCfg, cfg), []tea.ProgramOption{tea.WithAltScreen()}
 	}
 }