File: macro.go

package info (click to toggle)
git-lfs 3.6.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 4,808 kB
  • sloc: sh: 21,256; makefile: 507; ruby: 417
file content (69 lines) | stat: -rw-r--r-- 1,692 bytes parent folder | download
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
}