✨ 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