Improve file permission detection

Mark files as readonly automatically if write permission is denied.
Display errors when opening files (except for non-existence errors).

Fixes #1224
This commit is contained in:
Zachary Yedidia 2020-12-17 21:54:18 -05:00
parent 7df04a58eb
commit 3b34a021e3

View File

@ -212,8 +212,15 @@ func NewBufferFromFileAtLoc(path string, btype BufType, cursorLoc Loc) (*Buffer,
return nil, err return nil, err
} }
f, err := os.OpenFile(filename, os.O_WRONLY, 0)
readonly := os.IsPermission(err)
f.Close()
file, err := os.Open(filename) file, err := os.Open(filename)
fileInfo, _ := os.Stat(filename) fileInfo, serr := os.Stat(filename)
if serr != nil {
return nil, serr
}
if err == nil && fileInfo.IsDir() { if err == nil && fileInfo.IsDir() {
return nil, errors.New("Error: " + filename + " is a directory and cannot be opened") return nil, errors.New("Error: " + filename + " is a directory and cannot be opened")
@ -222,13 +229,17 @@ func NewBufferFromFileAtLoc(path string, btype BufType, cursorLoc Loc) (*Buffer,
defer file.Close() defer file.Close()
var buf *Buffer var buf *Buffer
if err != nil { if os.IsNotExist(err) {
// File does not exist -- create an empty buffer with that name // File does not exist -- create an empty buffer with that name
buf = NewBufferFromString("", filename, btype) buf = NewBufferFromString("", filename, btype)
} else if err != nil {
return nil, err
} else { } else {
buf = NewBuffer(file, util.FSize(file), filename, cursorLoc, btype) buf = NewBuffer(file, util.FSize(file), filename, cursorLoc, btype)
} }
buf.SetOptionNative("readonly", readonly)
return buf, nil return buf, nil
} }