浏览代码

Floor tick0 to the specified tick duration

Signed-off-by: Vadim Markovtsev <vadim@sourced.tech>
Vadim Markovtsev 6 年之前
父节点
当前提交
5c7d3842c9
共有 2 个文件被更改,包括 34 次插入7 次删除
  1. 14 3
      internal/plumbing/ticks.go
  2. 20 4
      internal/plumbing/ticks_test.go

+ 14 - 3
internal/plumbing/ticks.go

@@ -123,11 +123,12 @@ func (ticks *TicksSinceStart) Consume(deps map[string]interface{}) (map[string]i
 	if index == 0 {
 		// first iteration - initialize the file objects from the tree
 		// our precision is 1 day
-		*ticks.tick0 = commit.Committer.When
-		if ticks.tick0.Unix() < 631152000 { // 01.01.1990, that was 30 years ago
+		tick0 := commit.Committer.When
+		if tick0.Unix() < 631152000 { // 01.01.1990, that was 30 years ago
 			ticks.l.Warnf("suspicious committer timestamp in %s > %s: %d",
-				ticks.remote, commit.Hash.String(), ticks.tick0.Unix())
+				ticks.remote, commit.Hash.String(), tick0.Unix())
 		}
+		*ticks.tick0 = FloorTime(tick0, ticks.TickSize)
 	}
 
 	tick := int(commit.Committer.When.Sub(*ticks.tick0) / ticks.TickSize)
@@ -163,6 +164,16 @@ func (ticks *TicksSinceStart) Fork(n int) []core.PipelineItem {
 	return core.ForkCopyPipelineItem(ticks, n)
 }
 
+// FloorTime is the missing implementation of time.Time.Floor() - round to the nearest less than or equal.
+func FloorTime(t time.Time, d time.Duration) time.Time {
+	// We have check if the regular rounding resulted in Floor() + d.
+	result := t.Round(d)
+	if result.After(t) {
+		result = result.Add(-d)
+	}
+	return result
+}
+
 func init() {
 	core.Registry.Register(&TicksSinceStart{})
 }

+ 20 - 4
internal/plumbing/ticks_test.go

@@ -49,6 +49,7 @@ func TestTicksSinceStartRegistration(t *testing.T) {
 
 func TestTicksSinceStartConsume(t *testing.T) {
 	tss := fixtureTicksSinceStart()
+	tss.TickSize = time.Second
 	deps := map[string]interface{}{}
 	commit, _ := test.Repository.CommitObject(plumbing.NewHash(
 		"cce947b98a050c6d356bc6ba95030254914027b1"))
@@ -58,10 +59,25 @@ func TestTicksSinceStartConsume(t *testing.T) {
 	assert.Nil(t, err)
 	assert.Equal(t, 0, res[DependencyTick].(int))
 	assert.Equal(t, 0, tss.previousTick)
+	assert.Equal(t, 2016, tss.tick0.Year())
+	assert.Equal(t, time.Month(12), tss.tick0.Month())
+	assert.Equal(t, 12, tss.tick0.Day())
 	assert.Equal(t, 18, tss.tick0.Hour())   // 18 UTC+1
 	assert.Equal(t, 30, tss.tick0.Minute()) // 30
 	assert.Equal(t, 29, tss.tick0.Second()) // 29
 
+	tss = fixtureTicksSinceStart()
+	res, err = tss.Consume(deps)
+	assert.Nil(t, err)
+	assert.Equal(t, 0, res[DependencyTick].(int))
+	assert.Equal(t, 0, tss.previousTick)
+	assert.Equal(t, 2016, tss.tick0.Year())
+	assert.Equal(t, time.Month(12), tss.tick0.Month())
+	assert.Equal(t, 12, tss.tick0.Day())
+	assert.Equal(t, 1, tss.tick0.Hour()) // UTC+1
+	assert.Equal(t, 0, tss.tick0.Minute())
+	assert.Equal(t, 0, tss.tick0.Second())
+
 	commit, _ = test.Repository.CommitObject(plumbing.NewHash(
 		"fc9ceecb6dabcb2aab60e8619d972e8d8208a7df"))
 	deps[core.DependencyCommit] = commit
@@ -123,9 +139,9 @@ func TestTicksSinceStartConsumeWithTickSize(t *testing.T) {
 	assert.Nil(t, err)
 	assert.Equal(t, 0, res[DependencyTick].(int))
 	assert.Equal(t, 0, tss.previousTick)
-	assert.Equal(t, 18, tss.tick0.Hour())   // 18 UTC+1
-	assert.Equal(t, 30, tss.tick0.Minute()) // 30
-	assert.Equal(t, 29, tss.tick0.Second()) // 29
+	assert.Equal(t, 18, tss.tick0.Hour())  // 18 UTC+1
+	assert.Equal(t, 0, tss.tick0.Minute()) // 30
+	assert.Equal(t, 0, tss.tick0.Second()) // 29
 
 	commit, _ = test.Repository.CommitObject(plumbing.NewHash(
 		"fc9ceecb6dabcb2aab60e8619d972e8d8208a7df"))
@@ -160,7 +176,7 @@ func TestTicksCommits(t *testing.T) {
 	tss.commits[0] = []plumbing.Hash{plumbing.NewHash(
 		"cce947b98a050c6d356bc6ba95030254914027b1")}
 	commits := tss.commits
-	tss.Initialize(test.Repository)
+	assert.NoError(t, tss.Initialize(test.Repository))
 	assert.Len(t, tss.commits, 0)
 	assert.Equal(t, tss.commits, commits)
 }