git-lfs/git/gitattr/tree_test.go
Taylor Blau ff62456c55 git/gitattr/tree_test.go: ensure that children are given appropriately
The TestNewDiscovers*ChildrenTrees tests ensure that child trees are
discovered and applied to given paths correctly.

To make sure that we aren't applying patterns from the wrong place,
let's ensure that the top-level Lines is empty, implying that any
applied attributes come from a child.

This is a safe thing to do, since Lines and Children are both part of
the public scope of a *gitattr.Tree instance, and therefore should be in
a correct state and use-able by any caller who wishes to do so.
2018-07-09 12:04:06 -05:00

251 lines
5.7 KiB
Go

package gitattr
import (
"io/ioutil"
"os"
"testing"
"github.com/git-lfs/gitobj"
"github.com/git-lfs/wildmatch"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
var (
dat = wildmatch.NewWildmatch("*.dat",
wildmatch.Basename,
wildmatch.SystemCase)
example = &Tree{
Lines: []*Line{{
Pattern: dat,
Attrs: []*Attr{
{
K: "filter", V: "lfs",
},
{
K: "diff", V: "lfs",
},
{
K: "merge", V: "lfs",
},
{
K: "text", V: "false",
},
},
}},
Children: map[string]*Tree{
"subdir": &Tree{
Lines: []*Line{{
Pattern: dat,
Attrs: []*Attr{
{
K: "subdir", V: "yes",
},
},
}},
},
},
}
)
func TestTreeAppliedInRoot(t *testing.T) {
attrs := example.Applied("a.dat")
assert.Len(t, attrs, 4)
assert.Equal(t, attrs[0], &Attr{K: "filter", V: "lfs"})
assert.Equal(t, attrs[1], &Attr{K: "diff", V: "lfs"})
assert.Equal(t, attrs[2], &Attr{K: "merge", V: "lfs"})
assert.Equal(t, attrs[3], &Attr{K: "text", V: "false"})
}
func TestTreeAppliedInSubtreeRelevant(t *testing.T) {
attrs := example.Applied("subdir/a.dat")
assert.Len(t, attrs, 5)
assert.Equal(t, attrs[0], &Attr{K: "filter", V: "lfs"})
assert.Equal(t, attrs[1], &Attr{K: "diff", V: "lfs"})
assert.Equal(t, attrs[2], &Attr{K: "merge", V: "lfs"})
assert.Equal(t, attrs[3], &Attr{K: "text", V: "false"})
assert.Equal(t, attrs[4], &Attr{K: "subdir", V: "yes"})
}
func TestTreeAppliedInSubtreeIrrelevant(t *testing.T) {
attrs := example.Applied("subdir/a.txt")
assert.Empty(t, attrs)
}
func TestTreeAppliedInIrrelevantSubtree(t *testing.T) {
attrs := example.Applied("other/subdir/a.dat")
assert.Len(t, attrs, 4)
assert.Equal(t, attrs[0], &Attr{K: "filter", V: "lfs"})
assert.Equal(t, attrs[1], &Attr{K: "diff", V: "lfs"})
assert.Equal(t, attrs[2], &Attr{K: "merge", V: "lfs"})
assert.Equal(t, attrs[3], &Attr{K: "text", V: "false"})
}
func TestNewDiscoversSimpleTrees(t *testing.T) {
tmp, err := ioutil.TempDir("", "")
require.NoError(t, err)
defer os.Remove(tmp)
db, err := gitobj.FromFilesystem(tmp, "")
require.NoError(t, err)
defer db.Close()
blob, err := db.WriteBlob(gitobj.NewBlobFromBytes([]byte(`
*.dat filter=lfs diff=lfs merge=lfs -text
`)))
require.NoError(t, err)
tree, err := New(db, &gitobj.Tree{Entries: []*gitobj.TreeEntry{
{
Name: ".gitattributes",
Oid: blob,
Filemode: 0100644,
},
}})
require.NoError(t, err)
attrs := tree.Applied("foo.dat")
assert.Len(t, attrs, 4)
assert.Equal(t, attrs[0], &Attr{K: "filter", V: "lfs"})
assert.Equal(t, attrs[1], &Attr{K: "diff", V: "lfs"})
assert.Equal(t, attrs[2], &Attr{K: "merge", V: "lfs"})
assert.Equal(t, attrs[3], &Attr{K: "text", V: "false"})
}
func TestNewDiscoversSimpleChildrenTrees(t *testing.T) {
tmp, err := ioutil.TempDir("", "")
require.NoError(t, err)
defer os.Remove(tmp)
db, err := gitobj.FromFilesystem(tmp, "")
require.NoError(t, err)
defer db.Close()
blob, err := db.WriteBlob(gitobj.NewBlobFromBytes([]byte(`
*.dat filter=lfs diff=lfs merge=lfs -text
`)))
require.NoError(t, err)
child, err := db.WriteTree(&gitobj.Tree{Entries: []*gitobj.TreeEntry{
{
Name: ".gitattributes",
Oid: blob,
Filemode: 0100644,
},
}})
tree, err := New(db, &gitobj.Tree{Entries: []*gitobj.TreeEntry{
{
Name: "child",
Oid: child,
Filemode: 040000,
},
}})
require.NoError(t, err)
assert.Empty(t, tree.Lines)
assert.Len(t, tree.Children, 1)
attrs := tree.Applied("child/foo.dat")
assert.Len(t, attrs, 4)
assert.Equal(t, attrs[0], &Attr{K: "filter", V: "lfs"})
assert.Equal(t, attrs[1], &Attr{K: "diff", V: "lfs"})
assert.Equal(t, attrs[2], &Attr{K: "merge", V: "lfs"})
assert.Equal(t, attrs[3], &Attr{K: "text", V: "false"})
}
func TestNewDiscoversIndirectChildrenTrees(t *testing.T) {
tmp, err := ioutil.TempDir("", "")
require.NoError(t, err)
defer os.Remove(tmp)
db, err := gitobj.FromFilesystem(tmp, "")
require.NoError(t, err)
defer db.Close()
blob, err := db.WriteBlob(gitobj.NewBlobFromBytes([]byte(`
*.dat filter=lfs diff=lfs merge=lfs -text
`)))
require.NoError(t, err)
indirect, err := db.WriteTree(&gitobj.Tree{Entries: []*gitobj.TreeEntry{
{
Name: ".gitattributes",
Oid: blob,
Filemode: 0100644,
},
}})
child, err := db.WriteTree(&gitobj.Tree{Entries: []*gitobj.TreeEntry{
{
Name: "indirect",
Oid: indirect,
Filemode: 040000,
},
}})
tree, err := New(db, &gitobj.Tree{Entries: []*gitobj.TreeEntry{
{
Name: "child",
Oid: child,
Filemode: 040000,
},
}})
require.NoError(t, err)
assert.Empty(t, tree.Lines)
assert.Len(t, tree.Children, 1)
attrs := tree.Applied("child/indirect/foo.dat")
assert.Len(t, attrs, 4)
assert.Equal(t, attrs[0], &Attr{K: "filter", V: "lfs"})
assert.Equal(t, attrs[1], &Attr{K: "diff", V: "lfs"})
assert.Equal(t, attrs[2], &Attr{K: "merge", V: "lfs"})
assert.Equal(t, attrs[3], &Attr{K: "text", V: "false"})
}
func TestNewIgnoresChildrenAppropriately(t *testing.T) {
tmp, err := ioutil.TempDir("", "")
require.NoError(t, err)
defer os.Remove(tmp)
db, err := gitobj.FromFilesystem(tmp, "")
require.NoError(t, err)
defer db.Close()
blob, err := db.WriteBlob(gitobj.NewBlobFromBytes([]byte(`
*.dat filter=lfs diff=lfs merge=lfs -text
`)))
require.NoError(t, err)
child, err := db.WriteTree(&gitobj.Tree{Entries: []*gitobj.TreeEntry{
{
Name: "README.md",
Oid: []byte("00000000000000000000"),
Filemode: 0100644,
},
}})
tree, err := New(db, &gitobj.Tree{Entries: []*gitobj.TreeEntry{
{
Name: ".gitattributes",
Oid: blob,
Filemode: 0100644,
},
{
Name: "child",
Oid: child,
Filemode: 040000,
},
}})
require.NoError(t, err)
assert.NotContains(t, tree.Children, "child")
}