git-lfs/git/gitattr/attr_test.go
Taylor Blau 58ae7f7f8e git/gitattr: introduce package 'gitattr'
This commit introduces package github.com/git-lfs/git-lfs/git/gitattr,
which manifests a tree-like representation of a repository's
.gitattribute file(s).

It introduces the following top-level and member functions:

  - func ParseLines(r io.Reader) ([]*Line, error)

  Parses the lines of a .gitattributes-like io.Reader into a set of
  wildmatch to attribute-set pairings, or an error if one was
  encountered.

  - func New(db *gitobj.ObjectDatabase, t *gitobj.Tree) (*Tree, error)

  Visits all trees reachable from "t" in a depth-first search to
  reconstruct a tree-representation of all .gitattributes file(s) in the
  repository.

  - func (t *Tree) Applied(to string) []*Attr

  Finds all attributes in-order that are applied to "to" relative to the
  receiving *Tree's location in the repository's tree structure.

This will become useful in subsequent commits when this is used to scan
a repository's .gitattributes files before rewriting the blobs in that
repository during the forthcoming 'git lfs migrate import --fixup' mode.
2018-07-06 14:42:48 -05:00

135 lines
3.8 KiB
Go

package gitattr
import (
"fmt"
"strings"
"testing"
"github.com/stretchr/testify/assert"
)
func TestParseLines(t *testing.T) {
lines, err := ParseLines(strings.NewReader("*.dat filter=lfs"))
assert.NoError(t, err)
assert.Len(t, lines, 1)
assert.Equal(t, lines[0].Pattern.String(), "*.dat")
assert.Equal(t, lines[0].Attrs[0], &Attr{
K: "filter", V: "lfs",
})
}
func TestParseLinesManyAttrs(t *testing.T) {
lines, err := ParseLines(strings.NewReader(
"*.dat filter=lfs diff=lfs merge=lfs -text"))
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.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"})
}
func TestParseLinesManyLines(t *testing.T) {
lines, err := ParseLines(strings.NewReader(strings.Join([]string{
"*.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")))
assert.NoError(t, err)
assert.Len(t, lines, 3)
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.Len(t, lines[0].Attrs, 4)
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.Len(t, lines[1].Attrs, 4)
assert.Equal(t, lines[1].Attrs[0], &Attr{K: "filter", V: "lfs"})
assert.Equal(t, lines[1].Attrs[1], &Attr{K: "diff", V: "lfs"})
assert.Equal(t, lines[1].Attrs[2], &Attr{K: "merge", V: "lfs"})
assert.Equal(t, lines[1].Attrs[3], &Attr{K: "text", V: "false"})
assert.Len(t, lines[1].Attrs, 4)
assert.Equal(t, lines[1].Attrs[0], &Attr{K: "filter", V: "lfs"})
assert.Equal(t, lines[1].Attrs[1], &Attr{K: "diff", V: "lfs"})
assert.Equal(t, lines[1].Attrs[2], &Attr{K: "merge", V: "lfs"})
assert.Equal(t, lines[1].Attrs[3], &Attr{K: "text", V: "false"})
}
func TestParseLinesUnset(t *testing.T) {
lines, err := ParseLines(strings.NewReader("*.dat -filter"))
assert.NoError(t, err)
assert.Len(t, lines, 1)
assert.Equal(t, lines[0].Pattern.String(), "*.dat")
assert.Equal(t, lines[0].Attrs[0], &Attr{
K: "filter", V: "false",
})
}
func TestParseLinesUnspecified(t *testing.T) {
lines, err := ParseLines(strings.NewReader("*.dat !filter"))
assert.NoError(t, err)
assert.Len(t, lines, 1)
assert.Equal(t, lines[0].Pattern.String(), "*.dat")
assert.Equal(t, lines[0].Attrs[0], &Attr{
K: "filter", Unspecified: true,
})
}
func TestParseLinesQuotedPattern(t *testing.T) {
lines, err := ParseLines(strings.NewReader(
"\"space *.dat\" filter=lfs"))
assert.NoError(t, err)
assert.Len(t, lines, 1)
assert.Equal(t, lines[0].Pattern.String(), "space *.dat")
assert.Equal(t, lines[0].Attrs[0], &Attr{
K: "filter", V: "lfs",
})
}
func TestParseLinesCommented(t *testing.T) {
lines, err := ParseLines(strings.NewReader(
"# \"space *.dat\" filter=lfs"))
assert.NoError(t, err)
assert.Len(t, lines, 0)
}
func TestParseLinesUnbalancedQuotes(t *testing.T) {
const text = "\"space *.dat filter=lfs"
lines, err := ParseLines(strings.NewReader(text))
assert.Empty(t, lines)
assert.EqualError(t, err, fmt.Sprintf(
"git/gitattr: unbalanced quote: %s", text))
}
func TestParseLinesWithNoAttributes(t *testing.T) {
lines, err := ParseLines(strings.NewReader("*.dat"))
assert.Len(t, lines, 1)
assert.NoError(t, err)
assert.Equal(t, lines[0].Pattern.String(), "*.dat")
assert.Empty(t, lines[0].Attrs)
}