del code related to last n lines
This commit is contained in:
@@ -1,17 +1,13 @@
|
||||
package ledger
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/fs"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"strings"
|
||||
"unicode"
|
||||
)
|
||||
|
||||
@@ -65,89 +61,6 @@ func (files Files) Amend(old, now Delta) error {
|
||||
return files.Add(transaction.payee, []Delta{old, now}...)
|
||||
}
|
||||
|
||||
func (files Files) TempGetLastNLines(n int) ([]string, error) {
|
||||
p := files.paths()[0]
|
||||
f, err := os.Open(p)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer f.Close()
|
||||
return peekLastNLines(io.Discard, bufio.NewReader(f), n)
|
||||
}
|
||||
|
||||
func (files Files) TempSetLastNLines(n int, lines []string) error {
|
||||
p := files.paths()[0]
|
||||
|
||||
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 len(strings.TrimSpace(lines[i])) == 0 {
|
||||
continue
|
||||
}
|
||||
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
|
||||
}
|
||||
|
||||
r, err := os.Open(newFile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer r.Close()
|
||||
|
||||
w, err := os.Create(p)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer w.Close()
|
||||
|
||||
_, err = io.Copy(w, r)
|
||||
return err
|
||||
}
|
||||
|
||||
func peekLastNLines(w io.Writer, r *bufio.Reader, n int) ([]string, error) {
|
||||
lastNLines := make([]string, 0, n)
|
||||
for {
|
||||
line, err := r.ReadBytes('\n')
|
||||
if len(bytes.TrimSpace(line)) > 0 {
|
||||
lastNLines = append(lastNLines, string(bytes.TrimRight(line, "\n")))
|
||||
for i := 0; i < len(lastNLines)-n; i++ {
|
||||
fmt.Fprintln(w, lastNLines[i])
|
||||
}
|
||||
lastNLines = lastNLines[max(0, len(lastNLines)-n):]
|
||||
}
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return lastNLines, nil
|
||||
}
|
||||
|
||||
func (files Files) paths() []string {
|
||||
result := make([]string, 0, len(files))
|
||||
for i := range files {
|
||||
|
||||
Reference in New Issue
Block a user