From f9beadd3d7f6f49f6990eceb7aad769ec3f15839 Mon Sep 17 00:00:00 2001 From: RW Date: Fri, 22 Aug 2025 21:10:45 +0200 Subject: [PATCH 1/3] force run previous migrations on target version --- cmd/internal/migrations/common.go | 15 +++---- cmd/migrate.go | 57 +++++++++++++++----------- cmd/migrate_test.go | 66 ++++++++++++++++++++++++------- 3 files changed, 91 insertions(+), 47 deletions(-) diff --git a/cmd/internal/migrations/common.go b/cmd/internal/migrations/common.go index b24b35d..05f99c5 100644 --- a/cmd/internal/migrations/common.go +++ b/cmd/internal/migrations/common.go @@ -5,7 +5,6 @@ import ( "os" "regexp" "strconv" - "strings" semver "github.com/Masterminds/semver/v3" "github.com/spf13/cobra" @@ -13,16 +12,14 @@ import ( "github.com/gofiber/cli/cmd/internal" ) -var pkgRegex = regexp.MustCompile(`(github\.com\/gofiber\/fiber\/)(v\d+)( *?)(v[\w.-]+)`) - -func MigrateGoPkgs(cmd *cobra.Command, cwd string, curr, target *semver.Version) error { - pkgReplacer := strings.NewReplacer( - "github.com/gofiber/fiber/v"+strconv.FormatUint(curr.Major(), 10), - "github.com/gofiber/fiber/v"+strconv.FormatUint(target.Major(), 10), - ) +var ( + pkgRegex = regexp.MustCompile(`(github\.com\/gofiber\/fiber\/)(v\d+)( *?)(v[\w.-]+)`) + pkgImportRegex = regexp.MustCompile(`github\.com/gofiber/fiber/v\d+`) +) +func MigrateGoPkgs(cmd *cobra.Command, cwd string, _ *semver.Version, target *semver.Version) error { err := internal.ChangeFileContent(cwd, func(content string) string { - return pkgReplacer.Replace(content) + return pkgImportRegex.ReplaceAllString(content, "github.com/gofiber/fiber/v"+strconv.FormatUint(target.Major(), 10)) }) if err != nil { return fmt.Errorf("failed to migrate Go packages: %w", err) diff --git a/cmd/migrate.go b/cmd/migrate.go index 09b576c..e8d8935 100644 --- a/cmd/migrate.go +++ b/cmd/migrate.go @@ -69,29 +69,40 @@ func migrateRunE(cmd *cobra.Command, opts MigrateOptions) error { return fmt.Errorf("invalid version for \"%s\": %w", opts.TargetVersionS, err) } - if !targetVersion.GreaterThan(currentVersion) && !(opts.Force && targetVersion.Equal(currentVersion)) { - return fmt.Errorf("target version v%s is not greater than current version v%s", opts.TargetVersionS, currentVersionS) - } - - wd, err := os.Getwd() - if err != nil { - return fmt.Errorf("cannot get current working directory: %w", err) - } - - err = migrations.DoMigration(cmd, wd, currentVersion, targetVersion) - if err != nil { - return fmt.Errorf("migration failed %w", err) - } - - if !opts.SkipGoMod { - if err := runGoMod(wd); err != nil { - return fmt.Errorf("go mod: %w", err) - } - } - - msg := fmt.Sprintf("Migration from Fiber %s to %s", currentVersionS, opts.TargetVersionS) - cmd.Println(termenv.String(msg). - Foreground(termenv.ANSIBrightBlue)) + if !targetVersion.GreaterThan(currentVersion) && !(opts.Force && targetVersion.Equal(currentVersion)) { + return fmt.Errorf("target version v%s is not greater than current version v%s", opts.TargetVersionS, currentVersionS) + } + + wd, err := os.Getwd() + if err != nil { + return fmt.Errorf("cannot get current working directory: %w", err) + } + + migrateFrom := currentVersion + migrateFromS := currentVersionS + if opts.Force && !targetVersion.GreaterThan(currentVersion) { + prevMajor := targetVersion.Major() - 1 + migrateFrom, err = semver.NewVersion(fmt.Sprintf("%d.0.0", prevMajor)) + if err != nil { + return fmt.Errorf("invalid previous major version %d: %w", prevMajor, err) + } + migrateFromS = migrateFrom.String() + } + + err = migrations.DoMigration(cmd, wd, migrateFrom, targetVersion) + if err != nil { + return fmt.Errorf("migration failed %w", err) + } + + if !opts.SkipGoMod { + if err := runGoMod(wd); err != nil { + return fmt.Errorf("go mod: %w", err) + } + } + + msg := fmt.Sprintf("Migration from Fiber %s to %s", migrateFromS, opts.TargetVersionS) + cmd.Println(termenv.String(msg). + Foreground(termenv.ANSIBrightBlue)) return nil } diff --git a/cmd/migrate_test.go b/cmd/migrate_test.go index dccace6..01848c8 100644 --- a/cmd/migrate_test.go +++ b/cmd/migrate_test.go @@ -162,9 +162,9 @@ require github.com/gofiber/fiber/v3 v3.0.0 assert.Contains(t, out, "not greater") }) - t.Run("force", func(t *testing.T) { - origExec := execCommand - var cmds []*exec.Cmd + t.Run("force", func(t *testing.T) { + origExec := execCommand + var cmds []*exec.Cmd execCommand = func(name string, args ...string) *exec.Cmd { cs := append([]string{"-test.run=TestHelperProcess", "--", name}, args...) cmd := exec.Command(os.Args[0], cs...) // #nosec G204 -- safe for test @@ -174,12 +174,13 @@ require github.com/gofiber/fiber/v3 v3.0.0 } defer func() { execCommand = origExec }() - cmd := newMigrateCmd() - out, err := runCobraCmd(cmd, "-t=3.0.0", "-f") - require.NoError(t, err) - assert.Contains(t, out, "Migration from Fiber 3.0.0 to 3.0.0") - assert.Len(t, cmds, 3) - }) + cmd := newMigrateCmd() + out, err := runCobraCmd(cmd, "-t=3.0.0", "-f") + require.NoError(t, err) + assert.Contains(t, out, "Migration from Fiber 2.0.0 to 3.0.0") + assert.Contains(t, out, "Migrating Go packages") + assert.Len(t, cmds, 3) + }) t.Run("force skip go mod", func(t *testing.T) { origExec := execCommand @@ -193,10 +194,45 @@ require github.com/gofiber/fiber/v3 v3.0.0 } defer func() { execCommand = origExec }() - cmd := newMigrateCmd() - out, err := runCobraCmd(cmd, "-t=3.0.0", "-f", "-s") - require.NoError(t, err) - assert.Contains(t, out, "Migration from Fiber 3.0.0 to 3.0.0") - assert.Empty(t, cmds) - }) + cmd := newMigrateCmd() + out, err := runCobraCmd(cmd, "-t=3.0.0", "-f", "-s") + require.NoError(t, err) + assert.Contains(t, out, "Migration from Fiber 2.0.0 to 3.0.0") + assert.Contains(t, out, "Migrating Go packages") + assert.Empty(t, cmds) + }) +} + +func Test_Migrate_ForcePartialV3(t *testing.T) { + dir := t.TempDir() + + gomod := `module example + +go 1.20 + +require github.com/gofiber/fiber/v3 v3.0.0 +` + require.NoError(t, os.WriteFile(filepath.Join(dir, "go.mod"), []byte(gomod), 0o600)) + + main := `package main +import "github.com/gofiber/fiber/v2" +func main() {}` + require.NoError(t, os.WriteFile(filepath.Join(dir, "main.go"), []byte(main), 0o600)) + + cwd, err := os.Getwd() + require.NoError(t, err) + require.NoError(t, os.Chdir(dir)) + defer func() { require.NoError(t, os.Chdir(cwd)) }() + + cmd := newMigrateCmd() + setupCmd() + defer teardownCmd() + out, err := runCobraCmd(cmd, "-t=3.0.0", "-f") + require.NoError(t, err) + assert.Contains(t, out, "Migration from Fiber 2.0.0 to 3.0.0") + assert.Contains(t, out, "Migrating Go packages") + + content := readFileTB(t, filepath.Join(dir, "main.go")) + assert.Contains(t, content, "github.com/gofiber/fiber/v3") + assert.NotContains(t, content, "github.com/gofiber/fiber/v2") } From faf8d0c7f343fac14766740b00a5d57ddd0dd67f Mon Sep 17 00:00:00 2001 From: RW Date: Fri, 22 Aug 2025 21:19:38 +0200 Subject: [PATCH 2/3] fix: format and anchor import regex --- cmd/internal/migrations/common.go | 7 ++-- cmd/migrate.go | 68 +++++++++++++++---------------- cmd/migrate_test.go | 48 +++++++++++----------- 3 files changed, 62 insertions(+), 61 deletions(-) diff --git a/cmd/internal/migrations/common.go b/cmd/internal/migrations/common.go index 05f99c5..9f7c2e3 100644 --- a/cmd/internal/migrations/common.go +++ b/cmd/internal/migrations/common.go @@ -13,13 +13,14 @@ import ( ) var ( - pkgRegex = regexp.MustCompile(`(github\.com\/gofiber\/fiber\/)(v\d+)( *?)(v[\w.-]+)`) - pkgImportRegex = regexp.MustCompile(`github\.com/gofiber/fiber/v\d+`) + pkgRegex = regexp.MustCompile(`(github\.com/gofiber/fiber/)(v\d+)( *?)(v[\w.-]+)`) + pkgImportRegex = regexp.MustCompile(`(?m)^(\s*(?:[\w.]+\s+)?")github\.com/gofiber/fiber/v\d+("$)`) ) func MigrateGoPkgs(cmd *cobra.Command, cwd string, _ *semver.Version, target *semver.Version) error { err := internal.ChangeFileContent(cwd, func(content string) string { - return pkgImportRegex.ReplaceAllString(content, "github.com/gofiber/fiber/v"+strconv.FormatUint(target.Major(), 10)) + replacement := fmt.Sprintf("${1}github.com/gofiber/fiber/v%d${2}", target.Major()) + return pkgImportRegex.ReplaceAllString(content, replacement) }) if err != nil { return fmt.Errorf("failed to migrate Go packages: %w", err) diff --git a/cmd/migrate.go b/cmd/migrate.go index e8d8935..d54f256 100644 --- a/cmd/migrate.go +++ b/cmd/migrate.go @@ -69,40 +69,40 @@ func migrateRunE(cmd *cobra.Command, opts MigrateOptions) error { return fmt.Errorf("invalid version for \"%s\": %w", opts.TargetVersionS, err) } - if !targetVersion.GreaterThan(currentVersion) && !(opts.Force && targetVersion.Equal(currentVersion)) { - return fmt.Errorf("target version v%s is not greater than current version v%s", opts.TargetVersionS, currentVersionS) - } - - wd, err := os.Getwd() - if err != nil { - return fmt.Errorf("cannot get current working directory: %w", err) - } - - migrateFrom := currentVersion - migrateFromS := currentVersionS - if opts.Force && !targetVersion.GreaterThan(currentVersion) { - prevMajor := targetVersion.Major() - 1 - migrateFrom, err = semver.NewVersion(fmt.Sprintf("%d.0.0", prevMajor)) - if err != nil { - return fmt.Errorf("invalid previous major version %d: %w", prevMajor, err) - } - migrateFromS = migrateFrom.String() - } - - err = migrations.DoMigration(cmd, wd, migrateFrom, targetVersion) - if err != nil { - return fmt.Errorf("migration failed %w", err) - } - - if !opts.SkipGoMod { - if err := runGoMod(wd); err != nil { - return fmt.Errorf("go mod: %w", err) - } - } - - msg := fmt.Sprintf("Migration from Fiber %s to %s", migrateFromS, opts.TargetVersionS) - cmd.Println(termenv.String(msg). - Foreground(termenv.ANSIBrightBlue)) + if !targetVersion.GreaterThan(currentVersion) && !(opts.Force && targetVersion.Equal(currentVersion)) { + return fmt.Errorf("target version v%s is not greater than current version v%s", opts.TargetVersionS, currentVersionS) + } + + wd, err := os.Getwd() + if err != nil { + return fmt.Errorf("cannot get current working directory: %w", err) + } + + migrateFrom := currentVersion + migrateFromS := currentVersionS + if opts.Force && !targetVersion.GreaterThan(currentVersion) { + prevMajor := targetVersion.Major() - 1 + migrateFrom, err = semver.NewVersion(fmt.Sprintf("%d.0.0", prevMajor)) + if err != nil { + return fmt.Errorf("invalid previous major version %d: %w", prevMajor, err) + } + migrateFromS = migrateFrom.String() + } + + err = migrations.DoMigration(cmd, wd, migrateFrom, targetVersion) + if err != nil { + return fmt.Errorf("migration failed %w", err) + } + + if !opts.SkipGoMod { + if err := runGoMod(wd); err != nil { + return fmt.Errorf("go mod: %w", err) + } + } + + msg := fmt.Sprintf("Migration from Fiber %s to %s", migrateFromS, opts.TargetVersionS) + cmd.Println(termenv.String(msg). + Foreground(termenv.ANSIBrightBlue)) return nil } diff --git a/cmd/migrate_test.go b/cmd/migrate_test.go index 01848c8..f6beb2c 100644 --- a/cmd/migrate_test.go +++ b/cmd/migrate_test.go @@ -162,9 +162,9 @@ require github.com/gofiber/fiber/v3 v3.0.0 assert.Contains(t, out, "not greater") }) - t.Run("force", func(t *testing.T) { - origExec := execCommand - var cmds []*exec.Cmd + t.Run("force", func(t *testing.T) { + origExec := execCommand + var cmds []*exec.Cmd execCommand = func(name string, args ...string) *exec.Cmd { cs := append([]string{"-test.run=TestHelperProcess", "--", name}, args...) cmd := exec.Command(os.Args[0], cs...) // #nosec G204 -- safe for test @@ -174,13 +174,13 @@ require github.com/gofiber/fiber/v3 v3.0.0 } defer func() { execCommand = origExec }() - cmd := newMigrateCmd() - out, err := runCobraCmd(cmd, "-t=3.0.0", "-f") - require.NoError(t, err) - assert.Contains(t, out, "Migration from Fiber 2.0.0 to 3.0.0") - assert.Contains(t, out, "Migrating Go packages") - assert.Len(t, cmds, 3) - }) + cmd := newMigrateCmd() + out, err := runCobraCmd(cmd, "-t=3.0.0", "-f") + require.NoError(t, err) + assert.Contains(t, out, "Migration from Fiber 2.0.0 to 3.0.0") + assert.Contains(t, out, "Migrating Go packages") + assert.Len(t, cmds, 3) + }) t.Run("force skip go mod", func(t *testing.T) { origExec := execCommand @@ -194,13 +194,13 @@ require github.com/gofiber/fiber/v3 v3.0.0 } defer func() { execCommand = origExec }() - cmd := newMigrateCmd() - out, err := runCobraCmd(cmd, "-t=3.0.0", "-f", "-s") - require.NoError(t, err) - assert.Contains(t, out, "Migration from Fiber 2.0.0 to 3.0.0") - assert.Contains(t, out, "Migrating Go packages") - assert.Empty(t, cmds) - }) + cmd := newMigrateCmd() + out, err := runCobraCmd(cmd, "-t=3.0.0", "-f", "-s") + require.NoError(t, err) + assert.Contains(t, out, "Migration from Fiber 2.0.0 to 3.0.0") + assert.Contains(t, out, "Migrating Go packages") + assert.Empty(t, cmds) + }) } func Test_Migrate_ForcePartialV3(t *testing.T) { @@ -224,13 +224,13 @@ func main() {}` require.NoError(t, os.Chdir(dir)) defer func() { require.NoError(t, os.Chdir(cwd)) }() - cmd := newMigrateCmd() - setupCmd() - defer teardownCmd() - out, err := runCobraCmd(cmd, "-t=3.0.0", "-f") - require.NoError(t, err) - assert.Contains(t, out, "Migration from Fiber 2.0.0 to 3.0.0") - assert.Contains(t, out, "Migrating Go packages") + cmd := newMigrateCmd() + setupCmd() + defer teardownCmd() + out, err := runCobraCmd(cmd, "-t=3.0.0", "-f") + require.NoError(t, err) + assert.Contains(t, out, "Migration from Fiber 2.0.0 to 3.0.0") + assert.Contains(t, out, "Migrating Go packages") content := readFileTB(t, filepath.Join(dir, "main.go")) assert.Contains(t, content, "github.com/gofiber/fiber/v3") From 68ce7900edac67a182a84768af74e6aa74545873 Mon Sep 17 00:00:00 2001 From: RW Date: Fri, 22 Aug 2025 21:26:23 +0200 Subject: [PATCH 3/3] fmt: run gofumpt on common.go --- cmd/internal/migrations/common.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/internal/migrations/common.go b/cmd/internal/migrations/common.go index 9f7c2e3..0569b42 100644 --- a/cmd/internal/migrations/common.go +++ b/cmd/internal/migrations/common.go @@ -17,7 +17,7 @@ var ( pkgImportRegex = regexp.MustCompile(`(?m)^(\s*(?:[\w.]+\s+)?")github\.com/gofiber/fiber/v\d+("$)`) ) -func MigrateGoPkgs(cmd *cobra.Command, cwd string, _ *semver.Version, target *semver.Version) error { +func MigrateGoPkgs(cmd *cobra.Command, cwd string, _, target *semver.Version) error { err := internal.ChangeFileContent(cwd, func(content string) string { replacement := fmt.Sprintf("${1}github.com/gofiber/fiber/v%d${2}", target.Major()) return pkgImportRegex.ReplaceAllString(content, replacement)