58ae7f7f8e
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.
135 lines
3.8 KiB
Go
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)
|
|
}
|