diff --git a/cmd/micro/micro.go b/cmd/micro/micro.go index 6d0cb1e6..c1ceb796 100644 --- a/cmd/micro/micro.go +++ b/cmd/micro/micro.go @@ -7,6 +7,7 @@ import ( "log" "os" "os/signal" + "path/filepath" "regexp" "runtime" "runtime/pprof" @@ -222,6 +223,35 @@ func LoadInput(args []string) []*buffer.Buffer { return buffers } +func checkBackup(name string) error { + target := filepath.Join(config.ConfigDir, name) + backup := util.AppendBackupSuffix(target) + if info, err := os.Stat(backup); err == nil { + input, err := os.ReadFile(backup) + if err == nil { + t := info.ModTime() + msg := fmt.Sprintf(buffer.BackupMsg, t.Format("Mon Jan _2 at 15:04, 2006"), backup) + choice := screen.TermPrompt(msg, []string{"r", "i", "a", "recover", "ignore", "abort"}, true) + + if choice%3 == 0 { + // recover + err := os.WriteFile(target, input, util.FileMode) + if err != nil { + return err + } + return os.Remove(backup) + } else if choice%3 == 1 { + // delete + return os.Remove(backup) + } else if choice%3 == 2 { + // abort + return errors.New("Aborted") + } + } + } + return nil +} + func exit(rc int) { for _, b := range buffer.OpenBuffers { if !b.Modified() { @@ -269,6 +299,12 @@ func main() { config.InitRuntimeFiles(true) config.InitPlugins() + err = checkBackup("settings.json") + if err != nil { + screen.TermMessage(err) + exit(1) + } + err = config.ReadSettings() if err != nil { screen.TermMessage(err) @@ -329,6 +365,12 @@ func main() { screen.TermMessage(err) } + err = checkBackup("bindings.json") + if err != nil { + screen.TermMessage(err) + exit(1) + } + action.InitBindings() action.InitCommands() diff --git a/internal/buffer/backup.go b/internal/buffer/backup.go index 1e0d9518..2a05c38c 100644 --- a/internal/buffer/backup.go +++ b/internal/buffer/backup.go @@ -14,7 +14,7 @@ import ( "github.com/zyedidia/micro/v2/internal/util" ) -const backupMsg = `A backup was detected for this file. This likely means that micro +const BackupMsg = `A backup was detected for this file. This likely means that micro crashed while editing this file, or another instance of micro is currently editing this file. @@ -131,7 +131,7 @@ func (b *Buffer) ApplyBackup(fsize int64) (bool, bool) { if err == nil { defer backup.Close() t := info.ModTime() - msg := fmt.Sprintf(backupMsg, t.Format("Mon Jan _2 at 15:04, 2006"), backupfile) + msg := fmt.Sprintf(BackupMsg, t.Format("Mon Jan _2 at 15:04, 2006"), backupfile) choice := screen.TermPrompt(msg, []string{"r", "i", "a", "recover", "ignore", "abort"}, true) if choice%3 == 0 {