mirror of
https://github.com/octoleo/syncthing.git
synced 2025-04-01 23:31:53 +00:00
Handle recursive includes
This commit is contained in:
parent
c2daedbd11
commit
eebe0eeb71
@ -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.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user