From 3410bf219c6a25867e3fd44327ca93a9552525ca Mon Sep 17 00:00:00 2001 From: Jason Bedard Date: Thu, 27 Mar 2025 10:16:11 -0700 Subject: [PATCH] fix: support generation_mode:update_only --- gazelle/pythonconfig/pythonconfig.go | 25 +++++++++++------- gazelle/pythonconfig/pythonconfig_test.go | 32 +++++++++++++++++++++++ 2 files changed, 48 insertions(+), 9 deletions(-) diff --git a/gazelle/pythonconfig/pythonconfig.go b/gazelle/pythonconfig/pythonconfig.go index 2183ec60a3..23c0cfd572 100644 --- a/gazelle/pythonconfig/pythonconfig.go +++ b/gazelle/pythonconfig/pythonconfig.go @@ -22,8 +22,8 @@ import ( "github.com/emirpasic/gods/lists/singlylinkedlist" - "github.com/bazelbuild/bazel-gazelle/label" "github.com/bazel-contrib/rules_python/gazelle/manifest" + "github.com/bazelbuild/bazel-gazelle/label" ) // Directives @@ -125,21 +125,28 @@ const ( // defaultIgnoreFiles is the list of default values used in the // python_ignore_files option. -var defaultIgnoreFiles = map[string]struct{}{ -} +var defaultIgnoreFiles = map[string]struct{}{} // Configs is an extension of map[string]*Config. It provides finding methods // on top of the mapping. type Configs map[string]*Config // ParentForPackage returns the parent Config for the given Bazel package. -func (c *Configs) ParentForPackage(pkg string) *Config { - dir := path.Dir(pkg) - if dir == "." { - dir = "" +func (c Configs) ParentForPackage(pkg string) *Config { + for { + dir := path.Dir(pkg) + if dir == "." { + dir = "" + } + parent := (map[string]*Config)(c)[dir] + if parent != nil { + return parent + } + if dir == "" { + return nil + } + pkg = dir } - parent := (map[string]*Config)(*c)[dir] - return parent } // Config represents a config extension for a specific Bazel package. diff --git a/gazelle/pythonconfig/pythonconfig_test.go b/gazelle/pythonconfig/pythonconfig_test.go index 7cdb9af1d1..fe21ce236e 100644 --- a/gazelle/pythonconfig/pythonconfig_test.go +++ b/gazelle/pythonconfig/pythonconfig_test.go @@ -248,3 +248,35 @@ func TestFormatThirdPartyDependency(t *testing.T) { }) } } + +func TestConfigsMap(t *testing.T) { + t.Run("only root", func(t *testing.T) { + configs := Configs{"": New("root/dir", "")} + + if configs.ParentForPackage("") == nil { + t.Fatal("expected non-nil for root config") + } + + if configs.ParentForPackage("a/b/c") != configs[""] { + t.Fatal("expected root for subpackage") + } + }) + + t.Run("sparse child configs", func(t *testing.T) { + configs := Configs{"": New("root/dir", "")} + configs["a"] = configs[""].NewChild() + configs["a/b/c"] = configs["a"].NewChild() + + if configs.ParentForPackage("a/b/c/d") != configs["a/b/c"] { + t.Fatal("child should match direct parent") + } + + if configs.ParentForPackage("a/b/c/d/e") != configs["a/b/c"] { + t.Fatal("grandchild should match first parant") + } + + if configs.ParentForPackage("other/root/path") != configs[""] { + t.Fatal("non-configured subpackage should match root") + } + }) +}