@@ -23,10 +23,12 @@ package starlarkbundle
2323
2424import (
2525 "flag"
26+ "fmt"
2627 "io"
2728 "log"
2829 "maps"
2930 "os"
31+ "path/filepath"
3032 "strings"
3133
3234 "github.com/bazelbuild/bazel-gazelle/config"
@@ -39,17 +41,21 @@ import (
3941
4042const (
4143 languageName = "starlark_bundle"
44+ starlarkBundleRepoNameDirectiveName = "starlark_bundle_repo_name"
4245 starlarkBundleRootDirectiveName = "starlark_bundle_root"
4346 starlarkBundleExcludeDirectiveName = "starlark_bundle_exclude"
4447 starlarkBundleLogFileDirectiveName = "starlark_bundle_log_file"
4548 starlarkModuleDependencyDirectiveName = "module_dependency"
49+ coarseDependencies = true
4650)
4751
4852type starlarkBundleLang struct {
4953 starlarkBundleRoot * string
54+ starlarkBundleRepoName string
5055 starlarkBundleExcludeDirs []string
5156 moduleDeps map [string ]string
5257 starlarkLibraries map [label.Label ]* rule.Rule
58+ bzlFiles map [string ]bool
5359 logFile string
5460 logWriter * os.File
5561 logger * log.Logger
@@ -60,6 +66,7 @@ type starlarkBundleLang struct {
6066func NewLanguage () language.Language {
6167 return & starlarkBundleLang {
6268 starlarkLibraries : map [label.Label ]* rule.Rule {},
69+ bzlFiles : map [string ]bool {},
6370 moduleDeps : map [string ]string {},
6471 }
6572}
@@ -80,7 +87,7 @@ func (ext *starlarkBundleLang) RegisterFlags(fs *flag.FlagSet, cmd string, c *co
8087
8188func (ext * starlarkBundleLang ) CheckFlags (fs * flag.FlagSet , c * config.Config ) error {
8289 if ext .logFile != "" {
83- ext .createLogger (c , ext .logFile )
90+ ext .createLogger (ext .logFile )
8491 ext .logf ("CheckFlags: log file initialized from flag: %s" , ext .logFile )
8592 }
8693 if ext .logger == nil {
@@ -108,6 +115,8 @@ func (ext *starlarkBundleLang) Configure(c *config.Config, rel string, f *rule.F
108115 log .Fatalf ("gazelle:%s should only be set once (refusing to override %q with %q)" , starlarkBundleRootDirectiveName , * ext .starlarkBundleRoot , d .Value )
109116 }
110117 ext .starlarkBundleRoot = & rel
118+ case starlarkBundleRepoNameDirectiveName :
119+ ext .starlarkBundleRepoName = d .Value
111120 case starlarkBundleExcludeDirectiveName :
112121 ext .starlarkBundleExcludeDirs = append (ext .starlarkBundleExcludeDirs , d .Value )
113122 case starlarkModuleDependencyDirectiveName :
@@ -118,13 +127,13 @@ func (ext *starlarkBundleLang) Configure(c *config.Config, rel string, f *rule.F
118127 ext .moduleDeps [nameVersion [0 ]] = nameVersion [1 ]
119128 ext .logf ("Added module dependency: %q -> %q" , nameVersion [0 ], nameVersion [1 ])
120129 case starlarkBundleLogFileDirectiveName :
121- ext .createLogger (c , d .Value )
130+ ext .createLogger (d .Value )
122131 }
123132 }
124133 }
125134}
126135
127- func (ext * starlarkBundleLang ) createLogger (c * config. Config , logFile string ) {
136+ func (ext * starlarkBundleLang ) createLogger (logFile string ) {
128137 if logFile != "" {
129138 f , err := os .OpenFile (logFile , os .O_CREATE | os .O_WRONLY | os .O_TRUNC , 0666 )
130139 if err == nil {
@@ -202,7 +211,12 @@ func (ext *starlarkBundleLang) Resolve(c *config.Config, ix *resolve.RuleIndex,
202211 case starlarkLibraryKind :
203212 starlarkLibraryResolve (c , ix , r , importsRaw , from , ext )
204213 case starlarkBundleKind :
205- starlarkBundleResolve (r , ext .starlarkLibraries )
214+ if coarseDependencies {
215+ starlarkBundleResolveCoarse (r , ext .starlarkLibraries , ext .moduleDeps )
216+ } else {
217+ starlarkBundleResolve (r , ext .starlarkLibraries )
218+
219+ }
206220 }
207221}
208222
@@ -230,6 +244,26 @@ func (ext *starlarkBundleLang) GenerateRules(args language.GenerateArgs) (result
230244
231245 ext .logf ("GenerateRules: visiting %s" , args .Rel )
232246
247+ if args .Rel == "" {
248+ // REPO.bazel causes visibility issues if the root BUILD file has been
249+ // deleted but still referencing non-existent rules. This should be
250+ // moved to the part where gazelle cleans up build files.
251+ repoFile := filepath .Join (args .Config .RepoRoot , "REPO.bazel" )
252+ if _ , err := os .Stat (repoFile ); err == nil {
253+ ext .logf ("Removing REPO.bazel from root package" )
254+ if err := os .Remove (repoFile ); err != nil {
255+ ext .logf ("ERROR: failed to remove REPO.bazel: %v" , err )
256+ }
257+ }
258+
259+ bazelIgnore := filepath .Join (args .Config .RepoRoot , "REPO.bazel" )
260+ if _ , err := os .Stat (bazelIgnore ); err == nil {
261+ if err := ext .removeAbsolutePathsFromBazelignore (bazelIgnore ); err != nil {
262+ ext .logf ("ERROR: failed to cleanup .bazelignore file: %v" , err )
263+ }
264+ }
265+ }
266+
233267 for _ , r := range []language.GenerateResult {
234268 starlarkLibraryGenerate (args , ext .starlarkLibraries , ext ),
235269 starlarkBundleGenerate (args , ext .starlarkBundleRoot ),
@@ -264,3 +298,49 @@ func (ext *starlarkBundleLang) logf(format string, args ...any) {
264298 ext .logger .Printf (format , args ... )
265299 }
266300}
301+
302+ // removeAbsolutePathsFromBazelignore reads a .bazelignore file and removes
303+ // any lines that are absolute paths (starting with /).
304+ func (ext * starlarkBundleLang ) removeAbsolutePathsFromBazelignore (bazelignorePath string ) error {
305+ ext .logf ("Checking .bazelignore file: %s" , bazelignorePath )
306+
307+ // Read the file
308+ content , err := os .ReadFile (bazelignorePath )
309+ if err != nil {
310+ if os .IsNotExist (err ) {
311+ return nil // File doesn't exist, nothing to do
312+ }
313+ return fmt .Errorf ("failed to read .bazelignore: %w" , err )
314+ }
315+
316+ // Split into lines
317+ lines := strings .Split (string (content ), "\n " )
318+ var filteredLines []string
319+ removedCount := 0
320+
321+ for _ , line := range lines {
322+ trimmed := strings .TrimSpace (line )
323+ // Keep the line if it's not an absolute path
324+ if trimmed == "" || ! strings .HasPrefix (trimmed , "/" ) {
325+ filteredLines = append (filteredLines , line )
326+ } else {
327+ ext .logf (" Removing absolute path from .bazelignore: %q" , trimmed )
328+ removedCount ++
329+ }
330+ }
331+
332+ // If nothing changed, don't rewrite the file
333+ if removedCount == 0 {
334+ ext .logf (" No absolute paths found in .bazelignore" )
335+ return nil
336+ }
337+
338+ // Write back the filtered content
339+ newContent := strings .Join (filteredLines , "\n " )
340+ if err := os .WriteFile (bazelignorePath , []byte (newContent ), 0644 ); err != nil {
341+ return fmt .Errorf ("failed to write .bazelignore: %w" , err )
342+ }
343+
344+ ext .logf (" Removed %d absolute path(s) from .bazelignore" , removedCount )
345+ return nil
346+ }
0 commit comments