✨ Only add newline to file when needed
This commit is contained in:
parent
2fc60c16c6
commit
5b8e4696ea
4 changed files with 82 additions and 5 deletions
|
|
@ -2,6 +2,7 @@ package files
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"os"
|
"os"
|
||||||
fp "path/filepath"
|
fp "path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
@ -31,18 +32,32 @@ func Append(l models.Log) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
f, err := os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0640)
|
f, err := os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0640)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
|
|
||||||
|
f.Seek(-1, os.SEEK_END)
|
||||||
|
last := make([]byte, 1, 1)
|
||||||
|
n, err := f.Read(last)
|
||||||
|
if err != nil && err != io.EOF {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err == nil && n > 0 {
|
||||||
|
if last[0] != 10 {
|
||||||
|
f.Write([]byte{10})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for _, e := range l.Entries {
|
for _, e := range l.Entries {
|
||||||
by, err := e.MarshalText()
|
by, err := e.MarshalText()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
f.Write(by)
|
f.Write(by)
|
||||||
|
f.Write([]byte{10})
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@ func (s *AppendTestSuite) TearDownSuite() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *AppendTestSuite) TestSuccess() {
|
func (s *AppendTestSuite) TestSuccess() {
|
||||||
|
defer os.Remove(s.dir + "/test.log")
|
||||||
when := time.Now().Local()
|
when := time.Now().Local()
|
||||||
e := models.Entry{
|
e := models.Entry{
|
||||||
Title: "Jimmy",
|
Title: "Jimmy",
|
||||||
|
|
@ -57,7 +58,68 @@ func (s *AppendTestSuite) TestSuccess() {
|
||||||
s.Assert().Contains(st, "\n@bar true")
|
s.Assert().Contains(st, "\n@bar true")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *AppendTestSuite) TestTwoEntries() {
|
||||||
|
defer os.Remove(s.dir + "/test.log")
|
||||||
|
when := time.Now().Local()
|
||||||
|
whens := when.Format(models.DateFormat)
|
||||||
|
e := []models.Entry{
|
||||||
|
{Title: "one", Date: when},
|
||||||
|
{Title: "two", Date: when},
|
||||||
|
}
|
||||||
|
l := models.Log{
|
||||||
|
Name: "test",
|
||||||
|
Entries: e,
|
||||||
|
}
|
||||||
|
err := Append(l)
|
||||||
|
s.Assert().NoError(err)
|
||||||
|
s.Require().FileExists(s.dir + "/test.log")
|
||||||
|
by, _ := os.ReadFile(s.dir + "/test.log")
|
||||||
|
exp := fmt.Sprintf("@begin %s - one @end\n@begin %s - two @end\n", whens, whens)
|
||||||
|
s.Assert().Equal(exp, string(by))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *AppendTestSuite) TestAddNewLine() {
|
||||||
|
defer os.Remove(s.dir + "/test.log")
|
||||||
|
os.WriteFile(s.dir+"/test.log", []byte("foo"), 0644)
|
||||||
|
when := time.Now().Local()
|
||||||
|
whens := when.Format(models.DateFormat)
|
||||||
|
e := []models.Entry{
|
||||||
|
{Title: "one", Date: when},
|
||||||
|
}
|
||||||
|
l := models.Log{
|
||||||
|
Name: "test",
|
||||||
|
Entries: e,
|
||||||
|
}
|
||||||
|
err := Append(l)
|
||||||
|
s.Assert().NoError(err)
|
||||||
|
s.Require().FileExists(s.dir + "/test.log")
|
||||||
|
by, _ := os.ReadFile(s.dir + "/test.log")
|
||||||
|
exp := fmt.Sprintf("foo\n@begin %s - one @end\n", whens)
|
||||||
|
s.Assert().Equal(exp, string(by))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *AppendTestSuite) TestDontAddNewLine() {
|
||||||
|
defer os.Remove(s.dir + "/test.log")
|
||||||
|
os.WriteFile(s.dir+"/test.log", []byte("foo\n"), 0644)
|
||||||
|
when := time.Now().Local()
|
||||||
|
whens := when.Format(models.DateFormat)
|
||||||
|
e := []models.Entry{
|
||||||
|
{Title: "one", Date: when},
|
||||||
|
}
|
||||||
|
l := models.Log{
|
||||||
|
Name: "test",
|
||||||
|
Entries: e,
|
||||||
|
}
|
||||||
|
err := Append(l)
|
||||||
|
s.Assert().NoError(err)
|
||||||
|
s.Require().FileExists(s.dir + "/test.log")
|
||||||
|
by, _ := os.ReadFile(s.dir + "/test.log")
|
||||||
|
exp := fmt.Sprintf("foo\n@begin %s - one @end\n", whens)
|
||||||
|
s.Assert().Equal(exp, string(by))
|
||||||
|
}
|
||||||
|
|
||||||
func (s *AppendTestSuite) TestFailEntry() {
|
func (s *AppendTestSuite) TestFailEntry() {
|
||||||
|
defer os.Remove(s.dir + "/test.log")
|
||||||
e := models.Entry{
|
e := models.Entry{
|
||||||
Title: "Jimmy",
|
Title: "Jimmy",
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,7 @@ func (e Entry) MarshalText() ([]byte, error) {
|
||||||
}
|
}
|
||||||
ch := e.getFieldMarshalChan()
|
ch := e.getFieldMarshalChan()
|
||||||
buff := &bytes.Buffer{}
|
buff := &bytes.Buffer{}
|
||||||
buff.WriteString("\n@begin ")
|
buff.WriteString("@begin ")
|
||||||
buff.WriteString(e.Date.Format(DateFormat))
|
buff.WriteString(e.Date.Format(DateFormat))
|
||||||
buff.WriteString(" - ")
|
buff.WriteString(" - ")
|
||||||
buff.WriteString(e.Title)
|
buff.WriteString(e.Title)
|
||||||
|
|
|
||||||
|
|
@ -90,13 +90,13 @@ func getEntryMarshalTestRunner(title string, date time.Time, fields []Meta, firs
|
||||||
if first == "" {
|
if first == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
os := string(o)
|
||||||
if len(lines) == 0 {
|
if len(lines) == 0 {
|
||||||
assert.Equal(t, "\n"+first, string(o))
|
assert.Equal(t, first, os)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
os := string(o)
|
assert.Regexp(t, first, os)
|
||||||
assert.Regexp(t, "^\n"+first, os)
|
|
||||||
for _, line := range lines {
|
for _, line := range lines {
|
||||||
assert.Regexp(t, "(?m)^"+line, os)
|
assert.Regexp(t, "(?m)^"+line, os)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue