aboutsummaryrefslogtreecommitdiffstats
path: root/plumbing
diff options
context:
space:
mode:
authorMáximo Cuadros <mcuadros@gmail.com>2019-04-18 12:42:43 +0200
committerGitHub <noreply@github.com>2019-04-18 12:42:43 +0200
commitaa6f288c256ff8baf8a7745546a9752323dc0d89 (patch)
tree2a109735d6c9ff5f5cd2c61250008c479ecf30a6 /plumbing
parentcc5579e8f1d44e7a61b11221ba1b0f6d8afe4e6a (diff)
downloadgo-git-aa6f288c256ff8baf8a7745546a9752323dc0d89.tar.gz
plumbing: commit.StatsContext and fix for orphan commit (#1115)v4.11.0
plumbing: commit.StatsContext and fix for root commit
Diffstat (limited to 'plumbing')
-rw-r--r--plumbing/object/commit.go38
-rw-r--r--plumbing/object/commit_stats_test.go17
2 files changed, 40 insertions, 15 deletions
diff --git a/plumbing/object/commit.go b/plumbing/object/commit.go
index e254342..b569d3c 100644
--- a/plumbing/object/commit.go
+++ b/plumbing/object/commit.go
@@ -76,8 +76,8 @@ func (c *Commit) Tree() (*Tree, error) {
return GetTree(c.s, c.TreeHash)
}
-// Patch returns the Patch between the actual commit and the provided one.
-// Error will be return if context expires. Provided context must be non-nil
+// PatchContext returns the Patch between the actual commit and the provided one.
+// Error will be return if context expires. Provided context must be non-nil.
func (c *Commit) PatchContext(ctx context.Context, to *Commit) (*Patch, error) {
fromTree, err := c.Tree()
if err != nil {
@@ -291,25 +291,33 @@ func (b *Commit) encode(o plumbing.EncodedObject, includeSig bool) (err error) {
return err
}
-// Stats shows the status of commit.
+// Stats returns the stats of a commit.
func (c *Commit) Stats() (FileStats, error) {
- // Get the previous commit.
- ci := c.Parents()
- parentCommit, err := ci.Next()
+ return c.StatsContext(context.Background())
+}
+
+// StatsContext returns the stats of a commit. Error will be return if context
+// expires. Provided context must be non-nil.
+func (c *Commit) StatsContext(ctx context.Context) (FileStats, error) {
+ fromTree, err := c.Tree()
if err != nil {
- if err == io.EOF {
- emptyNoder := treeNoder{}
- parentCommit = &Commit{
- Hash: emptyNoder.hash,
- // TreeHash: emptyNoder.parent.Hash,
- s: c.s,
- }
- } else {
+ return nil, err
+ }
+
+ toTree := &Tree{}
+ if c.NumParents() != 0 {
+ firstParent, err := c.Parents().Next()
+ if err != nil {
+ return nil, err
+ }
+
+ toTree, err = firstParent.Tree()
+ if err != nil {
return nil, err
}
}
- patch, err := parentCommit.Patch(c)
+ patch, err := toTree.PatchContext(ctx, fromTree)
if err != nil {
return nil, err
}
diff --git a/plumbing/object/commit_stats_test.go b/plumbing/object/commit_stats_test.go
index ce366a2..2fb3f08 100644
--- a/plumbing/object/commit_stats_test.go
+++ b/plumbing/object/commit_stats_test.go
@@ -1,6 +1,7 @@
package object_test
import (
+ "context"
"time"
"gopkg.in/src-d/go-git.v4"
@@ -26,9 +27,25 @@ func (s *CommitStatsSuite) TestStats(c *C) {
aCommit, err := r.CommitObject(hash)
c.Assert(err, IsNil)
+ fileStats, err := aCommit.StatsContext(context.Background())
+ 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_RootCommit(c *C) {
+ r, hash := s.writeHisotry(c, []byte("foo\n"))
+
+ aCommit, err := r.CommitObject(hash)
+ c.Assert(err, IsNil)
+
fileStats, err := aCommit.Stats()
c.Assert(err, IsNil)
+ c.Assert(fileStats, HasLen, 1)
c.Assert(fileStats[0].Name, Equals, "foo")
c.Assert(fileStats[0].Addition, Equals, 1)
c.Assert(fileStats[0].Deletion, Equals, 0)