Skip to content

Commit

Permalink
perf: preload .bazelignore before configure, do not use globs
Browse files Browse the repository at this point in the history
  • Loading branch information
jbedard committed Aug 22, 2024
1 parent 4d93f01 commit e5783ef
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 16 deletions.
35 changes: 21 additions & 14 deletions walk/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import (
"os"
"path"
"strings"
"sync"

"github.com/bazelbuild/bazel-gazelle/config"
"github.com/bazelbuild/bazel-gazelle/rule"
Expand All @@ -42,7 +41,6 @@ type walkConfig struct {
excludes []string
ignore bool
follow []string
loadOnce *sync.Once
}

const walkName = "_walk"
Expand All @@ -67,7 +65,7 @@ var _ config.Configurer = (*Configurer)(nil)
type Configurer struct{}

func (*Configurer) RegisterFlags(fs *flag.FlagSet, cmd string, c *config.Config) {
wc := &walkConfig{loadOnce: &sync.Once{}}
wc := &walkConfig{}
c.Exts[walkName] = wc
fs.Var(&gzflag.MultiFlag{Values: &wc.excludes}, "exclude", "pattern that should be ignored (may be repeated)")
}
Expand All @@ -84,12 +82,6 @@ func (cr *Configurer) Configure(c *config.Config, rel string, f *rule.File) {
*wcCopy = *wc
wcCopy.ignore = false

wc.loadOnce.Do(func() {
if err := cr.loadBazelIgnore(c.RepoRoot, wcCopy); err != nil {
log.Printf("error loading .bazelignore: %v", err)
}
})

if f != nil {
for _, d := range f.Directives {
switch d.Key {
Expand All @@ -114,17 +106,26 @@ func (cr *Configurer) Configure(c *config.Config, rel string, f *rule.File) {
c.Exts[walkName] = wcCopy
}

func (c *Configurer) loadBazelIgnore(repoRoot string, wc *walkConfig) error {
type isIgnoredFunc = func(string) bool

var nothingIgnored isIgnoredFunc = func(string) bool { return false }

// Repo-wide bazelignore paths.
// Only applies to files on disk, not generated files.
// Does not support glob patterns.
func loadBazelIgnore(repoRoot string) (isIgnoredFunc, error) {
ignorePath := path.Join(repoRoot, ".bazelignore")
file, err := os.Open(ignorePath)
if errors.Is(err, fs.ErrNotExist) {
return nil
return nothingIgnored, nil
}
if err != nil {
return fmt.Errorf(".bazelignore exists but couldn't be read: %v", err)
return nothingIgnored, fmt.Errorf(".bazelignore exists but couldn't be read: %v", err)
}
defer file.Close()

excludes := make(map[string]struct{})

scanner := bufio.NewScanner(file)
for scanner.Scan() {
ignore := strings.TrimSpace(scanner.Text())
Expand All @@ -142,9 +143,15 @@ func (c *Configurer) loadBazelIgnore(repoRoot string, wc *walkConfig) error {
// the exclude matching won't work correctly.
ignore = path.Clean(ignore)

wc.excludes = append(wc.excludes, ignore)
excludes[ignore] = struct{}{}
}

isIgnored := func(p string) bool {
_, ok := excludes[p]
return ok
}
return nil

return isIgnored, nil
}

func checkPathMatchPattern(pattern string) error {
Expand Down
17 changes: 15 additions & 2 deletions walk/walk.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,11 @@ func Walk(c *config.Config, cexts []config.Configurer, dirs []string, mode Mode,

updateRels := NewUpdateFilter(c.RepoRoot, dirs, mode)

isBazelIgnored, err := loadBazelIgnore(c.RepoRoot)
if err != nil {
log.Printf("error loading .bazelignore: %v", err)
}

var visit func(*config.Config, string, string, bool)
visit = func(c *config.Config, dir, rel string, updateParent bool) {
haveError := false
Expand All @@ -141,6 +146,10 @@ func Walk(c *config.Config, cexts []config.Configurer, dirs []string, mode Mode,
haveError = true
}

if isBazelIgnored(rel) {
return
}

c = configure(cexts, knownDirectives, c, rel, f)
wc := getWalkConfig(c)

Expand All @@ -151,6 +160,10 @@ func Walk(c *config.Config, cexts []config.Configurer, dirs []string, mode Mode,
var subdirs, regularFiles []string
for _, ent := range ents {
base := ent.Name()
repoRel := path.Join(rel, base)
if isBazelIgnored(repoRel) || wc.isExcluded(rel, base) {
continue
}
ent := resolveFileInfo(wc, dir, rel, ent)
switch {
case ent == nil:
Expand Down Expand Up @@ -326,14 +339,14 @@ func findGenFiles(wc *walkConfig, f *rule.File) []string {

func resolveFileInfo(wc *walkConfig, dir, rel string, ent fs.DirEntry) fs.DirEntry {
base := ent.Name()
if base == "" || wc.isExcluded(rel, base) {
if base == "" {
return nil
}
if ent.Type()&os.ModeSymlink == 0 {
// Not a symlink, use the original FileInfo.
return ent
}
if !wc.shouldFollow(rel, ent.Name()) {
if !wc.shouldFollow(rel, base) {
// A symlink, but not one we should follow.
return nil
}
Expand Down

0 comments on commit e5783ef

Please sign in to comment.