Open alexeagle opened 2 years ago
I think Gazelle has enough users that Hyrum's law would be applied here. I wonder how many users have git-ignored files that end up in the targets that depend on a flow like:
go generate -> some git-ignored files -> gazelle -> bazel build
I believe it would be wise to make it opt-in rather than opt-out.
Facing a similar issue with git submodules. Would be happy to opt in.
As a data point, I tried the linked PR on our repo and it makes our generation time go from 2.5s to 4+s. It may make sense to advise people to put their generated junk in .bazelignore
(or ideally don't generate things into the source tree, though I understand half-migrated repos are "fun")
I think that would be a reason to make this opt-in, maybe with documentation pointing out that .bazelignore
is better?
FWIW the .bazelignore
is only faster since https://github.com/bazelbuild/bazel-gazelle/commit/5cd3717daec5e34808b616107145dd1a83e93b9a that stopped treating entries as globs.
https://github.com/aspect-build/aspect-cli/commit/a70f957fd61efb303dca637f640f654b071c8127#diff-b61fcd9f5596f8f5a65d234f9606c2b41a8b7c53ab2f7701e8a0baa7a6e6f218 includes a patch to gazelle that adds an extra ignore predicate check within walk.Walk. The following is the relevant walk code.
https://github.com/bazelbuild/bazel-gazelle/blob/master/walk/walk.go#L164-L184
I suppose gazelle's walk function could support user-configured hooks by, for example, reading all entries from config.Ext that implement some interface. The config loading code (getWalkConfig) could inspect c.Exts:
https://github.com/bazelbuild/bazel-gazelle/blob/master/walk/config.go#L40-L58
This is a major usability hurdle at one of Aspect's clients. Gazelle fails because they have some junk in their repo which is covered by a
.gitignore
so they don't realize they have an unclean state. The error messages when gazelle descends into these files is cryptic to them. They then ask a support question where it's not obvious thatgit clean -ffdx
is the solution.Gazelle should simply ignore things that are .gitignore'd (probably with a directive to opt-in/out)