Fixed several issues, contineued web work
Fixed lots of issues with thread saftey and had to rethink some stuff Fixed order issues with timekeys Starting to flesh out the web REST API
This commit is contained in:
@ -29,10 +29,6 @@ func NewTimeKey() TimeKey {
|
||||
nsec := t.Nanosecond()
|
||||
|
||||
return TimeKey{
|
||||
rBits[0], //random
|
||||
rBits[1],
|
||||
rBits[2],
|
||||
rBits[3],
|
||||
byte(sec >> 56), // seconds
|
||||
byte(sec >> 48),
|
||||
byte(sec >> 40),
|
||||
@ -45,12 +41,16 @@ func NewTimeKey() TimeKey {
|
||||
byte(nsec >> 16),
|
||||
byte(nsec >> 8),
|
||||
byte(nsec),
|
||||
rBits[0], //random
|
||||
rBits[1],
|
||||
rBits[2],
|
||||
rBits[3],
|
||||
}
|
||||
}
|
||||
|
||||
// Time returns the time portion of a timekey
|
||||
func (k TimeKey) Time() time.Time {
|
||||
buf := k[4:]
|
||||
buf := k[:]
|
||||
|
||||
sec := int64(buf[7]) | int64(buf[6])<<8 | int64(buf[5])<<16 | int64(buf[4])<<24 |
|
||||
int64(buf[3])<<32 | int64(buf[2])<<40 | int64(buf[1])<<48 | int64(buf[0])<<56
|
||||
|
@ -11,11 +11,12 @@ import (
|
||||
"github.com/boltdb/bolt"
|
||||
)
|
||||
|
||||
type log struct {
|
||||
When time.Time `json:"when"`
|
||||
Version string `json:"version"`
|
||||
Stage string `json:"stage"`
|
||||
Log string `json:"log"`
|
||||
// Log is a version log entry for a project
|
||||
type Log struct {
|
||||
When time.Time `json:"when,omitempty"`
|
||||
Version string `json:"version,omitempty"`
|
||||
Stage string `json:"stage,omitempty"`
|
||||
Log string `json:"log,omitempty"`
|
||||
}
|
||||
|
||||
const bucketLog = "log"
|
||||
@ -24,7 +25,7 @@ const bucketLog = "log"
|
||||
func (ds *Store) AddLog(version, stage, entry string) error {
|
||||
key := NewTimeKey()
|
||||
|
||||
data := &log{
|
||||
data := &Log{
|
||||
When: key.Time(),
|
||||
Version: version,
|
||||
Stage: stage,
|
||||
@ -34,23 +35,26 @@ func (ds *Store) AddLog(version, stage, entry string) error {
|
||||
return ds.put(bucketLog, key, data)
|
||||
}
|
||||
|
||||
// LatestVersion returns the latest version (successful or otherwise) for the current project
|
||||
func (ds *Store) LatestVersion() (string, error) {
|
||||
// LastVersion returns the last version in the log for the given stage. If stage is blank,
|
||||
// then it returns the last of any stage
|
||||
func (ds *Store) LastVersion(stage string) (string, error) {
|
||||
version := ""
|
||||
|
||||
err := ds.bolt.View(func(tx *bolt.Tx) error {
|
||||
c := tx.Bucket([]byte(bucketLog)).Cursor()
|
||||
|
||||
for k, v := c.First(); k != nil; k, v = c.Next() {
|
||||
l := &log{}
|
||||
for k, v := c.Last(); k != nil; k, v = c.Prev() {
|
||||
l := &Log{}
|
||||
err := json.Unmarshal(v, l)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if l.Version != "" {
|
||||
version = l.Version
|
||||
return nil
|
||||
if stage == "" || l.Stage == stage {
|
||||
version = l.Version
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -63,3 +67,38 @@ func (ds *Store) LatestVersion() (string, error) {
|
||||
|
||||
return version, nil
|
||||
}
|
||||
|
||||
// Versions lists the versions in a given project, including the last stage that version got to
|
||||
func (ds *Store) Versions() ([]*Log, error) {
|
||||
var vers []*Log
|
||||
|
||||
err := ds.bolt.View(func(tx *bolt.Tx) error {
|
||||
c := tx.Bucket([]byte(bucketLog)).Cursor()
|
||||
|
||||
var current = ""
|
||||
|
||||
for k, v := c.Last(); k != nil; k, v = c.Prev() {
|
||||
l := &Log{}
|
||||
err := json.Unmarshal(v, l)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// capture the newest entry for each version
|
||||
if l.Version != current {
|
||||
l.Log = "" // only care about date, ver and stage
|
||||
vers = append(vers, l)
|
||||
current = l.Version
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return vers, nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user