aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorenisdenjo <badurinadenis@gmail.com>2021-10-27 22:57:41 +0200
committerenisdenjo <badurinadenis@gmail.com>2021-10-27 22:59:03 +0200
commit55b186dc6178ad9c47821aeb684073dbf6893ed3 (patch)
tree0d756feff173efcb7cd43591469dcf967f501b67
parent99457e570d34320b12fb4fcd0f054f3d0b1d3eec (diff)
downloadgo-git-55b186dc6178ad9c47821aeb684073dbf6893ed3.tar.gz
plumbing: gitignore, Read .git/info/exclude file too.
-rw-r--r--plumbing/format/gitignore/dir.go25
-rw-r--r--plumbing/format/gitignore/dir_test.go43
2 files changed, 58 insertions, 10 deletions
diff --git a/plumbing/format/gitignore/dir.go b/plumbing/format/gitignore/dir.go
index 7cea50c..15bc9c7 100644
--- a/plumbing/format/gitignore/dir.go
+++ b/plumbing/format/gitignore/dir.go
@@ -13,13 +13,14 @@ import (
)
const (
- commentPrefix = "#"
- coreSection = "core"
- excludesfile = "excludesfile"
- gitDir = ".git"
- gitignoreFile = ".gitignore"
- gitconfigFile = ".gitconfig"
- systemFile = "/etc/gitconfig"
+ commentPrefix = "#"
+ coreSection = "core"
+ excludesfile = "excludesfile"
+ gitDir = ".git"
+ gitignoreFile = ".gitignore"
+ gitconfigFile = ".gitconfig"
+ systemFile = "/etc/gitconfig"
+ infoExcludeFile = gitDir + "/info/exclude"
)
// readIgnoreFile reads a specific git ignore file.
@@ -42,10 +43,14 @@ func readIgnoreFile(fs billy.Filesystem, path []string, ignoreFile string) (ps [
return
}
-// ReadPatterns reads gitignore patterns recursively traversing through the directory
-// structure. The result is in the ascending order of priority (last higher).
+// ReadPatterns reads the .git/info/exclude and then the gitignore patterns
+// recursively traversing through the directory structure. The result is in
+// the ascending order of priority (last higher).
func ReadPatterns(fs billy.Filesystem, path []string) (ps []Pattern, err error) {
- ps, _ = readIgnoreFile(fs, path, gitignoreFile)
+ ps, _ = readIgnoreFile(fs, path, infoExcludeFile)
+
+ subps, _ := readIgnoreFile(fs, path, gitignoreFile)
+ ps = append(ps, subps...)
var fis []os.FileInfo
fis, err = fs.ReadDir(fs.Join(path...))
diff --git a/plumbing/format/gitignore/dir_test.go b/plumbing/format/gitignore/dir_test.go
index 94ed7be..f2cf7a8 100644
--- a/plumbing/format/gitignore/dir_test.go
+++ b/plumbing/format/gitignore/dir_test.go
@@ -11,6 +11,7 @@ import (
type MatcherSuite struct {
GFS billy.Filesystem // git repository root
+ IEFS billy.Filesystem // git repository root using info/exclude instead
RFS billy.Filesystem // root that contains user home
MCFS billy.Filesystem // root that contains user home, but missing ~/.gitconfig
MEFS billy.Filesystem // root that contains user home, but missing excludesfile entry
@@ -53,6 +54,39 @@ func (s *MatcherSuite) SetUpTest(c *C) {
s.GFS = fs
+ // setup generic git repository root using info/exclude instead
+ fs = memfs.New()
+ err = fs.MkdirAll(".git/info", os.ModePerm)
+ c.Assert(err, IsNil)
+ f, err = fs.Create(".git/info/exclude")
+ c.Assert(err, IsNil)
+ _, err = f.Write([]byte("vendor/g*/\n"))
+ c.Assert(err, IsNil)
+ _, err = f.Write([]byte("ignore.crlf\r\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/.gitignore")
+ c.Assert(err, IsNil)
+ _, err = f.Write([]byte("!github.com/\n"))
+ c.Assert(err, IsNil)
+ err = f.Close()
+ c.Assert(err, IsNil)
+
+ err = fs.MkdirAll("another", os.ModePerm)
+ c.Assert(err, IsNil)
+ err = fs.MkdirAll("ignore.crlf", os.ModePerm)
+ c.Assert(err, IsNil)
+ err = fs.MkdirAll("vendor/github.com", os.ModePerm)
+ c.Assert(err, IsNil)
+ err = fs.MkdirAll("vendor/gopkg.in", os.ModePerm)
+ c.Assert(err, IsNil)
+
+ s.IEFS = fs
+
// setup root that contains user home
home, err := os.UserHomeDir()
c.Assert(err, IsNil)
@@ -179,6 +213,15 @@ func (s *MatcherSuite) TestDir_ReadPatterns(c *C) {
c.Assert(m.Match([]string{"ignore.crlf"}, true), Equals, true)
c.Assert(m.Match([]string{"vendor", "gopkg.in"}, true), Equals, true)
c.Assert(m.Match([]string{"vendor", "github.com"}, true), Equals, false)
+
+ ps, err = ReadPatterns(s.IEFS, nil)
+ c.Assert(err, IsNil)
+ c.Assert(ps, HasLen, 3)
+
+ m = NewMatcher(ps)
+ c.Assert(m.Match([]string{"ignore.crlf"}, true), Equals, true)
+ c.Assert(m.Match([]string{"vendor", "gopkg.in"}, true), Equals, true)
+ c.Assert(m.Match([]string{"vendor", "github.com"}, true), Equals, false)
}
func (s *MatcherSuite) TestDir_LoadGlobalPatterns(c *C) {