diff options
author | Tom Payne <twpayne@gmail.com> | 2020-04-24 03:19:37 +0100 |
---|---|---|
committer | Tom Payne <twpayne@gmail.com> | 2020-04-26 19:53:10 +0100 |
commit | 743920c9b9da0fb47702369c0a9d718ffd54d683 (patch) | |
tree | 343b6903840283122f42e0b136f41867f3d20f9b /plumbing/format/diff/colorconfig.go | |
parent | 05d46a029600047e8e4b566ae36fc2823709d67e (diff) | |
download | go-git-743920c9b9da0fb47702369c0a9d718ffd54d683.tar.gz |
plumbing: diff, Add initial colored output support. Fixes #33.
Diffstat (limited to 'plumbing/format/diff/colorconfig.go')
-rw-r--r-- | plumbing/format/diff/colorconfig.go | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/plumbing/format/diff/colorconfig.go b/plumbing/format/diff/colorconfig.go new file mode 100644 index 0000000..b7c32e6 --- /dev/null +++ b/plumbing/format/diff/colorconfig.go @@ -0,0 +1,96 @@ +package diff + +import "github.com/go-git/go-git/v5/internal/color" + +// A ColorKey is a key into a ColorConfig map and also equal to the key in the +// diff.color subsection of the config. See +// https://github.com/git/git/blob/v2.26.2/diff.c#L83-L106. +type ColorKey string + +// ColorKeys. +const ( + Context ColorKey = "context" + Meta ColorKey = "meta" + Frag ColorKey = "frag" + Old ColorKey = "old" + New ColorKey = "new" + Commit ColorKey = "commit" + Whitespace ColorKey = "whitespace" + Func ColorKey = "func" + OldMoved ColorKey = "oldMoved" + OldMovedAlternative ColorKey = "oldMovedAlternative" + OldMovedDimmed ColorKey = "oldMovedDimmed" + OldMovedAlternativeDimmed ColorKey = "oldMovedAlternativeDimmed" + NewMoved ColorKey = "newMoved" + NewMovedAlternative ColorKey = "newMovedAlternative" + NewMovedDimmed ColorKey = "newMovedDimmed" + NewMovedAlternativeDimmed ColorKey = "newMovedAlternativeDimmed" + ContextDimmed ColorKey = "contextDimmed" + OldDimmed ColorKey = "oldDimmed" + NewDimmed ColorKey = "newDimmed" + ContextBold ColorKey = "contextBold" + OldBold ColorKey = "oldBold" + NewBold ColorKey = "newBold" +) + +// A ColorConfig is a color configuration. A nil or empty ColorConfig +// corresponds to no color. +type ColorConfig map[ColorKey]string + +// A ColorConfigOption sets an option on a ColorConfig. +type ColorConfigOption func(ColorConfig) + +// WithColor sets the color for key. +func WithColor(key ColorKey, color string) ColorConfigOption { + return func(cc ColorConfig) { + cc[key] = color + } +} + +// defaultColorConfig is the default color configuration. See +// https://github.com/git/git/blob/v2.26.2/diff.c#L57-L81. +var defaultColorConfig = ColorConfig{ + Context: color.Normal, + Meta: color.Bold, + Frag: color.Cyan, + Old: color.Red, + New: color.Green, + Commit: color.Yellow, + Whitespace: color.BgRed, + Func: color.Normal, + OldMoved: color.BoldMagenta, + OldMovedAlternative: color.BoldBlue, + OldMovedDimmed: color.Faint, + OldMovedAlternativeDimmed: color.FaintItalic, + NewMoved: color.BoldCyan, + NewMovedAlternative: color.BoldYellow, + NewMovedDimmed: color.Faint, + NewMovedAlternativeDimmed: color.FaintItalic, + ContextDimmed: color.Faint, + OldDimmed: color.FaintRed, + NewDimmed: color.FaintGreen, + ContextBold: color.Bold, + OldBold: color.BoldRed, + NewBold: color.BoldGreen, +} + +// NewColorConfig returns a new ColorConfig. +func NewColorConfig(options ...ColorConfigOption) ColorConfig { + cc := make(ColorConfig) + for key, value := range defaultColorConfig { + cc[key] = value + } + for _, option := range options { + option(cc) + } + return cc +} + +// Reset returns the ANSI escape sequence to reset a color set from cc. If cc is +// nil or empty then no reset is needed so it returns the empty string. +func (cc ColorConfig) Reset() string { + if len(cc) == 0 { + return "" + } + return color.Reset +} |