diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ba9dc94a1c..18a7c394846 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Lotus changelog # UNRELEASED +- chore: Auto remove local chain data when importing chain file or snapshot ([filecoin-project/lotus#11277](https://github.com/filecoin-project/lotus/pull/11277)) ## New features - feat: Added new tracing API (**HIGHLY EXPERIMENTAL**) supporting two RPC methods: `trace_block` and `trace_replayBlockTransactions` ([filecoin-project/lotus#11100](https://github.com/filecoin-project/lotus/pull/11100)) diff --git a/cmd/lotus/daemon.go b/cmd/lotus/daemon.go index 7271a6e5380..58c326586a7 100644 --- a/cmd/lotus/daemon.go +++ b/cmd/lotus/daemon.go @@ -269,7 +269,37 @@ var DaemonCmd = &cli.Command{ } } - if cctx.Bool("remove-existing-chain") { + chainfile := cctx.String("import-chain") + snapshot := cctx.String("import-snapshot") + willImportChain := false + if chainfile != "" || snapshot != "" { + if chainfile != "" && snapshot != "" { + return fmt.Errorf("cannot specify both 'import-snapshot' and 'import-chain'") + } + willImportChain = true + } + + willRemoveChain := cctx.Bool("remove-existing-chain") + if willImportChain && !willRemoveChain { + // Confirm with the user about the intention to remove chain data. + reader := bufio.NewReader(os.Stdin) + fmt.Print("Importing chain or snapshot will by default delete existing local chain data. Do you want to proceed and delete? (yes/no): ") + userInput, err := reader.ReadString('\n') + if err != nil { + return xerrors.Errorf("reading user input: %w", err) + } + userInput = strings.ToLower(strings.TrimSpace(userInput)) + + if userInput == "yes" { + willRemoveChain = true + } else if userInput == "no" { + willRemoveChain = false + } else { + return fmt.Errorf("invalid input. please answer with 'yes' or 'no'") + } + } + + if willRemoveChain { lr, err := repo.NewFS(cctx.String("repo")) if err != nil { return xerrors.Errorf("error opening fs repo: %w", err) @@ -289,12 +319,7 @@ var DaemonCmd = &cli.Command{ } } - chainfile := cctx.String("import-chain") - snapshot := cctx.String("import-snapshot") - if chainfile != "" || snapshot != "" { - if chainfile != "" && snapshot != "" { - return fmt.Errorf("cannot specify both 'import-snapshot' and 'import-chain'") - } + if willImportChain { var issnapshot bool if chainfile == "" { chainfile = snapshot