@@ -23,8 +23,10 @@ package starlarkbundle
2323
2424import (
2525 "flag"
26+ "io"
2627 "log"
2728 "maps"
29+ "os"
2830 "strings"
2931
3032 "github.com/bazelbuild/bazel-gazelle/config"
@@ -36,22 +38,29 @@ import (
3638)
3739
3840const (
39- languageName = "starlark_bundle"
40- starlarkBundleRootDirectiveName = "starlark_bundle_root"
41- starlarkBundleExcludeDirectiveName = "starlark_bundle_exclude"
41+ languageName = "starlark_bundle"
42+ starlarkBundleRootDirectiveName = "starlark_bundle_root"
43+ starlarkBundleExcludeDirectiveName = "starlark_bundle_exclude"
44+ starlarkBundleLogFileDirectiveName = "starlark_bundle_log_file"
45+ starlarkModuleDependencyDirectiveName = "module_dependency"
4246)
4347
4448type starlarkBundleLang struct {
4549 starlarkBundleRoot * string
4650 starlarkBundleExcludeDirs []string
51+ moduleDeps map [string ]string
4752 starlarkLibraries map [label.Label ]* rule.Rule
53+ logFile string
54+ logWriter * os.File
55+ logger * log.Logger
4856}
4957
5058// NewLanguage is called by Gazelle to install this language extension in a
5159// binary.
5260func NewLanguage () language.Language {
5361 return & starlarkBundleLang {
54- starlarkLibraries : make (map [label.Label ]* rule.Rule ),
62+ starlarkLibraries : map [label.Label ]* rule.Rule {},
63+ moduleDeps : map [string ]string {},
5564 }
5665}
5766
@@ -66,21 +75,32 @@ func (*starlarkBundleLang) Name() string {
6675// https://pkg.go.dev/github.com/bazelbuild/bazel-gazelle/resolve?tab=doc#Resolver
6776// interface, but are otherwise unused.
6877func (ext * starlarkBundleLang ) RegisterFlags (fs * flag.FlagSet , cmd string , c * config.Config ) {
78+ fs .StringVar (& ext .logFile , "starlark_bundle_log" , "" , "path to log file for starlark_bundle extension" )
6979}
7080
71- func (* starlarkBundleLang ) CheckFlags (fs * flag.FlagSet , c * config.Config ) error {
81+ func (ext * starlarkBundleLang ) CheckFlags (fs * flag.FlagSet , c * config.Config ) error {
82+ if ext .logFile != "" {
83+ ext .createLogger (c , ext .logFile )
84+ ext .logf ("CheckFlags: log file initialized from flag: %s" , ext .logFile )
85+ }
86+ if ext .logger == nil {
87+ ext .logger = log .New (io .Discard , "" , 0 )
88+ }
7289 return nil
7390}
7491
7592func (* starlarkBundleLang ) KnownDirectives () []string {
7693 return []string {
7794 starlarkBundleRootDirectiveName ,
7895 starlarkBundleExcludeDirectiveName ,
96+ starlarkBundleLogFileDirectiveName ,
97+ starlarkModuleDependencyDirectiveName ,
7998 }
8099}
81100
82101func (ext * starlarkBundleLang ) Configure (c * config.Config , rel string , f * rule.File ) {
83102 if f != nil {
103+ ext .logf ("Configure: processing %d directives in %s" , len (f .Directives ), rel )
84104 for _ , d := range f .Directives {
85105 switch d .Key {
86106 case starlarkBundleRootDirectiveName :
@@ -90,11 +110,37 @@ func (ext *starlarkBundleLang) Configure(c *config.Config, rel string, f *rule.F
90110 ext .starlarkBundleRoot = & rel
91111 case starlarkBundleExcludeDirectiveName :
92112 ext .starlarkBundleExcludeDirs = append (ext .starlarkBundleExcludeDirs , d .Value )
113+ case starlarkModuleDependencyDirectiveName :
114+ nameVersion := strings .Fields (d .Value )
115+ if len (nameVersion ) != 2 {
116+ log .Fatalf ("malformed directive %s, should be NAME VERSION: %s" , starlarkModuleDependencyDirectiveName , d .Value )
117+ }
118+ ext .moduleDeps [nameVersion [0 ]] = nameVersion [1 ]
119+ ext .logf ("Added module dependency: %q -> %q" , nameVersion [0 ], nameVersion [1 ])
120+ case starlarkBundleLogFileDirectiveName :
121+ ext .createLogger (c , d .Value )
93122 }
94123 }
95124 }
96125}
97126
127+ func (ext * starlarkBundleLang ) createLogger (c * config.Config , logFile string ) {
128+ if logFile != "" {
129+ f , err := os .OpenFile (logFile , os .O_CREATE | os .O_WRONLY | os .O_TRUNC , 0666 )
130+ if err == nil {
131+ ext .logWriter = f
132+ ext .logger = log .New (f , "" , log .LstdFlags )
133+ } else {
134+ log .Fatalf ("attempting to open log file: %v" , err )
135+ }
136+ }
137+ if false && ext .logger == nil {
138+ ext .logger = log .New (io .Discard , "" , 0 )
139+ }
140+
141+ ext .logf ("Log initialized" )
142+ }
143+
98144// Kinds returns a map of maps rule names (kinds) and information on how to
99145// match and merge attributes that may be found in rules of those kinds. All
100146// kinds of rules generated for this language may be found here.
@@ -154,7 +200,7 @@ func (*starlarkBundleLang) Embeds(r *rule.Rule, from label.Label) []label.Label
154200func (ext * starlarkBundleLang ) Resolve (c * config.Config , ix * resolve.RuleIndex , rc * repo.RemoteCache , r * rule.Rule , importsRaw interface {}, from label.Label ) {
155201 switch r .Kind () {
156202 case starlarkLibraryKind :
157- starlarkLibraryResolve (c , ix , r , importsRaw , from )
203+ starlarkLibraryResolve (c , ix , r , importsRaw , from , ext )
158204 case starlarkBundleKind :
159205 starlarkBundleResolve (r , ext .starlarkLibraries )
160206 }
@@ -182,8 +228,10 @@ func (ext *starlarkBundleLang) GenerateRules(args language.GenerateArgs) (result
182228 }
183229 }
184230
231+ ext .logf ("GenerateRules: visiting %s" , args .Rel )
232+
185233 for _ , r := range []language.GenerateResult {
186- starlarkLibraryGenerate (args , ext .starlarkLibraries ),
234+ starlarkLibraryGenerate (args , ext .starlarkLibraries , ext ),
187235 starlarkBundleGenerate (args , ext .starlarkBundleRoot ),
188236 } {
189237 result .Gen = append (result .Gen , r .Gen ... )
@@ -193,3 +241,26 @@ func (ext *starlarkBundleLang) GenerateRules(args language.GenerateArgs) (result
193241
194242 return
195243}
244+
245+ func (ext * starlarkBundleLang ) getModuleDependencyRepoName (repo string ) (string , bool ) {
246+ ext .logf ("getModuleDependencyRepoName called with repo=%q" , repo )
247+ if repo == "" {
248+ ext .logf (" returning early for empty repo: @" )
249+ return "@" , true
250+ }
251+ if mappedRepo , ok := ext .moduleDeps [repo ]; ok {
252+ ext .logf (" found mapping: %q -> %q" , repo , mappedRepo )
253+ return mappedRepo , true
254+ } else {
255+ ext .logf (" unknown module dependency: %q (known deps: %v)" , repo , ext .moduleDeps )
256+ log .Fatalf ("unknown module dependency: %q" , repo )
257+ return repo , false
258+ }
259+ }
260+
261+ // logf logs a message using the extension's logger if configured
262+ func (ext * starlarkBundleLang ) logf (format string , args ... any ) {
263+ if ext .logger != nil {
264+ ext .logger .Printf (format , args ... )
265+ }
266+ }
0 commit comments