From 5a54097c4b6daaa68df2d0294e8c9eae1cd1de21 Mon Sep 17 00:00:00 2001 From: Taylor Blau Date: Sat, 15 Sep 2018 20:24:47 -0400 Subject: [PATCH] git/gitattr/attr{,_test}.go: parse implicitly 'true' attributes When an attribute does not start with '!', '-', or contain an '=', we had previously treated it as malformed. Instead, assume that it is a 'set' attribute, which we interpret to mean as being set implicitly to "true" (and therefore the dual of the '-' prefix). From the relevant documentation [1]: Set The path has the attribute with special value "true"; this is specified by listing only the name of the attribute in the attribute list. [1]: https://git-scm.com/docs/gitattributes --- git/gitattr/attr.go | 3 +++ git/gitattr/attr_test.go | 14 ++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/git/gitattr/attr.go b/git/gitattr/attr.go index 2129f51b..af5c4d3c 100644 --- a/git/gitattr/attr.go +++ b/git/gitattr/attr.go @@ -105,6 +105,9 @@ func ParseLines(r io.Reader) ([]*Line, error) { } else if eq := strings.Index(s, "="); eq > -1 { attr.K = s[:eq] attr.V = s[eq+1:] + } else { + attr.K = s + attr.V = "true" } attrs = append(attrs, &attr) diff --git a/git/gitattr/attr_test.go b/git/gitattr/attr_test.go index 8073cb92..eaab1842 100644 --- a/git/gitattr/attr_test.go +++ b/git/gitattr/attr_test.go @@ -22,18 +22,19 @@ func TestParseLines(t *testing.T) { func TestParseLinesManyAttrs(t *testing.T) { lines, err := ParseLines(strings.NewReader( - "*.dat filter=lfs diff=lfs merge=lfs -text")) + "*.dat filter=lfs diff=lfs merge=lfs -text crlf")) assert.NoError(t, err) assert.Len(t, lines, 1) assert.Equal(t, lines[0].Pattern.String(), "*.dat") - assert.Len(t, lines[0].Attrs, 4) + assert.Len(t, lines[0].Attrs, 5) assert.Equal(t, lines[0].Attrs[0], &Attr{K: "filter", V: "lfs"}) assert.Equal(t, lines[0].Attrs[1], &Attr{K: "diff", V: "lfs"}) assert.Equal(t, lines[0].Attrs[2], &Attr{K: "merge", V: "lfs"}) assert.Equal(t, lines[0].Attrs[3], &Attr{K: "text", V: "false"}) + assert.Equal(t, lines[0].Attrs[4], &Attr{K: "crlf", V: "true"}) } func TestParseLinesManyLines(t *testing.T) { @@ -41,14 +42,16 @@ func TestParseLinesManyLines(t *testing.T) { "*.dat filter=lfs diff=lfs merge=lfs -text", "*.jpg filter=lfs diff=lfs merge=lfs -text", "# *.pdf filter=lfs diff=lfs merge=lfs -text", - "*.png filter=lfs diff=lfs merge=lfs -text"}, "\n"))) + "*.png filter=lfs diff=lfs merge=lfs -text", + "*.txt text"}, "\n"))) assert.NoError(t, err) - assert.Len(t, lines, 3) + assert.Len(t, lines, 4) assert.Equal(t, lines[0].Pattern.String(), "*.dat") assert.Equal(t, lines[1].Pattern.String(), "*.jpg") assert.Equal(t, lines[2].Pattern.String(), "*.png") + assert.Equal(t, lines[3].Pattern.String(), "*.txt") assert.Len(t, lines[0].Attrs, 4) assert.Equal(t, lines[0].Attrs[0], &Attr{K: "filter", V: "lfs"}) @@ -67,6 +70,9 @@ func TestParseLinesManyLines(t *testing.T) { assert.Equal(t, lines[2].Attrs[1], &Attr{K: "diff", V: "lfs"}) assert.Equal(t, lines[2].Attrs[2], &Attr{K: "merge", V: "lfs"}) assert.Equal(t, lines[2].Attrs[3], &Attr{K: "text", V: "false"}) + + assert.Len(t, lines[3].Attrs, 1) + assert.Equal(t, lines[3].Attrs[0], &Attr{K: "text", V: "true"}) } func TestParseLinesUnset(t *testing.T) {