diff options
author | Máximo Cuadros <mcuadros@gmail.com> | 2019-04-18 10:12:52 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-04-18 10:12:52 +0200 |
commit | cc5579e8f1d44e7a61b11221ba1b0f6d8afe4e6a (patch) | |
tree | 115866a43d3a00f7d17cbb34b2cd923ae6d92e75 /plumbing | |
parent | 829edc9cd7fc87968b98274ad17bd8ed09293861 (diff) | |
parent | f69d20660a0fd331dfa5ec1c77dd3daa6ac00bf4 (diff) | |
download | go-git-cc5579e8f1d44e7a61b11221ba1b0f6d8afe4e6a.tar.gz |
Merge pull request #1088 from oleksii-shnyra/fix-1074
plumbing: object, Count stats properly when no new line added at the …
Diffstat (limited to 'plumbing')
-rw-r--r-- | plumbing/object/commit_stats_test.go | 78 | ||||
-rw-r--r-- | plumbing/object/patch.go | 11 |
2 files changed, 87 insertions, 2 deletions
diff --git a/plumbing/object/commit_stats_test.go b/plumbing/object/commit_stats_test.go new file mode 100644 index 0000000..ce366a2 --- /dev/null +++ b/plumbing/object/commit_stats_test.go @@ -0,0 +1,78 @@ +package object_test + +import ( + "time" + + "gopkg.in/src-d/go-git.v4" + "gopkg.in/src-d/go-git.v4/plumbing" + "gopkg.in/src-d/go-git.v4/plumbing/object" + "gopkg.in/src-d/go-git.v4/storage/memory" + + . "gopkg.in/check.v1" + "gopkg.in/src-d/go-billy.v4/memfs" + "gopkg.in/src-d/go-billy.v4/util" + "gopkg.in/src-d/go-git-fixtures.v3" +) + +type CommitStatsSuite struct { + fixtures.Suite +} + +var _ = Suite(&CommitStatsSuite{}) + +func (s *CommitStatsSuite) TestStats(c *C) { + r, hash := s.writeHisotry(c, []byte("foo\n"), []byte("foo\nbar\n")) + + aCommit, err := r.CommitObject(hash) + c.Assert(err, IsNil) + + fileStats, err := aCommit.Stats() + c.Assert(err, IsNil) + + c.Assert(fileStats[0].Name, Equals, "foo") + c.Assert(fileStats[0].Addition, Equals, 1) + c.Assert(fileStats[0].Deletion, Equals, 0) + c.Assert(fileStats[0].String(), Equals, " foo | 1 +\n") +} + +func (s *CommitStatsSuite) TestStats_WithoutNewLine(c *C) { + r, hash := s.writeHisotry(c, []byte("foo\nbar"), []byte("foo\nbar\n")) + + aCommit, err := r.CommitObject(hash) + c.Assert(err, IsNil) + + fileStats, err := aCommit.Stats() + c.Assert(err, IsNil) + + c.Assert(fileStats[0].Name, Equals, "foo") + c.Assert(fileStats[0].Addition, Equals, 1) + c.Assert(fileStats[0].Deletion, Equals, 1) + c.Assert(fileStats[0].String(), Equals, " foo | 2 +-\n") +} + +func (s *CommitStatsSuite) writeHisotry(c *C, files ...[]byte) (*git.Repository, plumbing.Hash) { + cm := &git.CommitOptions{ + Author: &object.Signature{Name: "Foo", Email: "foo@example.local", When: time.Now()}, + } + + fs := memfs.New() + r, err := git.Init(memory.NewStorage(), fs) + c.Assert(err, IsNil) + + w, err := r.Worktree() + c.Assert(err, IsNil) + + var hash plumbing.Hash + for _, content := range files { + util.WriteFile(fs, "foo", content, 0644) + + _, err = w.Add("foo") + c.Assert(err, IsNil) + + hash, err = w.Commit("foo\n", cm) + c.Assert(err, IsNil) + + } + + return r, hash +} diff --git a/plumbing/object/patch.go b/plumbing/object/patch.go index adeaccb..068589e 100644 --- a/plumbing/object/patch.go +++ b/plumbing/object/patch.go @@ -320,11 +320,18 @@ func getFileStatsFromFilePatches(filePatches []fdiff.FilePatch) FileStats { } for _, chunk := range fp.Chunks() { + s := chunk.Content() switch chunk.Type() { case fdiff.Add: - cs.Addition += strings.Count(chunk.Content(), "\n") + cs.Addition += strings.Count(s, "\n") + if s[len(s)-1] != '\n' { + cs.Addition++ + } case fdiff.Delete: - cs.Deletion += strings.Count(chunk.Content(), "\n") + cs.Deletion += strings.Count(s, "\n") + if s[len(s)-1] != '\n' { + cs.Deletion++ + } } } |