mirror of
https://github.com/zyedidia/micro.git
synced 2025-06-18 14:55:38 -04:00
save+util: Provide a meaningful error message for safe (over-)write fails
This commit is contained in:
parent
79ce93fb7d
commit
49aebe8aca
@ -3,6 +3,7 @@ package main
|
|||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"encoding/gob"
|
"encoding/gob"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@ -11,6 +12,7 @@ import (
|
|||||||
|
|
||||||
"github.com/zyedidia/micro/v2/internal/buffer"
|
"github.com/zyedidia/micro/v2/internal/buffer"
|
||||||
"github.com/zyedidia/micro/v2/internal/config"
|
"github.com/zyedidia/micro/v2/internal/config"
|
||||||
|
"github.com/zyedidia/micro/v2/internal/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
func shouldContinue() bool {
|
func shouldContinue() bool {
|
||||||
@ -42,7 +44,11 @@ func CleanConfig() {
|
|||||||
settingsFile := filepath.Join(config.ConfigDir, "settings.json")
|
settingsFile := filepath.Join(config.ConfigDir, "settings.json")
|
||||||
err := config.WriteSettings(settingsFile)
|
err := config.WriteSettings(settingsFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Error writing settings.json file: " + err.Error())
|
if errors.Is(err, util.ErrOverwrite) {
|
||||||
|
fmt.Println(err.Error())
|
||||||
|
} else {
|
||||||
|
fmt.Println("Error writing settings.json file: " + err.Error())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// detect unused options
|
// detect unused options
|
||||||
@ -80,7 +86,11 @@ func CleanConfig() {
|
|||||||
|
|
||||||
err := config.OverwriteSettings(settingsFile)
|
err := config.OverwriteSettings(settingsFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Error overwriting settings.json file: " + err.Error())
|
if errors.Is(err, util.ErrOverwrite) {
|
||||||
|
fmt.Println(err.Error())
|
||||||
|
} else {
|
||||||
|
fmt.Println("Error overwriting settings.json file: " + err.Error())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println("Removed unused options")
|
fmt.Println("Removed unused options")
|
||||||
|
@ -658,7 +658,16 @@ func SetGlobalOptionNative(option string, nativeValue interface{}) error {
|
|||||||
delete(b.LocalSettings, option)
|
delete(b.LocalSettings, option)
|
||||||
}
|
}
|
||||||
|
|
||||||
return config.WriteSettings(filepath.Join(config.ConfigDir, "settings.json"))
|
err := config.WriteSettings(filepath.Join(config.ConfigDir, "settings.json"))
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, util.ErrOverwrite) {
|
||||||
|
screen.TermMessage(err)
|
||||||
|
err = errors.Unwrap(err)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetGlobalOption(option, value string) error {
|
func SetGlobalOption(option, value string) error {
|
||||||
@ -783,7 +792,11 @@ func (h *BufPane) BindCmd(args []string) {
|
|||||||
|
|
||||||
_, err := TryBindKey(parseKeyArg(args[0]), args[1], true)
|
_, err := TryBindKey(parseKeyArg(args[0]), args[1], true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
InfoBar.Error(err)
|
if errors.Is(err, util.ErrOverwrite) {
|
||||||
|
screen.TermMessage(err)
|
||||||
|
} else {
|
||||||
|
InfoBar.Error(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -796,7 +809,11 @@ func (h *BufPane) UnbindCmd(args []string) {
|
|||||||
|
|
||||||
err := UnbindKey(parseKeyArg(args[0]))
|
err := UnbindKey(parseKeyArg(args[0]))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
InfoBar.Error(err)
|
if errors.Is(err, util.ErrOverwrite) {
|
||||||
|
screen.TermMessage(err)
|
||||||
|
} else {
|
||||||
|
InfoBar.Error(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -316,6 +316,10 @@ func (b *Buffer) saveToFile(filename string, withSudo bool, autoSave bool) error
|
|||||||
result := <-saveResponseChan
|
result := <-saveResponseChan
|
||||||
err = result.err
|
err = result.err
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if errors.Is(err, util.ErrOverwrite) {
|
||||||
|
screen.TermMessage(err)
|
||||||
|
err = errors.Unwrap(err)
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -371,6 +375,7 @@ func (b *Buffer) safeWrite(path string, withSudo bool, newFile bool) (int, error
|
|||||||
b.forceKeepBackup = true
|
b.forceKeepBackup = true
|
||||||
size, err := file.Write(b)
|
size, err := file.Write(b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
err = util.OverwriteError{err, backupName}
|
||||||
return size, err
|
return size, err
|
||||||
}
|
}
|
||||||
b.forceKeepBackup = false
|
b.forceKeepBackup = false
|
||||||
|
@ -45,11 +45,44 @@ var (
|
|||||||
Stdout *bytes.Buffer
|
Stdout *bytes.Buffer
|
||||||
// Sigterm is a channel where micro exits when written
|
// Sigterm is a channel where micro exits when written
|
||||||
Sigterm chan os.Signal
|
Sigterm chan os.Signal
|
||||||
|
|
||||||
|
// To be used for fails on (over-)write with safe writes
|
||||||
|
ErrOverwrite = OverwriteError{}
|
||||||
)
|
)
|
||||||
|
|
||||||
// To be used for file writes before umask is applied
|
// To be used for file writes before umask is applied
|
||||||
const FileMode os.FileMode = 0666
|
const FileMode os.FileMode = 0666
|
||||||
|
|
||||||
|
const OverwriteFailMsg = `An error occurred while writing to the file:
|
||||||
|
|
||||||
|
%s
|
||||||
|
|
||||||
|
The file may be corrupted now. The good news is that it has been
|
||||||
|
successfully backed up. Next time you open this file with Micro,
|
||||||
|
Micro will ask if you want to recover it from the backup.
|
||||||
|
|
||||||
|
The backup path is:
|
||||||
|
|
||||||
|
%s`
|
||||||
|
|
||||||
|
// OverwriteError is a custom error to add additional information
|
||||||
|
type OverwriteError struct {
|
||||||
|
What error
|
||||||
|
BackupName string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e OverwriteError) Error() string {
|
||||||
|
return fmt.Sprintf(OverwriteFailMsg, e.What, e.BackupName)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e OverwriteError) Is(target error) bool {
|
||||||
|
return target == ErrOverwrite
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e OverwriteError) Unwrap() error {
|
||||||
|
return e.What
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
var err error
|
var err error
|
||||||
SemVersion, err = semver.Make(Version)
|
SemVersion, err = semver.Make(Version)
|
||||||
@ -685,6 +718,8 @@ func SafeWrite(path string, bytes []byte, rename bool) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
if rename {
|
if rename {
|
||||||
os.Remove(tmp)
|
os.Remove(tmp)
|
||||||
|
} else {
|
||||||
|
err = OverwriteError{err, tmp}
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user