Optimize .dockerignore when there are exclusions
Closes #20470 Before this PR we used to scan the entire build context when there were exclusions in the .dockerignore file (paths that started with !). Now we only traverse into subdirs when one of the exclusions starts with that dir path. Signed-off-by: Doug Davis <dug@us.ibm.com>
This commit is contained in:
parent
98943aafae
commit
f7e2d23879
1 changed files with 28 additions and 2 deletions
|
@ -582,11 +582,37 @@ func TarWithOptions(srcPath string, options *TarOptions) (io.ReadCloser, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
if skip {
|
if skip {
|
||||||
if !exceptions && f.IsDir() {
|
// If we want to skip this file and its a directory
|
||||||
|
// then we should first check to see if there's an
|
||||||
|
// excludes pattern (eg !dir/file) that starts with this
|
||||||
|
// dir. If so then we can't skip this dir.
|
||||||
|
|
||||||
|
// Its not a dir then so we can just return/skip.
|
||||||
|
if !f.IsDir() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// No exceptions (!...) in patterns so just skip dir
|
||||||
|
if !exceptions {
|
||||||
return filepath.SkipDir
|
return filepath.SkipDir
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dirSlash := relFilePath + string(filepath.Separator)
|
||||||
|
|
||||||
|
for _, pat := range patterns {
|
||||||
|
if pat[0] != '!' {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
pat = pat[1:] + string(filepath.Separator)
|
||||||
|
if strings.HasPrefix(pat, dirSlash) {
|
||||||
|
// found a match - so can't skip this dir
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// No matching exclusion dir so just skip dir
|
||||||
|
return filepath.SkipDir
|
||||||
|
}
|
||||||
|
|
||||||
if seen[relFilePath] {
|
if seen[relFilePath] {
|
||||||
return nil
|
return nil
|
||||||
|
|
Loading…
Reference in a new issue