瀏覽代碼

Add tracking commits by day in DaysSinceStart

Signed-off-by: Vadim Markovtsev <vadim@sourced.tech>
Vadim Markovtsev 7 年之前
父節點
當前提交
d8e3306d94
共有 2 個文件被更改,包括 47 次插入2 次删除
  1. 25 1
      day.go
  2. 22 1
      day_test.go

+ 25 - 1
day.go

@@ -4,6 +4,7 @@ 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"
 )
 
@@ -12,12 +13,16 @@ import (
 type DaysSinceStart struct {
 	day0        time.Time
 	previousDay int
+	commits     map[int][]plumbing.Hash
 }
 
 const (
 	// DependencyDay is the name of the dependency which DaysSinceStart provides - the number
 	// of days since the first commit in the analysed sequence.
 	DependencyDay = "day"
+
+	// FactCommitsByDay contains the mapping between day indices and the corresponding commits.
+	FactCommitsByDay = "DaysSinceStart.Commits"
 )
 
 // Name of this PipelineItem. Uniquely identifies the type, used for mapping keys, etc.
@@ -46,13 +51,27 @@ func (days *DaysSinceStart) ListConfigurationOptions() []ConfigurationOption {
 }
 
 // Configure sets the properties previously published by ListConfigurationOptions().
-func (days *DaysSinceStart) Configure(facts map[string]interface{}) {}
+func (days *DaysSinceStart) Configure(facts map[string]interface{}) {
+	if days.commits == nil {
+		days.commits = map[int][]plumbing.Hash{}
+	}
+	facts[FactCommitsByDay] = days.commits
+}
 
 // Initialize resets the temporary caches and prepares this PipelineItem for a series of Consume()
 // calls. The repository which is going to be analysed is supplied as an argument.
 func (days *DaysSinceStart) Initialize(repository *git.Repository) {
 	days.day0 = time.Time{}
 	days.previousDay = 0
+	if len(days.commits) > 0 {
+		keys := make([]int, len(days.commits))
+		for key := range days.commits {
+			keys = append(keys, key)
+		}
+		for _, key := range keys {
+			delete(days.commits, key)
+		}
+	}
 }
 
 // Consume runs this PipelineItem on the next commit data.
@@ -75,6 +94,11 @@ func (days *DaysSinceStart) Consume(deps map[string]interface{}) (map[string]int
 		day = days.previousDay
 	}
 	days.previousDay = day
+	dayCommits := days.commits[day]
+	if dayCommits == nil {
+		dayCommits = []plumbing.Hash{}
+	}
+	days.commits[day] = append(dayCommits, commit.Hash)
 	return map[string]interface{}{DependencyDay: day}, nil
 }
 

+ 22 - 1
day_test.go

@@ -9,6 +9,7 @@ import (
 
 func fixtureDaysSinceStart() *DaysSinceStart {
 	dss := DaysSinceStart{}
+	dss.Configure(map[string]interface{}{})
 	dss.Initialize(testRepository)
 	return &dss
 }
@@ -20,7 +21,7 @@ func TestDaysSinceStartMeta(t *testing.T) {
 	assert.Equal(t, dss.Provides()[0], DependencyDay)
 	assert.Equal(t, len(dss.Requires()), 0)
 	assert.Len(t, dss.ListConfigurationOptions(), 0)
-	dss.Configure(nil)
+	dss.Configure(map[string]interface{}{})
 }
 
 func TestDaysSinceStartRegistration(t *testing.T) {
@@ -83,4 +84,24 @@ func TestDaysSinceStartConsume(t *testing.T) {
 	assert.Nil(t, err)
 	assert.Equal(t, res[DependencyDay].(int), 2)
 	assert.Equal(t, dss.previousDay, 2)
+
+	assert.Len(t, dss.commits, 3)
+	assert.Equal(t, dss.commits[0], []plumbing.Hash{plumbing.NewHash(
+		"cce947b98a050c6d356bc6ba95030254914027b1")})
+	assert.Equal(t, dss.commits[1], []plumbing.Hash{
+		plumbing.NewHash("fc9ceecb6dabcb2aab60e8619d972e8d8208a7df"),
+		plumbing.NewHash("a3ee37f91f0d705ec9c41ae88426f0ae44b2fbc3")})
+	assert.Equal(t, dss.commits[2], []plumbing.Hash{
+		plumbing.NewHash("a8b665a65d7aced63f5ba2ff6d9b71dac227f8cf"),
+		plumbing.NewHash("186ff0d7e4983637bb3762a24d6d0a658e7f4712")})
+}
+
+func TestDaysCommits(t *testing.T) {
+	dss := fixtureDaysSinceStart()
+	dss.commits[0] = []plumbing.Hash{plumbing.NewHash(
+		"cce947b98a050c6d356bc6ba95030254914027b1")}
+	commits := dss.commits
+	dss.Initialize(testRepository)
+	assert.Len(t, dss.commits, 0)
+	assert.Equal(t, dss.commits, commits)
 }