Add Node.ID

Fixes #2071
This commit is contained in:
Bjørn Erik Pedersen 2016-04-11 11:49:02 +02:00
parent 37fb2d43e5
commit 5ef52294f9
2 changed files with 49 additions and 1 deletions

View file

@ -14,10 +14,12 @@
package hugolib package hugolib
import ( import (
"github.com/spf13/cast"
"html/template" "html/template"
"sync" "sync"
"sync/atomic"
"time" "time"
"github.com/spf13/cast"
) )
type Node struct { type Node struct {
@ -37,6 +39,24 @@ type Node struct {
paginator *Pager paginator *Pager
paginatorInit sync.Once paginatorInit sync.Once
scratch *Scratch scratch *Scratch
id int
idInit sync.Once
}
// This should probably be owned by Site and new ids assigned on creation,
// but that would lead to massive changes; do it simple for now.
var nodeIDCounter uint64
func nextNodeID() int {
return int(atomic.AddUint64(&nodeIDCounter, 1))
}
// ID returns an integer that identifies this Node.
// This is unique for a given Hugo build, but must not be considered stable.
// See UniqueID on Page for an identify that is stable for repeated builds.
func (n *Node) ID() int {
n.idInit.Do(func() { n.id = nextNodeID() })
return n.id
} }
func (n *Node) Now() time.Time { func (n *Node) Now() time.Time {

View file

@ -14,8 +14,11 @@
package hugolib package hugolib
import ( import (
"sync"
"testing" "testing"
"time" "time"
"github.com/stretchr/testify/assert"
) )
func TestNodeSimpleMethods(t *testing.T) { func TestNodeSimpleMethods(t *testing.T) {
@ -38,3 +41,28 @@ func TestNodeSimpleMethods(t *testing.T) {
} }
} }
} }
func TestNodeID(t *testing.T) {
t.Parallel()
n1 := &Node{}
n2 := &Node{}
assert.True(t, n1.ID() > 0)
assert.Equal(t, n1.ID(), n1.ID())
assert.True(t, n2.ID() > n1.ID())
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go func(j int) {
for k := 0; k < 10; k++ {
n := &Node{}
assert.True(t, n.ID() > 0)
}
wg.Done()
}(i)
}
wg.Wait()
}