diff --git a/dagger/maintenance/image.go b/dagger/maintenance/image.go index f885c008..ec7f56a2 100644 --- a/dagger/maintenance/image.go +++ b/dagger/maintenance/image.go @@ -6,6 +6,7 @@ import ( "fmt" "regexp" "strconv" + "strings" "dagger/maintenance/internal/dagger" @@ -180,11 +181,12 @@ func extractExtensionVersion(versions versionMap, distribution string, pgMajor i distribution, pgMajor) } - re := regexp.MustCompile(`^(\d+(?:\.\d+)+)`) + // Keep this in sync with getExtensionVersion in docker-bake.hcl. + re := regexp.MustCompile(`^(\d+(?::\d+)?(?:\.\d+)+)`) matches := re.FindStringSubmatch(extVersion.Package) if len(matches) < 2 { return "", fmt.Errorf("cannot extract extension version from %q", extVersion.Package) } - return matches[1], nil + return strings.ReplaceAll(matches[1], ":", "-"), nil } diff --git a/dagger/maintenance/image_test.go b/dagger/maintenance/image_test.go index 0e89ac82..baa78997 100644 --- a/dagger/maintenance/image_test.go +++ b/dagger/maintenance/image_test.go @@ -79,3 +79,52 @@ func TestParseImageCoordinates(t *testing.T) { }) } } + +func TestExtractExtensionVersion(t *testing.T) { + tests := []struct { + name string + packageName string + want string + wantErr bool + }{ + { + name: "standard Debian package version", + packageName: "1.7.0-1.pgdg12+1", + want: "1.7.0", + }, + { + name: "Debian package version with epoch", + packageName: "1:8.4.8.6-1.pgdg12+1", + want: "1-8.4.8.6", + }, + { + name: "package version without an extension version", + packageName: "1:pkg-1", + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + versions := versionMap{ + "bookworm": { + "18": {Package: tt.packageName}, + }, + } + + got, err := extractExtensionVersion(versions, "bookworm", 18) + if tt.wantErr { + if err == nil { + t.Fatal("expected an error, got nil") + } + return + } + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if got != tt.want { + t.Errorf("version: got %q, want %q", got, tt.want) + } + }) + } +} diff --git a/renovate.json b/renovate.json index 0057b0fc..b02a50da 100644 --- a/renovate.json +++ b/renovate.json @@ -33,11 +33,13 @@ "**/README.md" ], "matchStrings": [ - "#\\s*renovate:\\s*?(suite=(?.*?))?\\s*depName=(?.*?)?\\s*reference: ghcr.io\\/cloudnative-pg\\/[A-Za-z0-9_-]+:(?([0-9]\\.?)+)" + "#\\s*renovate:\\s*?(suite=(?.*?))?\\s*depName=(?.*?)?\\s*reference: ghcr.io\\/cloudnative-pg\\/[A-Za-z0-9_-]+:(?(?:[0-9]+-)?([0-9]\\.?)+)" ], "registryUrlTemplate": "https://download.postgresql.org/pub/repos/apt?suite={{#if suite}}{{suite}}{{else}}stable{{/if}}&components=main&binaryArch=amd64", "datasourceTemplate": "deb", - "extractVersionTemplate": "^(?[^-+]+)" + "currentValueTemplate": "{{{replace '-' ':' currentValue}}}", + "extractVersionTemplate": "^(?[^-+~]+)", + "autoReplaceStringTemplate": "{{{replace (replace ':' '-' currentValue) (replace ':' '-' newValue) replaceString}}}" }, { "description": "updates the container image SQL version in the README.md files",