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
|
package gitattr
type MacroProcessor struct {
macros map[string][]*Attr
}
// NewMacroProcessor returns a new MacroProcessor object for parsing macros.
func NewMacroProcessor() *MacroProcessor {
macros := make(map[string][]*Attr)
// This is built into Git.
macros["binary"] = []*Attr{
&Attr{K: "diff", V: "false"},
&Attr{K: "merge", V: "false"},
&Attr{K: "text", V: "false"},
}
return &MacroProcessor{
macros: macros,
}
}
// ProcessLines reads the specified lines, returning a new set of lines which
// all have a valid pattern. If readMacros is true, it additionally loads any
// macro lines as it reads them.
func (mp *MacroProcessor) ProcessLines(lines []Line, readMacros bool) []PatternLine {
result := make([]PatternLine, 0, len(lines))
for _, line := range lines {
switch l := line.(type) {
case PatternLine:
var lineAttrs lineAttrs
lineAttrs.attrs = make([]*Attr, 0, len(l.Attrs()))
resultLine := &patternLine{l.Pattern(), lineAttrs}
for _, attr := range l.Attrs() {
macros := mp.macros[attr.K]
if attr.V == "true" && macros != nil {
resultLine.attrs = append(
resultLine.attrs,
macros...,
)
} else if attr.Unspecified && macros != nil {
for _, m := range macros {
resultLine.attrs = append(
resultLine.attrs,
&Attr{
K: m.K,
Unspecified: true,
},
)
}
}
// Git copies through aliases as well as
// expanding them.
resultLine.attrs = append(
resultLine.attrs,
attr,
)
}
result = append(result, resultLine)
case MacroLine:
if readMacros {
mp.macros[l.Macro()] = l.Attrs()
}
}
}
return result
}
|