diff --git a/files/append.go b/files/append.go index bd9f4ee..cb62d9b 100644 --- a/files/append.go +++ b/files/append.go @@ -2,6 +2,7 @@ package files import ( "fmt" + "io" "os" fp "path/filepath" "strings" @@ -31,18 +32,32 @@ func Append(l models.Log) error { 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 { return err } 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 { by, err := e.MarshalText() if err != nil { continue } f.Write(by) + f.Write([]byte{10}) } return nil diff --git a/files/append_test.go b/files/append_test.go index c31ec63..0976363 100644 --- a/files/append_test.go +++ b/files/append_test.go @@ -33,6 +33,7 @@ func (s *AppendTestSuite) TearDownSuite() { } func (s *AppendTestSuite) TestSuccess() { + defer os.Remove(s.dir + "/test.log") when := time.Now().Local() e := models.Entry{ Title: "Jimmy", @@ -57,7 +58,68 @@ func (s *AppendTestSuite) TestSuccess() { 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() { + defer os.Remove(s.dir + "/test.log") e := models.Entry{ Title: "Jimmy", } diff --git a/models/entry.go b/models/entry.go index d504536..5a19933 100644 --- a/models/entry.go +++ b/models/entry.go @@ -74,7 +74,7 @@ func (e Entry) MarshalText() ([]byte, error) { } ch := e.getFieldMarshalChan() buff := &bytes.Buffer{} - buff.WriteString("\n@begin ") + buff.WriteString("@begin ") buff.WriteString(e.Date.Format(DateFormat)) buff.WriteString(" - ") buff.WriteString(e.Title) diff --git a/models/entry_test.go b/models/entry_test.go index a8bec44..aefecc9 100644 --- a/models/entry_test.go +++ b/models/entry_test.go @@ -90,13 +90,13 @@ func getEntryMarshalTestRunner(title string, date time.Time, fields []Meta, firs if first == "" { return } + os := string(o) if len(lines) == 0 { - assert.Equal(t, "\n"+first, string(o)) + assert.Equal(t, first, os) return } - os := string(o) - assert.Regexp(t, "^\n"+first, os) + assert.Regexp(t, first, os) for _, line := range lines { assert.Regexp(t, "(?m)^"+line, os) }