package ui import ( "fmt" "io" "strings" ) // diff colours are separate from the palette so a unified diff reads the same // way it does in git. var ( green = "\x1b[32m" red = "\x1b[31m" ) func init() { if color.reset == "" { // not a terminal, or NO_COLOR green, red = "", "" } } // WriteDiff renders a unified diff with colour. Anything that is not a diff is // written through unchanged, so a tool result that is a plain message still // reads normally. func WriteDiff(w io.Writer, s string) { for _, line := range strings.Split(strings.TrimRight(s, "\n"), "\n") { switch { case strings.HasPrefix(line, "+++") || strings.HasPrefix(line, "---"): fmt.Fprintf(w, "%s%s%s\n", color.bold, line, color.reset) case strings.HasPrefix(line, "@@"): fmt.Fprintf(w, "%s%s%s\n", color.cyan, line, color.reset) case strings.HasPrefix(line, "+"): fmt.Fprintf(w, "%s%s%s\n", green, line, color.reset) case strings.HasPrefix(line, "-"): fmt.Fprintf(w, "%s%s%s\n", red, line, color.reset) default: fmt.Fprintf(w, "%s\n", line) } } } // looksLikeDiff reports whether s is a unified diff, so tool output can be // rendered appropriately without the tool having to say which it is. func looksLikeDiff(s string) bool { return strings.HasPrefix(s, "--- ") && strings.Contains(s, "\n@@ ") }