From d5a11ecbab5bdb2dee5280cde7bbae740ec01865 Mon Sep 17 00:00:00 2001 From: Jeremy Schneider Date: Sat, 12 Sep 2026 20:29:48 +0000 Subject: [PATCH] fix: support base-image extension dependencies Keep local repository dependency resolution unchanged while allowing required PostgreSQL extensions supplied by the base image to be installed during testing without treating them as extension images. Signed-off-by: Jeremy Schneider --- dagger/maintenance/main.go | 9 ++++++--- dagger/maintenance/testingvalues.go | 30 ++++++++++++++++++++++++++++- templates/metadata.hcl.tmpl | 6 ++++-- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/dagger/maintenance/main.go b/dagger/maintenance/main.go index d9478d73..703ca979 100644 --- a/dagger/maintenance/main.go +++ b/dagger/maintenance/main.go @@ -202,9 +202,12 @@ func (m *Maintenance) GenerateTestingValues( return nil, err } - extensions := make([]*ExtensionConfiguration, len(extensionInfos)) - for i, info := range extensionInfos { - extensions[i] = info.Configuration + extensions := make([]*ExtensionConfiguration, 0, len(extensionInfos)) + for _, info := range extensionInfos { + if info.Configuration == nil { + continue + } + extensions = append(extensions, info.Configuration) } databaseConfig := generateDatabaseConfig(extensionInfos) diff --git a/dagger/maintenance/testingvalues.go b/dagger/maintenance/testingvalues.go index 882a7161..1db22e7c 100644 --- a/dagger/maintenance/testingvalues.go +++ b/dagger/maintenance/testingvalues.go @@ -3,6 +3,7 @@ package main import ( "context" "fmt" + "strings" "dagger/maintenance/internal/dagger" ) @@ -37,6 +38,8 @@ type testingExtensionInfo struct { CreateExtension bool } +const baseImageDependencyPrefix = "base-image:" + type imageLocator struct { ExtensionImage string PgMajor int @@ -64,7 +67,19 @@ func generateTestingValuesExtensions( CreateExtension: metadata.CreateExtension, }) - for _, dep := range metadata.RequiredExtensions { + for _, requiredDependency := range metadata.RequiredExtensions { + dep, isBaseImageDependency, err := parseRequiredDependency(requiredDependency) + if err != nil { + return nil, err + } + if isBaseImageDependency { + out = append(out, &testingExtensionInfo{ + SQLName: dep, + CreateExtension: true, + }) + continue + } + depExists, err := source.Exists(ctx, dep) if err != nil { return nil, err @@ -108,6 +123,19 @@ func generateTestingValuesExtensions( return out, nil } +func parseRequiredDependency(dependency string) (string, bool, error) { + if !strings.HasPrefix(dependency, baseImageDependencyPrefix) { + return dependency, false, nil + } + + name := strings.TrimPrefix(dependency, baseImageDependencyPrefix) + if name == "" { + return "", false, fmt.Errorf("base-image dependency %q has no extension name", dependency) + } + + return name, true, nil +} + func generateExtensionConfiguration(metadata *extensionMetadata, extensionImage string) (*ExtensionConfiguration, error) { targetExtensionImage := extensionImage if targetExtensionImage == "" { diff --git a/templates/metadata.hcl.tmpl b/templates/metadata.hcl.tmpl index 9d6d54f6..b0258364 100644 --- a/templates/metadata.hcl.tmpl +++ b/templates/metadata.hcl.tmpl @@ -98,8 +98,10 @@ metadata = { auto_update_os_libs = false # TODO: Remove this comment block after customizing the file. - # `required_extensions`: must contain the name(s) of the sibling - # folders in this repository that contain a required extension. + # `required_extensions`: names of required extensions. By default each name + # must identify a sibling folder in this repository. Prefix dependencies + # provided by the PostgreSQL base image with `base-image:` (for example, + # `base-image:pg_stat_statements`). required_extensions = [] # TODO: Remove this comment block after customizing the file.