package gitignore import ( "io/ioutil" "os" "strings" "gopkg.in/src-d/go-billy.v3" ) const ( commentPrefix = "#" eol = "\n" gitDir = ".git" gitignoreFile = ".gitignore" ) // ReadPatterns reads 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) { f, err := fs.Open(fs.Join(append(path, gitignoreFile)...)) if err == nil { defer f.Close() if data, err := ioutil.ReadAll(f); err == nil { for _, s := range strings.Split(string(data), eol) { if !strings.HasPrefix(s, commentPrefix) && len(strings.TrimSpace(s)) > 0 { ps = append(ps, ParsePattern(s, path)) } } } } else if !os.IsNotExist(err) { return nil, err } var fis []os.FileInfo fis, err = fs.ReadDir(fs.Join(path...)) if err != nil { return } for _, fi := range fis { if fi.IsDir() && fi.Name() != gitDir { var subps []Pattern subps, err = ReadPatterns(fs, append(path, fi.Name())) if err != nil { return } if len(subps) > 0 { ps = append(ps, subps...) } } } return }