diff --git a/ledger/file.go b/ledger/file.go index 4e150f9..b590b77 100644 --- a/ledger/file.go +++ b/ledger/file.go @@ -4,6 +4,7 @@ import ( "fmt" "io" "os" + "unicode" ) var filesAppendDelim = "\t" @@ -44,16 +45,43 @@ func (files Files) append(s string) error { } func (files Files) trimTrainlingWhitespace() error { - f, err := os.Open(string(files[0])) - if os.IsNotExist(err) { + idx, err := files._lastNonWhitespacePos() + if err != nil { + return err + } + if idx < 1 { return nil } + + f, err := os.OpenFile(string(files[0]), os.O_CREATE|os.O_WRONLY, os.ModePerm) if err != nil { return err } defer f.Close() - return io.EOF + return f.Truncate(int64(idx + 1)) +} + +func (files Files) _lastNonWhitespacePos() (int, error) { + f, err := os.Open(string(files[0])) + if os.IsNotExist(err) { + return -1, nil + } + if err != nil { + return -1, err + } + defer f.Close() + + b, err := io.ReadAll(f) + if err != nil { + return -1, err + } + for i := len(b) - 1; i >= 0; i-- { + if !unicode.IsSpace(rune(b[i])) { + return i, nil + } + } + return len(b) - 1, nil } func (files Files) Deltas(like ...Like) (Deltas, error) {