-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
159 lines (131 loc) · 3.62 KB
/
main.go
File metadata and controls
159 lines (131 loc) · 3.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package main
import (
"fmt"
"os"
"os/exec"
"strings"
"github.com/richardvanbergen/git-commit-ai/adapters"
)
func getEditor() (string, error) {
// Try git config first
cmd := exec.Command("git", "config", "--get", "core.editor")
if output, err := cmd.Output(); err == nil && len(output) > 0 {
return strings.TrimSpace(string(output)), nil
}
// Fallback to environment variables
if editor := os.Getenv("GIT_EDITOR"); editor != "" {
return editor, nil
}
if editor := os.Getenv("VISUAL"); editor != "" {
return editor, nil
}
if editor := os.Getenv("EDITOR"); editor != "" {
return editor, nil
}
// Final fallback
return "vim", nil
}
func editMessage(initialContent string) (string, error) {
editor, err := getEditor()
if err != nil {
return "", fmt.Errorf("failed to get editor: %w", err)
}
// Create temporary file
tmpfile, err := os.CreateTemp("", "COMMIT_EDITMSG.*")
if err != nil {
return "", fmt.Errorf("failed to create temp file: %w", err)
}
defer os.Remove(tmpfile.Name())
// Write initial content
if _, err := tmpfile.WriteString(initialContent); err != nil {
return "", fmt.Errorf("failed to write to temp file: %w", err)
}
tmpfile.Close()
// Open editor
cmd := exec.Command(editor, tmpfile.Name())
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
return "", fmt.Errorf("failed to run editor: %w", err)
}
// Read edited content
content, err := os.ReadFile(tmpfile.Name())
if err != nil {
return "", fmt.Errorf("failed to read edited file: %w", err)
}
return string(content), nil
}
func GetStagedFiles() ([]string, error) {
cmd := exec.Command("git", "diff", "--cached", "--name-only")
output, err := cmd.Output()
if err != nil {
return nil, fmt.Errorf("failed to get staged files: %w", err)
}
files := []string{}
for _, file := range strings.Split(strings.TrimSpace(string(output)), "\n") {
if file != "" {
files = append(files, file)
}
}
return files, nil
}
func GetStagedDiff() (string, error) {
cmd := exec.Command("git", "diff", "--cached")
output, err := cmd.Output()
if err != nil {
return "", fmt.Errorf("failed to get staged diff: %w", err)
}
return string(output), nil
}
func commitChanges(message string) error {
cmd := exec.Command("git", "commit", "-m", message)
if err := cmd.Run(); err != nil {
return fmt.Errorf("failed to commit: %w", err)
}
return nil
}
func confirmCommit(message string) bool {
fmt.Println("\nProposed commit message:")
fmt.Println("------------------------")
fmt.Println(message)
fmt.Println("------------------------")
fmt.Print("Do you want to commit with this message? (y/N): ")
var response string
fmt.Scanln(&response)
return strings.ToLower(response) == "y"
}
func main() {
stagedFiles, err := GetStagedFiles()
if err != nil {
fmt.Printf("Error getting staged files: %v\n", err)
os.Exit(1)
}
diff, err := GetStagedDiff()
if err != nil {
fmt.Printf("Error getting staged diff: %v\n", err)
os.Exit(1)
}
if len(stagedFiles) == 0 {
fmt.Fprintln(os.Stderr, "Error: No files are staged for commit")
os.Exit(1)
}
client := adapters.NewAnthropicClient()
suggestedMessage := client.Summerize(
fmt.Sprintf("Changed files:\n%s\n\nDiff:\n%s", strings.Join(stagedFiles, "\n"), diff),
)
finalMessage, err := editMessage(suggestedMessage)
if err != nil {
fmt.Printf("Error editing message: %v\n", err)
os.Exit(1)
}
if !confirmCommit(finalMessage) {
fmt.Println("Commit cancelled")
os.Exit(0)
}
if err := commitChanges(finalMessage); err != nil {
fmt.Printf("Error creating commit: %v\n", err)
os.Exit(1)
}
fmt.Println("Changes committed successfully!")
}