From f2e7ebda410ab20fcc26442af7728c5bdca02e12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6ran=20Karl?= <3951388+JoeKar@users.noreply.github.com> Date: Wed, 11 Feb 2026 06:52:51 +0100 Subject: [PATCH 1/3] buffer: Resolve symlinks in file paths Otherwise we can't identify if we have the same file open multiple times via different symlinks. The test must be adapted to resolve symlinks in `findBuffer()`. --- cmd/micro/micro_test.go | 5 ++++- internal/buffer/buffer.go | 13 ++++++++++--- internal/buffer/save.go | 2 ++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/cmd/micro/micro_test.go b/cmd/micro/micro_test.go index 09cad432c..712595d75 100644 --- a/cmd/micro/micro_test.go +++ b/cmd/micro/micro_test.go @@ -4,6 +4,7 @@ import ( "fmt" "log" "os" + "path/filepath" "testing" "github.com/go-errors/errors" @@ -157,8 +158,10 @@ func openFile(file string) { func findBuffer(file string) *buffer.Buffer { var buf *buffer.Buffer + file, _ = filepath.EvalSymlinks(file) + file, _ = filepath.Abs(file) for _, b := range buffer.OpenBuffers { - if b.Path == file { + if b.AbsPath == file { buf = b } } diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index 2735ca467..d14a745f9 100644 --- a/internal/buffer/buffer.go +++ b/internal/buffer/buffer.go @@ -355,9 +355,16 @@ func NewBufferFromString(text, path string, btype BufType) *Buffer { // Places the cursor at startcursor. If startcursor is -1, -1 places the // cursor at an autodetected location (based on savecursor or :LINE:COL) func NewBuffer(r io.Reader, size int64, path string, btype BufType, cmd Command) *Buffer { - absPath, err := filepath.Abs(path) - if err != nil { - absPath = path + var err error + absPath := path + if btype == BTDefault && path != "" { + // Ignore the returned error, since the checks are already performed in + // NewBufferFromFileWithCommand() + path, _ = filepath.EvalSymlinks(path) + absPath, err = filepath.Abs(path) + if err != nil { + absPath = path + } } b := new(Buffer) diff --git a/internal/buffer/save.go b/internal/buffer/save.go index 44e8f4a3e..992095bfe 100644 --- a/internal/buffer/save.go +++ b/internal/buffer/save.go @@ -285,6 +285,8 @@ func (b *Buffer) saveToFile(filename string, withSudo bool, autoSave bool) error return errors.New("Error: " + filename + " is not a regular file and cannot be saved") } + // Ignore the returned error, since the checks are already performed above + filename, _ = filepath.EvalSymlinks(filename) absFilename, err := filepath.Abs(filename) if err != nil { return err From ea59a850241f533f6e92aa7722e32aafa1f6ac52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6ran=20Karl?= <3951388+JoeKar@users.noreply.github.com> Date: Fri, 6 Feb 2026 00:06:59 +0100 Subject: [PATCH 2/3] buffer: Don't cancel the backup in case the buffer is shared Otherwise it will be removed async, which shouldn't happen in case there is still one buffer open with the same modified file. --- internal/buffer/buffer.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index d14a745f9..6437075fe 100644 --- a/internal/buffer/buffer.go +++ b/internal/buffer/buffer.go @@ -534,7 +534,9 @@ func (b *Buffer) Fini() { if !b.Modified() { b.Serialize() } - b.CancelBackup() + if !b.Shared() { + b.CancelBackup() + } if b.Type == BTStdout { fmt.Fprint(util.Stdout, string(b.Bytes())) From e02848f251c7f6365b933c04188a910ee701ded0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6ran=20Karl?= <3951388+JoeKar@users.noreply.github.com> Date: Tue, 10 Feb 2026 19:17:43 +0100 Subject: [PATCH 3/3] buffer: Don't `Serialize` in case the buffer is shared Otherwise we unnecessarily serialize the shared buffer every time when closing a bufpane with this buffer, so every such serialize overwrites the previous one, thus only the last serialize (when closing the last instance of the buffer, i.e. when actually closing the file, i.e. when the buffer is not shared anymore) will be used anyway. --- internal/buffer/buffer.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index 6437075fe..05775bbed 100644 --- a/internal/buffer/buffer.go +++ b/internal/buffer/buffer.go @@ -531,10 +531,10 @@ func (b *Buffer) Close() { // Fini should be called when a buffer is closed and performs // some cleanup func (b *Buffer) Fini() { - if !b.Modified() { - b.Serialize() - } if !b.Shared() { + if !b.Modified() { + b.Serialize() + } b.CancelBackup() }