i think files.TempLastNLines are symlink friendly...

This commit is contained in:
bel
2023-10-29 10:09:14 -06:00
parent 58cafcfaa3
commit ba6d6483e0
2 changed files with 61 additions and 18 deletions

View File

@@ -36,26 +36,51 @@ func (files Files) TempGetLastNLines(n int) ([]string, error) {
func (files Files) TempSetLastNLines(n int, lines []string) error {
p := files.paths()[0]
w, err := ioutil.TempFile(os.TempDir(), path.Base(p))
newFile, err := func() (string, error) {
w, err := ioutil.TempFile(os.TempDir(), path.Base(p))
if err != nil {
return "", err
}
defer w.Close()
r, err := os.Open(p)
if err != nil {
return "", err
}
defer r.Close()
if _, err := peekLastNLines(w, bufio.NewReader(r), n); err != nil {
return "", err
}
for i := range lines {
if _, err := fmt.Fprintln(w, lines[i]); err != nil {
return "", err
}
}
if err := w.Close(); err != nil {
return "", err
}
return w.Name(), nil
}()
if err != nil {
return err
}
defer w.Close()
r, err := os.Open(p)
r, err := os.Open(newFile)
if err != nil {
return err
}
defer r.Close()
if _, err := peekLastNLines(w, bufio.NewReader(r), n); err != nil {
w, err := os.Create(p)
if err != nil {
return err
}
for i := range lines {
fmt.Fprintln(w, lines[i])
}
defer w.Close()
return os.Rename(w.Name(), p)
_, err = io.Copy(w, r)
return err
}
func peekLastNLines(w io.Writer, r *bufio.Reader, n int) ([]string, error) {