Skip to content

Commit 5cb3488

Browse files
committed
"Update to use keyboard library for better handling of input"
1 parent ea4a01a commit 5cb3488

4 files changed

Lines changed: 37 additions & 26 deletions

File tree

cmd/generate.go

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@ import (
88
"strings"
99
"time"
1010

11+
"github.com/eiannone/keyboard"
12+
"github.com/manifoldco/promptui"
13+
"github.com/spf13/cobra"
14+
1115
"smartcommit/config"
1216
"smartcommit/diff"
1317
"smartcommit/llm"
14-
15-
"github.com/manifoldco/promptui"
16-
"github.com/spf13/cobra"
1718
)
1819

1920
var yesFlag bool
@@ -28,21 +29,21 @@ Use --yes or -y to skip the prompt and commit directly.`,
2829
Run: func(cmd *cobra.Command, args []string) {
2930
cfg := config.LoadOrDefault()
3031

31-
d, err := diff.GetStagedDiff()
32-
if err != nil || strings.TrimSpace(d) == "" {
32+
diffText, err := diff.GetStagedDiff()
33+
if err != nil || diffText == "" {
3334
fmt.Println("❌ No staged changes found.")
3435
return
3536
}
3637

37-
prompt := cfg.SystemPrompt + "\n\nDiff:\n" + d
38+
promptText := cfg.SystemPrompt + "\n\nDiff:\n" + diffText
3839

3940
provider, err := llm.GetProvider(cfg)
4041
if err != nil {
4142
fmt.Println("❌", err)
4243
return
4344
}
4445

45-
message, err := provider.Generate(prompt)
46+
message, err := provider.Generate(promptText)
4647
if err != nil {
4748
fmt.Println("❌ Generation failed:", err)
4849
return
@@ -54,39 +55,46 @@ Use --yes or -y to skip the prompt and commit directly.`,
5455
fmt.Println("----------------------------------")
5556
fmt.Println(message)
5657
fmt.Println("----------------------------------")
57-
commit(message)
58+
runGitCommit(message)
5859
return
5960
}
6061

61-
// Interactive loop
6262
for {
6363
fmt.Println("\n💡 Generated Commit Message:")
6464
fmt.Println("----------------------------------")
6565
fmt.Println(message)
6666
fmt.Println("----------------------------------")
67-
fmt.Print("Choose [c]ommit, [e]dit, [r]egenerate, [q]uit: ")
67+
fmt.Print("Choose [c]ommit, [e]dit, [r]egen, [q]uit: ")
6868

69-
var choice string
70-
fmt.Scanln(&choice)
69+
if err := keyboard.Open(); err != nil {
70+
fmt.Println("❌ Keyboard input error:", err)
71+
return
72+
}
73+
char, _, err := keyboard.GetSingleKey()
74+
keyboard.Close()
75+
if err != nil {
76+
fmt.Println("❌ Failed to read key:", err)
77+
return
78+
}
7179

72-
switch choice {
80+
switch strings.ToLower(string(char)) {
7381
case "c":
74-
commit(message)
82+
runGitCommit(message)
7583
return
7684
case "e":
77-
message = edit(message)
85+
message = editMessage(message)
7886
case "r":
7987
fmt.Print("\n🔄 Regenerating")
8088
for i := 0; i < 3; i++ {
8189
fmt.Print(".")
8290
time.Sleep(200 * time.Millisecond)
8391
}
84-
msg, err := provider.Generate(prompt)
92+
message, err = provider.Generate(promptText)
8593
if err != nil {
86-
fmt.Println("\n❌ Regeneration failed:", err)
87-
} else {
88-
message = strings.TrimSpace(msg)
94+
fmt.Println("❌ Regeneration failed:", err)
95+
continue
8996
}
97+
message = strings.TrimSpace(message)
9098
case "q":
9199
fmt.Println("👋 Aborted.")
92100
return
@@ -102,20 +110,19 @@ func init() {
102110
rootCmd.AddCommand(generateCmd)
103111
}
104112

105-
func commit(msg string) {
113+
func runGitCommit(msg string) {
106114
fmt.Println("✅ Committing with:")
107115
fmt.Println(msg)
108116
cmd := exec.Command("git", "commit", "-m", msg)
109117
cmd.Stdin = os.Stdin
110118
cmd.Stdout = os.Stdout
111119
cmd.Stderr = os.Stderr
112-
err := cmd.Run()
113-
if err != nil {
120+
if err := cmd.Run(); err != nil {
114121
fmt.Println("❌ Git commit failed:", err)
115122
}
116123
}
117124

118-
func edit(current string) string {
125+
func editMessage(current string) string {
119126
prompt := promptui.Prompt{
120127
Label: "Edit Commit Message",
121128
Default: current,
@@ -126,5 +133,5 @@ func edit(current string) string {
126133
fmt.Println("⚠️ Edit cancelled.")
127134
return current
128135
}
129-
return result
136+
return strings.TrimSpace(result)
130137
}

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module smartcommit
33
go 1.24.5
44

55
require (
6+
github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203
67
github.com/manifoldco/promptui v0.9.0
78
github.com/spf13/cobra v1.9.1
89
gopkg.in/yaml.v3 v3.0.1
@@ -12,5 +13,5 @@ require (
1213
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect
1314
github.com/inconshreveable/mousetrap v1.1.0 // indirect
1415
github.com/spf13/pflag v1.0.6 // indirect
15-
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b // indirect
16+
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect
1617
)

go.sum

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P
55
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8=
66
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
77
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
8+
github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203 h1:XBBHcIb256gUJtLmY22n99HaZTz+r2Z51xUPi01m3wg=
9+
github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203/go.mod h1:E1jcSv8FaEny+OP/5k9UxZVw9YFWGj7eI4KR/iOBqCg=
810
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
911
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
1012
github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA=
@@ -14,8 +16,9 @@ github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
1416
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
1517
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
1618
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
17-
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b h1:MQE+LT/ABUuuvEZ+YQAMSXindAdUh7slEmAkup74op4=
1819
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
20+
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
21+
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
1922
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
2023
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
2124
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

smartcommit

232 KB
Binary file not shown.

0 commit comments

Comments
 (0)