Skip to content

Commit

Permalink
Merge pull request #785 from AriehSchneier/gitignore-relative-any-user
Browse files Browse the repository at this point in the history
plumbing: gitignore, Allow gitconfig to contain a gitignore relative to any user home. Fixes #578
  • Loading branch information
pjbgf committed Jun 4, 2023
2 parents 87d35b7 + 4ed9ded commit dd067af
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 11 deletions.
16 changes: 13 additions & 3 deletions plumbing/format/gitignore/dir.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"bytes"
"io"
"os"
"os/user"
"strings"

"github.com/go-git/go-billy/v5"
Expand All @@ -27,9 +28,18 @@ const (
func readIgnoreFile(fs billy.Filesystem, path []string, ignoreFile string) (ps []Pattern, err error) {

if strings.HasPrefix(ignoreFile, "~") {
home, err := os.UserHomeDir()
if err == nil {
ignoreFile = strings.Replace(ignoreFile, "~", home, 1)
firstSlash := strings.Index(ignoreFile, "/")
if firstSlash == 1 {
home, err := os.UserHomeDir()
if err == nil {
ignoreFile = strings.Replace(ignoreFile, "~", home, 1)
}
} else if firstSlash > 1 {
username := ignoreFile[1:firstSlash]
userAccount, err := user.Lookup(username)
if err == nil {
ignoreFile = strings.Replace(ignoreFile, ignoreFile[:firstSlash], userAccount.HomeDir, 1)
}
}
}

Expand Down
52 changes: 44 additions & 8 deletions plumbing/format/gitignore/dir_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package gitignore

import (
"os"
"os/user"
"strconv"
"strings"

"github.com/go-git/go-billy/v5"
"github.com/go-git/go-billy/v5/memfs"
Expand All @@ -12,7 +14,8 @@ import (
type MatcherSuite struct {
GFS billy.Filesystem // git repository root
RFS billy.Filesystem // root that contains user home
RFSR billy.Filesystem // root that contains user home, but with with relative ~/.gitignore_global
RFSR billy.Filesystem // root that contains user home, but with relative ~/.gitignore_global
RFSU billy.Filesystem // root that contains user home, but with relative ~user/.gitignore_global
MCFS billy.Filesystem // root that contains user home, but missing ~/.gitconfig
MEFS billy.Filesystem // root that contains user home, but missing excludesfile entry
MIFS billy.Filesystem // root that contains user home, but missing .gitignore
Expand Down Expand Up @@ -144,6 +147,37 @@ func (s *MatcherSuite) SetUpTest(c *C) {

s.RFSR = fs

// root that contains user home, but with relative ~user/.gitignore_global
fs = memfs.New()
err = fs.MkdirAll(home, os.ModePerm)
c.Assert(err, IsNil)

f, err = fs.Create(fs.Join(home, gitconfigFile))
c.Assert(err, IsNil)
_, err = f.Write([]byte("[core]\n"))
c.Assert(err, IsNil)
currentUser, err := user.Current()
c.Assert(err, IsNil)
// remove domain for windows
username := currentUser.Username[strings.Index(currentUser.Username, "\\")+1:]
_, err = f.Write([]byte(" excludesfile = ~" + username + "/.gitignore_global" + "\n"))
c.Assert(err, IsNil)
err = f.Close()
c.Assert(err, IsNil)

f, err = fs.Create(fs.Join(home, ".gitignore_global"))
c.Assert(err, IsNil)
_, err = f.Write([]byte("# IntelliJ\n"))
c.Assert(err, IsNil)
_, err = f.Write([]byte(".idea/\n"))
c.Assert(err, IsNil)
_, err = f.Write([]byte("*.iml\n"))
c.Assert(err, IsNil)
err = f.Close()
c.Assert(err, IsNil)

s.RFSU = fs

// root that contains user home, but missing ~/.gitconfig
fs = memfs.New()
err = fs.MkdirAll(home, os.ModePerm)
Expand Down Expand Up @@ -255,14 +289,16 @@ func (s *MatcherSuite) TestDir_ReadPatterns(c *C) {
}

func (s *MatcherSuite) TestDir_ReadRelativeGlobalGitIgnore(c *C) {
ps, err := LoadGlobalPatterns(s.RFSR)
c.Assert(err, IsNil)
c.Assert(ps, HasLen, 2)
for _, fs := range []billy.Filesystem{s.RFSR, s.RFSU} {
ps, err := LoadGlobalPatterns(fs)
c.Assert(err, IsNil)
c.Assert(ps, HasLen, 2)

m := NewMatcher(ps)
c.Assert(m.Match([]string{".idea/"}, true), Equals, false)
c.Assert(m.Match([]string{"*.iml"}, true), Equals, true)
c.Assert(m.Match([]string{"IntelliJ"}, true), Equals, false)
m := NewMatcher(ps)
c.Assert(m.Match([]string{".idea/"}, true), Equals, false)
c.Assert(m.Match([]string{"*.iml"}, true), Equals, true)
c.Assert(m.Match([]string{"IntelliJ"}, true), Equals, false)
}
}

func (s *MatcherSuite) TestDir_LoadGlobalPatterns(c *C) {
Expand Down

0 comments on commit dd067af

Please sign in to comment.