diff.go

 1package diff
 2
 3import (
 4	"strings"
 5
 6	"github.com/aymanbagabas/go-udiff"
 7	"github.com/charmbracelet/crush/internal/config"
 8)
 9
10// GenerateDiff creates a unified diff from two file contents
11func GenerateDiff(beforeContent, afterContent, fileName string) (string, int, int) {
12	// remove the cwd prefix and ensure consistent path format
13	// this prevents issues with absolute paths in different environments
14	cwd := config.Get().WorkingDir()
15	fileName = strings.TrimPrefix(fileName, cwd)
16	fileName = strings.TrimPrefix(fileName, "/")
17
18	var (
19		unified   = udiff.Unified("a/"+fileName, "b/"+fileName, beforeContent, afterContent)
20		additions = 0
21		removals  = 0
22	)
23
24	lines := strings.SplitSeq(unified, "\n")
25	for line := range lines {
26		if strings.HasPrefix(line, "+") && !strings.HasPrefix(line, "+++") {
27			additions++
28		} else if strings.HasPrefix(line, "-") && !strings.HasPrefix(line, "---") {
29			removals++
30		}
31	}
32
33	return unified, additions, removals
34}