summaryrefslogtreecommitdiffhomepage
path: root/packages/tui/internal/components/diff
diff options
context:
space:
mode:
authoradamdotdevin <[email protected]>2025-07-29 13:11:38 -0500
committeradamdotdevin <[email protected]>2025-07-29 13:11:38 -0500
commita129e122aad1e3eef34ead4b5970c6be4fb2004a (patch)
tree29f17f193a03a0612739ffe1d9c9525f04942249 /packages/tui/internal/components/diff
parentc0ee6a6d05983d7d24adedbf0ab67dd562ccfb81 (diff)
downloadopencode-a129e122aad1e3eef34ead4b5970c6be4fb2004a.tar.gz
opencode-a129e122aad1e3eef34ead4b5970c6be4fb2004a.zip
feat: show git diff in reverted messages
Diffstat (limited to 'packages/tui/internal/components/diff')
-rw-r--r--packages/tui/internal/components/diff/parse.go58
1 files changed, 58 insertions, 0 deletions
diff --git a/packages/tui/internal/components/diff/parse.go b/packages/tui/internal/components/diff/parse.go
new file mode 100644
index 000000000..261ba5970
--- /dev/null
+++ b/packages/tui/internal/components/diff/parse.go
@@ -0,0 +1,58 @@
+package diff
+
+import (
+ "bufio"
+ "fmt"
+ "strings"
+)
+
+type DiffStats struct {
+ Added int
+ Removed int
+ Modified int
+}
+
+func ParseStats(diff string) (map[string]DiffStats, error) {
+ stats := make(map[string]DiffStats)
+ var currentFile string
+ scanner := bufio.NewScanner(strings.NewReader(diff))
+
+ for scanner.Scan() {
+ line := scanner.Text()
+ if strings.HasPrefix(line, "---") {
+ continue
+ } else if strings.HasPrefix(line, "+++") {
+ parts := strings.SplitN(line, " ", 2)
+ if len(parts) == 2 {
+ currentFile = strings.TrimPrefix(parts[1], "b/")
+ }
+ continue
+ }
+ if strings.HasPrefix(line, "@@") {
+ continue
+ }
+ if currentFile == "" {
+ continue
+ }
+
+ fileStats := stats[currentFile]
+ switch {
+ case strings.HasPrefix(line, "+"):
+ fileStats.Added++
+ case strings.HasPrefix(line, "-"):
+ fileStats.Removed++
+ }
+ stats[currentFile] = fileStats
+ }
+
+ if err := scanner.Err(); err != nil {
+ return nil, fmt.Errorf("error reading diff string: %w", err)
+ }
+
+ for file, fileStats := range stats {
+ fileStats.Modified = fileStats.Added + fileStats.Removed
+ stats[file] = fileStats
+ }
+
+ return stats, nil
+}