package gitattributes
import (
"os"
"os/user"
"strconv"
"github.com/go-git/go-billy/v5"
"github.com/go-git/go-billy/v5/memfs"
. "gopkg.in/check.v1"
)
type MatcherSuite struct {
GFS billy.Filesystem // git repository root
RFS billy.Filesystem // root that contains user home
MCFS billy.Filesystem // root that contains user home, but missing ~/.gitattributes
MEFS billy.Filesystem // root that contains user home, but missing attributesfile entry
MIFS billy.Filesystem // root that contains user home, but missing .gitattributes
SFS billy.Filesystem // root that contains /etc/gitattributes
}
var _ = Suite(&MatcherSuite{})
func (s *MatcherSuite) SetUpTest(c *C) {
// setup root that contains user home
usr, err := user.Current()
c.Assert(err, IsNil)
gitAttributesGlobal := func(fs billy.Filesystem, filename string) {
f, err := fs.Create(filename)
c.Assert(err, IsNil)
_, err = f.Write([]byte("# IntelliJ\n"))
c.Assert(err, IsNil)
_, err = f.Write([]byte(".idea/** text\n"))
c.Assert(err, IsNil)
_, err = f.Write([]byte("*.iml -text\n"))
c.Assert(err, IsNil)
err = f.Close()
c.Assert(err, IsNil)
}
// setup generic git repository root
fs := memfs.New()
f, err := fs.Create(".gitattributes")
c.Assert(err, IsNil)
_, err = f.Write([]byte("vendor/g*/** foo=bar\n"))
c.Assert(err, IsNil)
err = f.Close()
c.Assert(err, IsNil)
err = fs.MkdirAll("vendor", os.ModePerm)
c.Assert(err, IsNil)
f, err = fs.Create("vendor/.gitattributes")
c.Assert(err, IsNil)
_, err = f.Write([]byte("github.com/** -foo\n"))
c.Assert(err, IsNil)
err = f.Close()
c.Assert(err, IsNil)
fs.MkdirAll("another", os.ModePerm)
fs.MkdirAll("vendor/github.com", os.ModePerm)
fs.MkdirAll("vendor/gopkg.in", os.ModePerm)
gitAttributesGlobal(fs, fs.Join(usr.HomeDir, ".gitattributes_global"))
s.GFS = fs
fs = memfs.New()
err = fs.MkdirAll(usr.HomeDir, os.ModePerm)
c.Assert(err, IsNil)
f, err = fs.Create(fs.Join(usr.HomeDir, gitconfigFile))
c.Assert(err, IsNil)
_, err = f.Write([]byte("[core]\n"))
c.Assert(err, IsNil)
_, err = f.Write([]byte(" attributesfile = " + strconv.Quote(fs.Join(usr.HomeDir, ".gitattributes_global")) + "\n"))
c.Assert(err, IsNil)
err = f.Close()
c.Assert(err, IsNil)
gitAttributesGlobal(fs, fs.Join(usr.HomeDir, ".gitattributes_global"))
s.RFS = fs
// root that contains user home, but missing ~/.gitconfig
fs = memfs.New()
gitAttributesGlobal(fs, fs.Join(usr.HomeDir, ".gitattributes_global"))
s.MCFS = fs
// setup root that contains user home, but missing attributesfile entry
fs = memfs.New()
err = fs.MkdirAll(usr.HomeDir, os.ModePerm)
c.Assert(err, IsNil)
f, err = fs.Create(fs.Join(usr.HomeDir, gitconfigFile))
c.Assert(err, IsNil)
_, err = f.Write([]byte("[core]\n"))
c.Assert(err, IsNil)
err = f.Close()
c.Assert(err, IsNil)
gitAttributesGlobal(fs, fs.Join(usr.HomeDir, ".gitattributes_global"))
s.MEFS = fs
// setup root that contains user home, but missing .gitattributes
fs = memfs.New()
err = fs.MkdirAll(usr.HomeDir, os.ModePerm)
c.Assert(err, IsNil)
f, err = fs.Create(fs.Join(usr.HomeDir, gitconfigFile))
c.Assert(err, IsNil)
_, err = f.Write([]byte("[core]\n"))
c.Assert(err, IsNil)
_, err = f.Write([]byte(" attributesfile = " + strconv.Quote(fs.Join(usr.HomeDir, ".gitattributes_global")) + "\n"))
c.Assert(err, IsNil)
err = f.Close()
c.Assert(err, IsNil)
s.MIFS = fs
// setup root that contains user home
fs = memfs.New()
err = fs.MkdirAll("etc", os.ModePerm)
c.Assert(err, IsNil)
f, err = fs.Create(systemFile)
c.Assert(err, IsNil)
_, err = f.Write([]byte("[core]\n"))
c.Assert(err, IsNil)
_, err = f.Write([]byte(" attributesfile = /etc/gitattributes_global\n"))
c.Assert(err, IsNil)
err = f.Close()
c.Assert(err, IsNil)
gitAttributesGlobal(fs, "/etc/gitattributes_global")
s.SFS = fs
}
func (s *MatcherSuite) TestDir_ReadPatterns(c *C) {
ps, err := ReadPatterns(s.GFS, nil)
c.Assert(err, IsNil)
c.Assert(ps, HasLen, 2)
m := NewMatcher(ps)
results, _ := m.Match([]string{"vendor", "gopkg.in", "file"}, nil)
c.Assert(results["foo"].Value(), Equals, "bar")
results, _ = m.Match([]string{"vendor", "github.com", "file"}, nil)
c.Assert(results["foo"].IsUnset(), Equals, false)
}
func (s *MatcherSuite) TestDir_LoadGlobalPatterns(c *C) {
ps, err := LoadGlobalPatterns(s.RFS)
c.Assert(err, IsNil)
c.Assert(ps, HasLen, 2)
m := NewMatcher(ps)
results, _ := m.Match([]string{"go-git.v4.iml"}, nil)
c.Assert(results["text"].IsUnset(), Equals, true)
results, _ = m.Match([]string{".idea", "file"}, nil)
c.Assert(results["text"].IsSet(), Equals, true)
}
func (s *MatcherSuite) TestDir_LoadGlobalPatternsMissingGitconfig(c *C) {
ps, err := LoadGlobalPatterns(s.MCFS)
c.Assert(err, IsNil)
c.Assert(ps, HasLen, 0)
}
func (s *MatcherSuite) TestDir_LoadGlobalPatternsMissingAttributesfile(c *C) {
ps, err := LoadGlobalPatterns(s.MEFS)
c.Assert(err, IsNil)
c.Assert(ps, HasLen, 0)
}
func (s *MatcherSuite) TestDir_LoadGlobalPatternsMissingGitattributes(c *C) {
ps, err := LoadGlobalPatterns(s.MIFS)
c.Assert(err, IsNil)
c.Assert(ps, HasLen, 0)
}
func (s *MatcherSuite) TestDir_LoadSystemPatterns(c *C) {
ps, err := LoadSystemPatterns(s.SFS)
c.Assert(err, IsNil)
c.Assert(ps, HasLen, 2)
m := NewMatcher(ps)
results, _ := m.Match([]string{"go-git.v4.iml"}, nil)
c.Assert(results["text"].IsUnset(), Equals, true)
results, _ = m.Match([]string{".idea", "file"}, nil)
c.Assert(results["text"].IsSet(), Equals, true)
}