Skip to content

Commit 2672aa8

Browse files
Adding missing file closes, rewriting safeWrite() to be more robust
1 parent 7492195 commit 2672aa8

File tree

2 files changed

+29
-14
lines changed

2 files changed

+29
-14
lines changed

internal/buffer/buffer.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,7 @@ func (b *Buffer) ReOpen() error {
537537
if err != nil {
538538
return err
539539
}
540+
defer file.Close()
540541

541542
enc, err := htmlindex.Get(b.Settings["encoding"].(string))
542543
if err != nil {

internal/buffer/save.go

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,27 @@ func (b *Buffer) saveToFile(filename string, withSudo bool, autoSave bool) error
337337
return err
338338
}
339339

340+
func (b *Buffer) backupFile(path string) (string, error) {
341+
backupDir := b.backupDir()
342+
if _, err := os.Stat(backupDir); err != nil {
343+
if !errors.Is(err, fs.ErrNotExist) {
344+
return "", err
345+
}
346+
if err = os.Mkdir(backupDir, os.ModePerm); err != nil {
347+
return "", err
348+
}
349+
}
350+
351+
backupName := util.DetermineEscapePath(backupDir, path)
352+
_, err := b.overwriteFile(backupName)
353+
if err != nil {
354+
os.Remove(backupName)
355+
return "", err
356+
}
357+
358+
return backupName, nil
359+
}
360+
340361
// safeWrite writes the buffer to a file in a "safe" way, preventing loss of the
341362
// contents of the file if it fails to write the new contents.
342363
// This means that the file is not overwritten directly but by writing to the
@@ -353,28 +374,21 @@ func (b *Buffer) safeWrite(path string, withSudo bool, newFile bool) (int, error
353374
}
354375
}()
355376

356-
backupDir := b.backupDir()
357-
if _, err := os.Stat(backupDir); err != nil {
358-
if !errors.Is(err, fs.ErrNotExist) {
359-
return 0, err
360-
}
361-
if err = os.Mkdir(backupDir, os.ModePerm); err != nil {
362-
return 0, err
363-
}
364-
}
377+
b.forceKeepBackup = true
365378

366-
backupName := util.DetermineEscapePath(backupDir, path)
367-
_, err = b.overwriteFile(backupName)
379+
// Try to backup first before writing
380+
backupName, err := b.backupFile(path)
368381
if err != nil {
369-
os.Remove(backupName)
382+
file.Close()
370383
return 0, err
371384
}
372385

373-
b.forceKeepBackup = true
374386
size, err := file.Write(b)
375387
if err != nil {
388+
// If we failed to write, tell the user a backup was made
389+
file.Close()
376390
err = util.OverwriteError{err, backupName}
377-
return size, err
391+
return 0, err
378392
}
379393
b.forceKeepBackup = false
380394

0 commit comments

Comments
 (0)