]> git.lizzy.rs Git - micro.git/commitdiff
Improve file permission detection
authorZachary Yedidia <zyedidia@gmail.com>
Fri, 18 Dec 2020 02:54:18 +0000 (21:54 -0500)
committerZachary Yedidia <zyedidia@gmail.com>
Fri, 18 Dec 2020 02:54:18 +0000 (21:54 -0500)
Mark files as readonly automatically if write permission is denied.
Display errors when opening files (except for non-existence errors).

Fixes #1224

internal/buffer/buffer.go

index 387b041ca769f80bda406dd03cbc668ccda95179..b20e6649fa036e09cd597cff39a31d1fae01b71c 100644 (file)
@@ -212,8 +212,15 @@ func NewBufferFromFileAtLoc(path string, btype BufType, cursorLoc Loc) (*Buffer,
                return nil, err
        }
 
+       f, err := os.OpenFile(filename, os.O_WRONLY, 0)
+       readonly := os.IsPermission(err)
+       f.Close()
+
        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() {
                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()
 
        var buf *Buffer
-       if err != nil {
+       if os.IsNotExist(err) {
                // File does not exist -- create an empty buffer with that name
                buf = NewBufferFromString("", filename, btype)
+       } else if err != nil {
+               return nil, err
        } else {
                buf = NewBuffer(file, util.FSize(file), filename, cursorLoc, btype)
        }
 
+       buf.SetOptionNative("readonly", readonly)
+
        return buf, nil
 }