瀏覽代碼

Merge pull request #1792 from jeffallen/uuid

Change go-uuid to use the current supported repository.
Felix Lange 10 年之前
父節點
當前提交
a9c809b441

+ 4 - 5
Godeps/Godeps.json

@@ -5,11 +5,6 @@
 		"./..."
 		"./..."
 	],
 	],
 	"Deps": [
 	"Deps": [
-		{
-			"ImportPath": "code.google.com/p/go-uuid/uuid",
-			"Comment": "null-12",
-			"Rev": "7dda39b2e7d5e265014674c5af696ba4186679e9"
-		},
 		{
 		{
 			"ImportPath": "github.com/codegangsta/cli",
 			"ImportPath": "github.com/codegangsta/cli",
 			"Comment": "1.2.0-95-g9b2bd2b",
 			"Comment": "1.2.0-95-g9b2bd2b",
@@ -62,6 +57,10 @@
 			"ImportPath": "github.com/nsf/termbox-go",
 			"ImportPath": "github.com/nsf/termbox-go",
 			"Rev": "675ffd907b7401b8a709a5ef2249978af5616bb2"
 			"Rev": "675ffd907b7401b8a709a5ef2249978af5616bb2"
 		},
 		},
+		{
+			"ImportPath": "github.com/pborman/uuid",
+			"Rev": "cccd189d45f7ac3368a0d127efb7f4d08ae0b655"
+		},
 		{
 		{
 			"ImportPath": "github.com/peterh/liner",
 			"ImportPath": "github.com/peterh/liner",
 			"Rev": "29f6a646557d83e2b6e9ba05c45fbea9c006dbe8"
 			"Rev": "29f6a646557d83e2b6e9ba05c45fbea9c006dbe8"

+ 1 - 0
Godeps/_workspace/src/github.com/pborman/uuid/CONTRIBUTORS

@@ -0,0 +1 @@
+Paul Borman <borman@google.com>

+ 1 - 1
Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/LICENSE → Godeps/_workspace/src/github.com/pborman/uuid/LICENSE

@@ -1,4 +1,4 @@
-Copyright (c) 2009 Google Inc. All rights reserved.
+Copyright (c) 2009,2014 Google Inc. All rights reserved.
 
 
 Redistribution and use in source and binary forms, with or without
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 modification, are permitted provided that the following conditions are

+ 0 - 0
Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/dce.go → Godeps/_workspace/src/github.com/pborman/uuid/dce.go


+ 0 - 0
Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/doc.go → Godeps/_workspace/src/github.com/pborman/uuid/doc.go


+ 0 - 0
Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/hash.go → Godeps/_workspace/src/github.com/pborman/uuid/hash.go


+ 30 - 0
Godeps/_workspace/src/github.com/pborman/uuid/json.go

@@ -0,0 +1,30 @@
+// Copyright 2014 Google Inc.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package uuid
+
+import "errors"
+
+func (u UUID) MarshalJSON() ([]byte, error) {
+	if len(u) == 0 {
+		return []byte(`""`), nil
+	}
+	return []byte(`"` + u.String() + `"`), nil
+}
+
+func (u *UUID) UnmarshalJSON(data []byte) error {
+	if len(data) == 0 || string(data) == `""` {
+		return nil
+	}
+	if len(data) < 2 || data[0] != '"' || data[len(data)-1] != '"' {
+		return errors.New("invalid UUID format")
+	}
+	data = data[1 : len(data)-1]
+	uu := Parse(string(data))
+	if uu == nil {
+		return errors.New("invalid UUID format")
+	}
+	*u = uu
+	return nil
+}

+ 32 - 0
Godeps/_workspace/src/github.com/pborman/uuid/json_test.go

@@ -0,0 +1,32 @@
+// Copyright 2014 Google Inc.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package uuid
+
+import (
+	"encoding/json"
+	"reflect"
+	"testing"
+)
+
+var testUUID = Parse("f47ac10b-58cc-0372-8567-0e02b2c3d479")
+
+func TestJSON(t *testing.T) {
+	type S struct {
+		ID1 UUID
+		ID2 UUID
+	}
+	s1 := S{ID1: testUUID}
+	data, err := json.Marshal(&s1)
+	if err != nil {
+		t.Fatal(err)
+	}
+	var s2 S
+	if err := json.Unmarshal(data, &s2); err != nil {
+		t.Fatal(err)
+	}
+	if !reflect.DeepEqual(&s1, &s2) {
+		t.Errorf("got %#v, want %#v", s2, s1)
+	}
+}

+ 0 - 0
Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/node.go → Godeps/_workspace/src/github.com/pborman/uuid/node.go


+ 66 - 0
Godeps/_workspace/src/github.com/pborman/uuid/seq_test.go

@@ -0,0 +1,66 @@
+// Copyright 2014 Google Inc.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package uuid
+
+import (
+	"flag"
+	"runtime"
+	"testing"
+	"time"
+)
+
+// This test is only run when --regressions is passed on the go test line.
+var regressions = flag.Bool("regressions", false, "run uuid regression tests")
+
+// TestClockSeqRace tests for a particular race condition of returning two
+// identical Version1 UUIDs.  The duration of 1 minute was chosen as the race
+// condition, before being fixed, nearly always occured in under 30 seconds.
+func TestClockSeqRace(t *testing.T) {
+	if !*regressions {
+		t.Skip("skipping regression tests")
+	}
+	duration := time.Minute
+
+	done := make(chan struct{})
+	defer close(done)
+
+	ch := make(chan UUID, 10000)
+	ncpu := runtime.NumCPU()
+	switch ncpu {
+	case 0, 1:
+		// We can't run the test effectively.
+		t.Skip("skipping race test, only one CPU detected")
+		return
+	default:
+		runtime.GOMAXPROCS(ncpu)
+	}
+	for i := 0; i < ncpu; i++ {
+		go func() {
+			for {
+				select {
+				case <-done:
+					return
+				case ch <- NewUUID():
+				}
+			}
+		}()
+	}
+
+	uuids := make(map[string]bool)
+	cnt := 0
+	start := time.Now()
+	for u := range ch {
+		s := u.String()
+		if uuids[s] {
+			t.Errorf("duplicate uuid after %d in %v: %s", cnt, time.Since(start), s)
+			return
+		}
+		uuids[s] = true
+		if time.Since(start) > duration {
+			return
+		}
+		cnt++
+	}
+}

+ 40 - 0
Godeps/_workspace/src/github.com/pborman/uuid/sql.go

@@ -0,0 +1,40 @@
+// Copyright 2015 Google Inc.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package uuid
+
+import (
+	"errors"
+	"fmt"
+)
+
+// Scan implements sql.Scanner so UUIDs can be read from databases transparently
+// Currently, database types that map to string and []byte are supported. Please
+// consult database-specific driver documentation for matching types.
+func (uuid *UUID) Scan(src interface{}) error {
+	switch src.(type) {
+	case string:
+		// see uuid.Parse for required string format
+		parsed := Parse(src.(string))
+
+		if parsed == nil {
+			return errors.New("Scan: invalid UUID format")
+		}
+
+		*uuid = parsed
+	case []byte:
+		// assumes a simple slice of bytes, just check validity and store
+		u := UUID(src.([]byte))
+
+		if u.Variant() == Invalid {
+			return errors.New("Scan: invalid UUID format")
+		}
+
+		*uuid = u
+	default:
+		return fmt.Errorf("Scan: unable to scan type %T into UUID", src)
+	}
+
+	return nil
+}

+ 53 - 0
Godeps/_workspace/src/github.com/pborman/uuid/sql_test.go

@@ -0,0 +1,53 @@
+// Copyright 2015 Google Inc.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package uuid
+
+import (
+	"strings"
+	"testing"
+)
+
+func TestScan(t *testing.T) {
+	var stringTest string = "f47ac10b-58cc-0372-8567-0e02b2c3d479"
+	var byteTest []byte = Parse(stringTest)
+	var badTypeTest int = 6
+	var invalidTest string = "f47ac10b-58cc-0372-8567-0e02b2c3d4"
+	var invalidByteTest []byte = Parse(invalidTest)
+
+	var uuid UUID
+	err := (&uuid).Scan(stringTest)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	err = (&uuid).Scan(byteTest)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	err = (&uuid).Scan(badTypeTest)
+	if err == nil {
+		t.Error("int correctly parsed and shouldn't have")
+	}
+	if !strings.Contains(err.Error(), "unable to scan type") {
+		t.Error("attempting to parse an int returned an incorrect error message")
+	}
+
+	err = (&uuid).Scan(invalidTest)
+	if err == nil {
+		t.Error("invalid uuid was parsed without error")
+	}
+	if !strings.Contains(err.Error(), "invalid UUID") {
+		t.Error("attempting to parse an invalid UUID returned an incorrect error message")
+	}
+
+	err = (&uuid).Scan(invalidByteTest)
+	if err == nil {
+		t.Error("invalid byte uuid was parsed without error")
+	}
+	if !strings.Contains(err.Error(), "invalid UUID") {
+		t.Error("attempting to parse an invalid byte UUID returned an incorrect error message")
+	}
+}

+ 5 - 5
Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/time.go → Godeps/_workspace/src/github.com/pborman/uuid/time.go

@@ -40,15 +40,15 @@ func (t Time) UnixTime() (sec, nsec int64) {
 }
 }
 
 
 // GetTime returns the current Time (100s of nanoseconds since 15 Oct 1582) and
 // GetTime returns the current Time (100s of nanoseconds since 15 Oct 1582) and
-// adjusts the clock sequence as needed.  An error is returned if the current
-// time cannot be determined.
-func GetTime() (Time, error) {
+// clock sequence as well as adjusting the clock sequence as needed.  An error
+// is returned if the current time cannot be determined.
+func GetTime() (Time, uint16, error) {
 	defer mu.Unlock()
 	defer mu.Unlock()
 	mu.Lock()
 	mu.Lock()
 	return getTime()
 	return getTime()
 }
 }
 
 
-func getTime() (Time, error) {
+func getTime() (Time, uint16, error) {
 	t := timeNow()
 	t := timeNow()
 
 
 	// If we don't have a clock sequence already, set one.
 	// If we don't have a clock sequence already, set one.
@@ -63,7 +63,7 @@ func getTime() (Time, error) {
 		clock_seq = ((clock_seq + 1) & 0x3fff) | 0x8000
 		clock_seq = ((clock_seq + 1) & 0x3fff) | 0x8000
 	}
 	}
 	lasttime = now
 	lasttime = now
-	return Time(now), nil
+	return Time(now), clock_seq, nil
 }
 }
 
 
 // ClockSequence returns the current clock sequence, generating one if not
 // ClockSequence returns the current clock sequence, generating one if not

+ 0 - 0
Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/util.go → Godeps/_workspace/src/github.com/pborman/uuid/util.go


+ 0 - 0
Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/uuid.go → Godeps/_workspace/src/github.com/pborman/uuid/uuid.go


+ 0 - 0
Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/uuid_test.go → Godeps/_workspace/src/github.com/pborman/uuid/uuid_test.go


+ 2 - 2
Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/version1.go → Godeps/_workspace/src/github.com/pborman/uuid/version1.go

@@ -19,7 +19,7 @@ func NewUUID() UUID {
 		SetNodeInterface("")
 		SetNodeInterface("")
 	}
 	}
 
 
-	now, err := GetTime()
+	now, seq, err := GetTime()
 	if err != nil {
 	if err != nil {
 		return nil
 		return nil
 	}
 	}
@@ -34,7 +34,7 @@ func NewUUID() UUID {
 	binary.BigEndian.PutUint32(uuid[0:], time_low)
 	binary.BigEndian.PutUint32(uuid[0:], time_low)
 	binary.BigEndian.PutUint16(uuid[4:], time_mid)
 	binary.BigEndian.PutUint16(uuid[4:], time_mid)
 	binary.BigEndian.PutUint16(uuid[6:], time_hi)
 	binary.BigEndian.PutUint16(uuid[6:], time_hi)
-	binary.BigEndian.PutUint16(uuid[8:], clock_seq)
+	binary.BigEndian.PutUint16(uuid[8:], seq)
 	copy(uuid[10:], nodeID)
 	copy(uuid[10:], nodeID)
 
 
 	return uuid
 	return uuid

+ 0 - 0
Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/version4.go → Godeps/_workspace/src/github.com/pborman/uuid/version4.go


+ 1 - 1
crypto/crypto.go

@@ -33,12 +33,12 @@ import (
 	"encoding/json"
 	"encoding/json"
 	"errors"
 	"errors"
 
 
-	"code.google.com/p/go-uuid/uuid"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/crypto/ecies"
 	"github.com/ethereum/go-ethereum/crypto/ecies"
 	"github.com/ethereum/go-ethereum/crypto/secp256k1"
 	"github.com/ethereum/go-ethereum/crypto/secp256k1"
 	"github.com/ethereum/go-ethereum/crypto/sha3"
 	"github.com/ethereum/go-ethereum/crypto/sha3"
 	"github.com/ethereum/go-ethereum/rlp"
 	"github.com/ethereum/go-ethereum/rlp"
+	"github.com/pborman/uuid"
 	"golang.org/x/crypto/pbkdf2"
 	"golang.org/x/crypto/pbkdf2"
 	"golang.org/x/crypto/ripemd160"
 	"golang.org/x/crypto/ripemd160"
 )
 )

+ 1 - 1
crypto/key.go

@@ -23,8 +23,8 @@ import (
 	"encoding/json"
 	"encoding/json"
 	"io"
 	"io"
 
 
-	"code.google.com/p/go-uuid/uuid"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common"
+	"github.com/pborman/uuid"
 )
 )
 
 
 const (
 const (

+ 1 - 1
crypto/key_store_passphrase.go

@@ -36,9 +36,9 @@ import (
 	"io"
 	"io"
 	"reflect"
 	"reflect"
 
 
-	"code.google.com/p/go-uuid/uuid"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/crypto/randentropy"
 	"github.com/ethereum/go-ethereum/crypto/randentropy"
+	"github.com/pborman/uuid"
 	"golang.org/x/crypto/pbkdf2"
 	"golang.org/x/crypto/pbkdf2"
 	"golang.org/x/crypto/scrypt"
 	"golang.org/x/crypto/scrypt"
 )
 )