Handle recursive includes

This commit is contained in:
Audrius Butkevicius 2014-08-30 22:32:17 +01:00
parent c2daedbd11
commit eebe0eeb71

View File

@ -99,7 +99,8 @@ func (w *Walker) loadIgnoreFiles(dir string, ignores *[]*regexp.Regexp) filepath
if pn, sn := filepath.Split(rn); sn == w.IgnoreFile { if pn, sn := filepath.Split(rn); sn == w.IgnoreFile {
pn := filepath.Clean(pn) pn := filepath.Clean(pn)
dirIgnores := loadIgnoreFile(p, pn) filesSeen := make(map[string]map[string]bool)
dirIgnores := loadIgnoreFile(p, pn, filesSeen)
*ignores = append(*ignores, dirIgnores...) *ignores = append(*ignores, dirIgnores...)
} }
@ -107,16 +108,16 @@ func (w *Walker) loadIgnoreFiles(dir string, ignores *[]*regexp.Regexp) filepath
} }
} }
func loadIgnoreFile(ignFile, base string) []*regexp.Regexp { func loadIgnoreFile(ignFile, base string, filesSeen map[string]map[string]bool) []*regexp.Regexp {
fd, err := os.Open(ignFile) fd, err := os.Open(ignFile)
if err != nil { if err != nil {
return nil return nil
} }
defer fd.Close() defer fd.Close()
return parseIgnoreFile(fd, base, filepath.Dir(ignFile)) return parseIgnoreFile(fd, base, ignFile, filesSeen)
} }
func parseIgnoreFile(fd io.Reader, base, dir string) []*regexp.Regexp { func parseIgnoreFile(fd io.Reader, base, currentFile string, filesSeen map[string]map[string]bool) []*regexp.Regexp {
var exps []*regexp.Regexp var exps []*regexp.Regexp
scanner := bufio.NewScanner(fd) scanner := bufio.NewScanner(fd)
for scanner.Scan() { for scanner.Scan() {
@ -149,13 +150,26 @@ func parseIgnoreFile(fd io.Reader, base, dir string) []*regexp.Regexp {
} }
exps = append(exps, exp) exps = append(exps, exp)
} else if strings.HasPrefix(line, "#include ") { } else if strings.HasPrefix(line, "#include ") {
includeFile := filepath.Join(dir, strings.Replace(line, "#include ", "", 1)) includeFile := filepath.Join(filepath.Dir(currentFile), strings.Replace(line, "#include ", "", 1))
if _, err := os.Stat(includeFile); os.IsNotExist(err) { if _, err := os.Stat(includeFile); os.IsNotExist(err) {
l.Infoln("Could not open ignore include file", includeFile) l.Infoln("Could not open ignore include file", includeFile)
} else { } else {
includes := loadIgnoreFile(includeFile, base) seen := false
if seenByCurrent, ok := filesSeen[currentFile]; ok {
_, seen = seenByCurrent[includeFile]
}
if seen {
l.Warnf("Recursion detected while including %s from %s", includeFile, currentFile)
} else {
if filesSeen[currentFile] == nil {
filesSeen[currentFile] = make(map[string]bool)
}
filesSeen[currentFile][includeFile] = true
includes := loadIgnoreFile(includeFile, base, filesSeen)
exps = append(exps, includes...) exps = append(exps, includes...)
} }
}
} else { } else {
// Path name or pattern, add it so it matches files both in // Path name or pattern, add it so it matches files both in
// current directory and subdirs. // current directory and subdirs.