mirror of https://github.com/cloudreve/Cloudreve
70 lines
2.3 KiB
Go
70 lines
2.3 KiB
Go
package cmd
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/cloudreve/Cloudreve/v4/application/constants"
|
|
"github.com/cloudreve/Cloudreve/v4/application/dependency"
|
|
"github.com/cloudreve/Cloudreve/v4/application/migrator"
|
|
"github.com/cloudreve/Cloudreve/v4/pkg/util"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var (
|
|
v3ConfPath string
|
|
forceReset bool
|
|
)
|
|
|
|
func init() {
|
|
rootCmd.AddCommand(migrateCmd)
|
|
migrateCmd.PersistentFlags().StringVar(&v3ConfPath, "v3-conf", "", "Path to the v3 config file")
|
|
migrateCmd.PersistentFlags().BoolVar(&forceReset, "force-reset", false, "Force reset migration state and start from beginning")
|
|
}
|
|
|
|
var migrateCmd = &cobra.Command{
|
|
Use: "migrate",
|
|
Short: "Migrate from v3 to v4",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
dep := dependency.NewDependency(
|
|
dependency.WithConfigPath(confPath),
|
|
dependency.WithRequiredDbVersion(constants.BackendVersion),
|
|
dependency.WithProFlag(constants.IsPro == "true"),
|
|
)
|
|
logger := dep.Logger()
|
|
logger.Info("Migrating from v3 to v4...")
|
|
|
|
if v3ConfPath == "" {
|
|
logger.Error("v3 config file is required, please use -v3-conf to specify the path.")
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Check if state file exists and warn about resuming
|
|
stateFilePath := filepath.Join(filepath.Dir(v3ConfPath), "migration_state.json")
|
|
if util.Exists(stateFilePath) && !forceReset {
|
|
logger.Info("Found existing migration state file at %s. Migration will resume from the last successful step.", stateFilePath)
|
|
logger.Info("If you want to start migration from the beginning, please use --force-reset flag.")
|
|
} else if forceReset && util.Exists(stateFilePath) {
|
|
logger.Info("Force resetting migration state. Will start from the beginning.")
|
|
if err := os.Remove(stateFilePath); err != nil {
|
|
logger.Error("Failed to remove migration state file: %s", err)
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
migrator, err := migrator.NewMigrator(dep, v3ConfPath)
|
|
if err != nil {
|
|
logger.Error("Failed to create migrator: %s", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
if err := migrator.Migrate(); err != nil {
|
|
logger.Error("Failed to migrate: %s", err)
|
|
logger.Info("Migration failed but state has been saved. You can retry with the same command to resume from the last successful step.")
|
|
os.Exit(1)
|
|
}
|
|
|
|
logger.Info("Migration from v3 to v4 completed successfully.")
|
|
},
|
|
}
|