Skip to content

Commit ee2e423

Browse files
committed
initial commit
1 parent e00d512 commit ee2e423

File tree

4 files changed

+87
-46
lines changed

4 files changed

+87
-46
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
coverage.txt
22
dist/
3+
.idea/

go.mod

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/charmbracelet/bubbletea-app-template
22

3-
go 1.19
3+
go 1.21.5
44

55
require (
66
github.com/charmbracelet/bubbles v0.17.1
@@ -9,6 +9,7 @@ require (
99
)
1010

1111
require (
12+
github.com/atotto/clipboard v0.1.4 // indirect
1213
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
1314
github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect
1415
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
2+
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
13
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
24
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
35
github.com/charmbracelet/bubbles v0.17.1 h1:0SIyjOnkrsfDo88YvPgAWvZMwXe26TP6drRvmkjyUu4=

main.go

+82-45
Original file line numberDiff line numberDiff line change
@@ -2,74 +2,111 @@ package main
22

33
import (
44
"fmt"
5+
"log"
56
"os"
7+
"os/exec"
8+
"strings"
69

7-
"github.com/charmbracelet/bubbles/key"
8-
"github.com/charmbracelet/bubbles/spinner"
10+
"github.com/charmbracelet/bubbles/textinput"
911
tea "github.com/charmbracelet/bubbletea"
10-
"github.com/charmbracelet/lipgloss"
1112
)
1213

13-
type errMsg error
14+
type (
15+
errMsg error
16+
)
1417

1518
type model struct {
16-
spinner spinner.Model
17-
quitting bool
18-
err error
19+
textInput textinput.Model
20+
branch string
21+
err error
1922
}
2023

21-
var quitKeys = key.NewBinding(
22-
key.WithKeys("q", "esc", "ctrl+c"),
23-
key.WithHelp("", "press q to quit"),
24-
)
24+
func main() {
25+
p := tea.NewProgram(initialModel())
26+
if _, err := p.Run(); err != nil {
27+
log.Fatal(err)
28+
}
29+
}
2530

2631
func initialModel() model {
27-
s := spinner.New()
28-
s.Spinner = spinner.Dot
29-
s.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("205"))
30-
return model{spinner: s}
32+
branch, err := getCurrentGitBranch()
33+
if err != nil {
34+
log.Fatal(err)
35+
}
36+
37+
result := strings.Split(branch, "/")
38+
39+
// get first and second result into separate variables
40+
// check if result has more than 2 items
41+
if len(result) <= 2 {
42+
log.Fatal("Branch name should be in the format of <type>/<task-id>/short-message")
43+
}
44+
45+
branchType := strings.ToUpper(result[0])
46+
ticketId := strings.ToUpper(result[1])
47+
48+
ti := textinput.New()
49+
//ti.Width = 90
50+
//ti.ShowSuggestions = true
51+
ti.SetValue(fmt.Sprintf("[%s] [%s] ", branchType, ticketId))
52+
//ti.SetSuggestions([]string{fmt.Sprintf("[FIX] [%s] ", ticketId), fmt.Sprintf("[IMPR] [%s] ", ticketId)})
53+
ti.Focus()
54+
ti.CharLimit = 156
55+
//ti.Width = 20
56+
57+
return model{
58+
textInput: ti,
59+
branch: branch,
60+
err: nil,
61+
}
62+
}
63+
64+
func getCurrentGitBranch() (string, error) {
65+
cmd := exec.Command("git", "branch", "--show-current")
66+
output, err := cmd.CombinedOutput()
67+
if err != nil {
68+
return "", fmt.Errorf("error getting branch name: %v", err)
69+
}
70+
71+
return strings.TrimSpace(string(output)), nil
3172
}
3273

3374
func (m model) Init() tea.Cmd {
34-
return m.spinner.Tick
75+
return textinput.Blink
3576
}
3677

3778
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
38-
switch msg := msg.(type) {
79+
var cmd tea.Cmd
3980

81+
switch msg := msg.(type) {
4082
case tea.KeyMsg:
41-
if key.Matches(msg, quitKeys) {
42-
m.quitting = true
43-
return m, tea.Quit
83+
switch msg.Type {
84+
case tea.KeyEnter:
85+
// Execute git commit command
86+
commitCmd := exec.Command("git", "commit", "-m", m.textInput.Value())
87+
commitCmd.Stdout = os.Stdout
88+
commitCmd.Stderr = os.Stderr
4489

90+
err := commitCmd.Run()
91+
if err != nil {
92+
return m, tea.Quit
93+
}
94+
95+
return m, tea.Quit
96+
case tea.KeyCtrlC, tea.KeyEsc:
97+
return m, tea.Quit
4598
}
46-
return m, nil
47-
case errMsg:
48-
m.err = msg
49-
return m, nil
50-
51-
default:
52-
var cmd tea.Cmd
53-
m.spinner, cmd = m.spinner.Update(msg)
54-
return m, cmd
5599
}
56-
}
57100

58-
func (m model) View() string {
59-
if m.err != nil {
60-
return m.err.Error()
61-
}
62-
str := fmt.Sprintf("\n\n %s Loading forever... %s\n\n", m.spinner.View(), quitKeys.Help().Desc)
63-
if m.quitting {
64-
return str + "\n"
65-
}
66-
return str
101+
m.textInput, cmd = m.textInput.Update(msg)
102+
return m, cmd
67103
}
68104

69-
func main() {
70-
p := tea.NewProgram(initialModel())
71-
if _, err := p.Run(); err != nil {
72-
fmt.Println(err)
73-
os.Exit(1)
74-
}
105+
func (m model) View() string {
106+
return fmt.Sprintf(
107+
"Current branch: %s\n\nEnter commit message\n\n%s\n\n%s",
108+
m.branch,
109+
m.textInput.View(),
110+
"(esc to quit, enter to commit)",
111+
) + "\n"
75112
}

0 commit comments

Comments
 (0)