diff --git a/cmd/internal/migrations/common.go b/cmd/internal/migrations/common.go index b24b35d..0569b42 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,15 @@ 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(`(?m)^(\s*(?:[\w.]+\s+)?")github\.com/gofiber/fiber/v\d+("$)`) +) +func MigrateGoPkgs(cmd *cobra.Command, cwd string, _, target *semver.Version) error { err := internal.ChangeFileContent(cwd, func(content string) string { - return pkgReplacer.Replace(content) + 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 09b576c..d54f256 100644 --- a/cmd/migrate.go +++ b/cmd/migrate.go @@ -78,7 +78,18 @@ func migrateRunE(cmd *cobra.Command, opts MigrateOptions) error { return fmt.Errorf("cannot get current working directory: %w", err) } - err = migrations.DoMigration(cmd, wd, currentVersion, targetVersion) + 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) } @@ -89,7 +100,7 @@ func migrateRunE(cmd *cobra.Command, opts MigrateOptions) error { } } - msg := fmt.Sprintf("Migration from Fiber %s to %s", currentVersionS, opts.TargetVersionS) + msg := fmt.Sprintf("Migration from Fiber %s to %s", migrateFromS, opts.TargetVersionS) cmd.Println(termenv.String(msg). Foreground(termenv.ANSIBrightBlue)) diff --git a/cmd/migrate_test.go b/cmd/migrate_test.go index dccace6..f6beb2c 100644 --- a/cmd/migrate_test.go +++ b/cmd/migrate_test.go @@ -177,7 +177,8 @@ require github.com/gofiber/fiber/v3 v3.0.0 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.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) }) @@ -196,7 +197,42 @@ require github.com/gofiber/fiber/v3 v3.0.0 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.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") +}