From f1498ebe45d7ab46481fe4c99ba05fda89000a0b Mon Sep 17 00:00:00 2001 From: RW Date: Sat, 29 Nov 2025 16:55:08 +0100 Subject: [PATCH 1/2] Fix middleware locals migration idempotency --- .../migrations/v3/middleware_locals.go | 2 +- .../migrations/v3/middleware_locals_test.go | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/cmd/internal/migrations/v3/middleware_locals.go b/cmd/internal/migrations/v3/middleware_locals.go index fba203b..1d7421b 100644 --- a/cmd/internal/migrations/v3/middleware_locals.go +++ b/cmd/internal/migrations/v3/middleware_locals.go @@ -155,7 +155,7 @@ func MigrateMiddlewareLocals(cmd *cobra.Command, cwd string, _, _ *semver.Versio reTypeAssert := regexp.MustCompile(`([\w\.]+FromContext\([^\)]+\))\.\([^\)]+\)`) content = reTypeAssert.ReplaceAllString(content, "$1") - reComma := regexp.MustCompile(`(\w+)\s*,\s*(\w+)\s*:=\s*([\w\.]+FromContext\([^\)]+\))`) + reComma := regexp.MustCompile(`(\w+)\s*,\s*(\w+)\s*:=\s*([\w\.]+FromContext\([^\)]+\))(?:\s*,\s*true)*`) content = reComma.ReplaceAllString(content, "$1, $2 := $3, true") for alias := range imports { diff --git a/cmd/internal/migrations/v3/middleware_locals_test.go b/cmd/internal/migrations/v3/middleware_locals_test.go index b892f7b..5ff0e0e 100644 --- a/cmd/internal/migrations/v3/middleware_locals_test.go +++ b/cmd/internal/migrations/v3/middleware_locals_test.go @@ -43,6 +43,39 @@ func handler(c fiber.Ctx) error { assert.Contains(t, buf.String(), "Migrating middleware locals") } +func Test_MigrateMiddlewareLocals_Idempotent(t *testing.T) { + t.Parallel() + + dir, err := os.MkdirTemp("", "mlocals-idem") + require.NoError(t, err) + defer func() { require.NoError(t, os.RemoveAll(dir)) }() + + file := writeTempFile(t, dir, `package main +import "github.com/gofiber/fiber/v2" +func handler(c fiber.Ctx) error { + csrfToken, ok := c.Locals("csrf").(string) + _ = csrfToken + _ = ok + return nil +}`) + + var buf bytes.Buffer + cmd := newCmd(&buf) + require.NoError(t, v3.MigrateMiddlewareLocals(cmd, dir, nil, nil)) + + content := readFile(t, file) + assert.Contains(t, content, `csrfToken, ok := csrf.TokenFromContext(c), true`) + assert.Contains(t, buf.String(), "Migrating middleware locals") + + buf.Reset() + require.NoError(t, v3.MigrateMiddlewareLocals(cmd, dir, nil, nil)) + + content = readFile(t, file) + assert.Contains(t, content, `csrfToken, ok := csrf.TokenFromContext(c), true`) + assert.NotContains(t, content, `, true, true`) + assert.Empty(t, buf.String()) +} + func Test_MigrateMiddlewareLocals_ContextKey(t *testing.T) { t.Parallel() From edbd8fdc4262957d9a398c9be59fb69869b9ca90 Mon Sep 17 00:00:00 2001 From: RW Date: Sun, 30 Nov 2025 11:36:58 +0100 Subject: [PATCH 2/2] Update cmd/internal/migrations/v3/middleware_locals_test.go Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- cmd/internal/migrations/v3/middleware_locals_test.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/cmd/internal/migrations/v3/middleware_locals_test.go b/cmd/internal/migrations/v3/middleware_locals_test.go index 5ff0e0e..6b04001 100644 --- a/cmd/internal/migrations/v3/middleware_locals_test.go +++ b/cmd/internal/migrations/v3/middleware_locals_test.go @@ -63,16 +63,15 @@ func handler(c fiber.Ctx) error { cmd := newCmd(&buf) require.NoError(t, v3.MigrateMiddlewareLocals(cmd, dir, nil, nil)) - content := readFile(t, file) - assert.Contains(t, content, `csrfToken, ok := csrf.TokenFromContext(c), true`) + contentAfterFirstRun := readFile(t, file) + assert.Contains(t, contentAfterFirstRun, `csrfToken, ok := csrf.TokenFromContext(c), true`) assert.Contains(t, buf.String(), "Migrating middleware locals") buf.Reset() require.NoError(t, v3.MigrateMiddlewareLocals(cmd, dir, nil, nil)) - content = readFile(t, file) - assert.Contains(t, content, `csrfToken, ok := csrf.TokenFromContext(c), true`) - assert.NotContains(t, content, `, true, true`) + contentAfterSecondRun := readFile(t, file) + assert.Equal(t, contentAfterFirstRun, contentAfterSecondRun) assert.Empty(t, buf.String()) }