From b9d055c0481006cd4b194d50a418144e45be12b1 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 8 Feb 2016 16:29:11 -0800 Subject: [PATCH 1/5] remove context from godeps, its in gx now License: MIT Signed-off-by: Jeromy --- .../src/golang.org/x/net/context/context.go | 447 -------------- .../golang.org/x/net/context/context_test.go | 575 ------------------ .../x/net/context/withtimeout_test.go | 26 - package.json | 5 + 4 files changed, 5 insertions(+), 1048 deletions(-) delete mode 100644 Godeps/_workspace/src/golang.org/x/net/context/context.go delete mode 100644 Godeps/_workspace/src/golang.org/x/net/context/context_test.go delete mode 100644 Godeps/_workspace/src/golang.org/x/net/context/withtimeout_test.go diff --git a/Godeps/_workspace/src/golang.org/x/net/context/context.go b/Godeps/_workspace/src/golang.org/x/net/context/context.go deleted file mode 100644 index ef2f3e86fec..00000000000 --- a/Godeps/_workspace/src/golang.org/x/net/context/context.go +++ /dev/null @@ -1,447 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package context defines the Context type, which carries deadlines, -// cancelation signals, and other request-scoped values across API boundaries -// and between processes. -// -// Incoming requests to a server should create a Context, and outgoing calls to -// servers should accept a Context. The chain of function calls between must -// propagate the Context, optionally replacing it with a modified copy created -// using WithDeadline, WithTimeout, WithCancel, or WithValue. -// -// Programs that use Contexts should follow these rules to keep interfaces -// consistent across packages and enable static analysis tools to check context -// propagation: -// -// Do not store Contexts inside a struct type; instead, pass a Context -// explicitly to each function that needs it. The Context should be the first -// parameter, typically named ctx: -// -// func DoSomething(ctx context.Context, arg Arg) error { -// // ... use ctx ... -// } -// -// Do not pass a nil Context, even if a function permits it. Pass context.TODO -// if you are unsure about which Context to use. -// -// Use context Values only for request-scoped data that transits processes and -// APIs, not for passing optional parameters to functions. -// -// The same Context may be passed to functions running in different goroutines; -// Contexts are safe for simultaneous use by multiple goroutines. -// -// See http://blog.golang.org/context for example code for a server that uses -// Contexts. -package context - -import ( - "errors" - "fmt" - "sync" - "time" -) - -// A Context carries a deadline, a cancelation signal, and other values across -// API boundaries. -// -// Context's methods may be called by multiple goroutines simultaneously. -type Context interface { - // Deadline returns the time when work done on behalf of this context - // should be canceled. Deadline returns ok==false when no deadline is - // set. Successive calls to Deadline return the same results. - Deadline() (deadline time.Time, ok bool) - - // Done returns a channel that's closed when work done on behalf of this - // context should be canceled. Done may return nil if this context can - // never be canceled. Successive calls to Done return the same value. - // - // WithCancel arranges for Done to be closed when cancel is called; - // WithDeadline arranges for Done to be closed when the deadline - // expires; WithTimeout arranges for Done to be closed when the timeout - // elapses. - // - // Done is provided for use in select statements: - // - // // Stream generates values with DoSomething and sends them to out - // // until DoSomething returns an error or ctx.Done is closed. - // func Stream(ctx context.Context, out <-chan Value) error { - // for { - // v, err := DoSomething(ctx) - // if err != nil { - // return err - // } - // select { - // case <-ctx.Done(): - // return ctx.Err() - // case out <- v: - // } - // } - // } - // - // See http://blog.golang.org/pipelines for more examples of how to use - // a Done channel for cancelation. - Done() <-chan struct{} - - // Err returns a non-nil error value after Done is closed. Err returns - // Canceled if the context was canceled or DeadlineExceeded if the - // context's deadline passed. No other values for Err are defined. - // After Done is closed, successive calls to Err return the same value. - Err() error - - // Value returns the value associated with this context for key, or nil - // if no value is associated with key. Successive calls to Value with - // the same key returns the same result. - // - // Use context values only for request-scoped data that transits - // processes and API boundaries, not for passing optional parameters to - // functions. - // - // A key identifies a specific value in a Context. Functions that wish - // to store values in Context typically allocate a key in a global - // variable then use that key as the argument to context.WithValue and - // Context.Value. A key can be any type that supports equality; - // packages should define keys as an unexported type to avoid - // collisions. - // - // Packages that define a Context key should provide type-safe accessors - // for the values stores using that key: - // - // // Package user defines a User type that's stored in Contexts. - // package user - // - // import "golang.org/x/net/context" - // - // // User is the type of value stored in the Contexts. - // type User struct {...} - // - // // key is an unexported type for keys defined in this package. - // // This prevents collisions with keys defined in other packages. - // type key int - // - // // userKey is the key for user.User values in Contexts. It is - // // unexported; clients use user.NewContext and user.FromContext - // // instead of using this key directly. - // var userKey key = 0 - // - // // NewContext returns a new Context that carries value u. - // func NewContext(ctx context.Context, u *User) context.Context { - // return context.WithValue(ctx, userKey, u) - // } - // - // // FromContext returns the User value stored in ctx, if any. - // func FromContext(ctx context.Context) (*User, bool) { - // u, ok := ctx.Value(userKey).(*User) - // return u, ok - // } - Value(key interface{}) interface{} -} - -// Canceled is the error returned by Context.Err when the context is canceled. -var Canceled = errors.New("context canceled") - -// DeadlineExceeded is the error returned by Context.Err when the context's -// deadline passes. -var DeadlineExceeded = errors.New("context deadline exceeded") - -// An emptyCtx is never canceled, has no values, and has no deadline. It is not -// struct{}, since vars of this type must have distinct addresses. -type emptyCtx int - -func (*emptyCtx) Deadline() (deadline time.Time, ok bool) { - return -} - -func (*emptyCtx) Done() <-chan struct{} { - return nil -} - -func (*emptyCtx) Err() error { - return nil -} - -func (*emptyCtx) Value(key interface{}) interface{} { - return nil -} - -func (e *emptyCtx) String() string { - switch e { - case background: - return "context.Background" - case todo: - return "context.TODO" - } - return "unknown empty Context" -} - -var ( - background = new(emptyCtx) - todo = new(emptyCtx) -) - -// Background returns a non-nil, empty Context. It is never canceled, has no -// values, and has no deadline. It is typically used by the main function, -// initialization, and tests, and as the top-level Context for incoming -// requests. -func Background() Context { - return background -} - -// TODO returns a non-nil, empty Context. Code should use context.TODO when -// it's unclear which Context to use or it's is not yet available (because the -// surrounding function has not yet been extended to accept a Context -// parameter). TODO is recognized by static analysis tools that determine -// whether Contexts are propagated correctly in a program. -func TODO() Context { - return todo -} - -// A CancelFunc tells an operation to abandon its work. -// A CancelFunc does not wait for the work to stop. -// After the first call, subsequent calls to a CancelFunc do nothing. -type CancelFunc func() - -// WithCancel returns a copy of parent with a new Done channel. The returned -// context's Done channel is closed when the returned cancel function is called -// or when the parent context's Done channel is closed, whichever happens first. -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete. -func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { - c := newCancelCtx(parent) - propagateCancel(parent, &c) - return &c, func() { c.cancel(true, Canceled) } -} - -// newCancelCtx returns an initialized cancelCtx. -func newCancelCtx(parent Context) cancelCtx { - return cancelCtx{ - Context: parent, - done: make(chan struct{}), - } -} - -// propagateCancel arranges for child to be canceled when parent is. -func propagateCancel(parent Context, child canceler) { - if parent.Done() == nil { - return // parent is never canceled - } - if p, ok := parentCancelCtx(parent); ok { - p.mu.Lock() - if p.err != nil { - // parent has already been canceled - child.cancel(false, p.err) - } else { - if p.children == nil { - p.children = make(map[canceler]bool) - } - p.children[child] = true - } - p.mu.Unlock() - } else { - go func() { - select { - case <-parent.Done(): - child.cancel(false, parent.Err()) - case <-child.Done(): - } - }() - } -} - -// parentCancelCtx follows a chain of parent references until it finds a -// *cancelCtx. This function understands how each of the concrete types in this -// package represents its parent. -func parentCancelCtx(parent Context) (*cancelCtx, bool) { - for { - switch c := parent.(type) { - case *cancelCtx: - return c, true - case *timerCtx: - return &c.cancelCtx, true - case *valueCtx: - parent = c.Context - default: - return nil, false - } - } -} - -// removeChild removes a context from its parent. -func removeChild(parent Context, child canceler) { - p, ok := parentCancelCtx(parent) - if !ok { - return - } - p.mu.Lock() - if p.children != nil { - delete(p.children, child) - } - p.mu.Unlock() -} - -// A canceler is a context type that can be canceled directly. The -// implementations are *cancelCtx and *timerCtx. -type canceler interface { - cancel(removeFromParent bool, err error) - Done() <-chan struct{} -} - -// A cancelCtx can be canceled. When canceled, it also cancels any children -// that implement canceler. -type cancelCtx struct { - Context - - done chan struct{} // closed by the first cancel call. - - mu sync.Mutex - children map[canceler]bool // set to nil by the first cancel call - err error // set to non-nil by the first cancel call -} - -func (c *cancelCtx) Done() <-chan struct{} { - return c.done -} - -func (c *cancelCtx) Err() error { - c.mu.Lock() - defer c.mu.Unlock() - return c.err -} - -func (c *cancelCtx) String() string { - return fmt.Sprintf("%v.WithCancel", c.Context) -} - -// cancel closes c.done, cancels each of c's children, and, if -// removeFromParent is true, removes c from its parent's children. -func (c *cancelCtx) cancel(removeFromParent bool, err error) { - if err == nil { - panic("context: internal error: missing cancel error") - } - c.mu.Lock() - if c.err != nil { - c.mu.Unlock() - return // already canceled - } - c.err = err - close(c.done) - for child := range c.children { - // NOTE: acquiring the child's lock while holding parent's lock. - child.cancel(false, err) - } - c.children = nil - c.mu.Unlock() - - if removeFromParent { - removeChild(c.Context, c) - } -} - -// WithDeadline returns a copy of the parent context with the deadline adjusted -// to be no later than d. If the parent's deadline is already earlier than d, -// WithDeadline(parent, d) is semantically equivalent to parent. The returned -// context's Done channel is closed when the deadline expires, when the returned -// cancel function is called, or when the parent context's Done channel is -// closed, whichever happens first. -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete. -func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) { - if cur, ok := parent.Deadline(); ok && cur.Before(deadline) { - // The current deadline is already sooner than the new one. - return WithCancel(parent) - } - c := &timerCtx{ - cancelCtx: newCancelCtx(parent), - deadline: deadline, - } - propagateCancel(parent, c) - d := deadline.Sub(time.Now()) - if d <= 0 { - c.cancel(true, DeadlineExceeded) // deadline has already passed - return c, func() { c.cancel(true, Canceled) } - } - c.mu.Lock() - defer c.mu.Unlock() - if c.err == nil { - c.timer = time.AfterFunc(d, func() { - c.cancel(true, DeadlineExceeded) - }) - } - return c, func() { c.cancel(true, Canceled) } -} - -// A timerCtx carries a timer and a deadline. It embeds a cancelCtx to -// implement Done and Err. It implements cancel by stopping its timer then -// delegating to cancelCtx.cancel. -type timerCtx struct { - cancelCtx - timer *time.Timer // Under cancelCtx.mu. - - deadline time.Time -} - -func (c *timerCtx) Deadline() (deadline time.Time, ok bool) { - return c.deadline, true -} - -func (c *timerCtx) String() string { - return fmt.Sprintf("%v.WithDeadline(%s [%s])", c.cancelCtx.Context, c.deadline, c.deadline.Sub(time.Now())) -} - -func (c *timerCtx) cancel(removeFromParent bool, err error) { - c.cancelCtx.cancel(false, err) - if removeFromParent { - // Remove this timerCtx from its parent cancelCtx's children. - removeChild(c.cancelCtx.Context, c) - } - c.mu.Lock() - if c.timer != nil { - c.timer.Stop() - c.timer = nil - } - c.mu.Unlock() -} - -// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)). -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete: -// -// func slowOperationWithTimeout(ctx context.Context) (Result, error) { -// ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) -// defer cancel() // releases resources if slowOperation completes before timeout elapses -// return slowOperation(ctx) -// } -func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) { - return WithDeadline(parent, time.Now().Add(timeout)) -} - -// WithValue returns a copy of parent in which the value associated with key is -// val. -// -// Use context Values only for request-scoped data that transits processes and -// APIs, not for passing optional parameters to functions. -func WithValue(parent Context, key interface{}, val interface{}) Context { - return &valueCtx{parent, key, val} -} - -// A valueCtx carries a key-value pair. It implements Value for that key and -// delegates all other calls to the embedded Context. -type valueCtx struct { - Context - key, val interface{} -} - -func (c *valueCtx) String() string { - return fmt.Sprintf("%v.WithValue(%#v, %#v)", c.Context, c.key, c.val) -} - -func (c *valueCtx) Value(key interface{}) interface{} { - if c.key == key { - return c.val - } - return c.Context.Value(key) -} diff --git a/Godeps/_workspace/src/golang.org/x/net/context/context_test.go b/Godeps/_workspace/src/golang.org/x/net/context/context_test.go deleted file mode 100644 index faf67722a0f..00000000000 --- a/Godeps/_workspace/src/golang.org/x/net/context/context_test.go +++ /dev/null @@ -1,575 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package context - -import ( - "fmt" - "math/rand" - "runtime" - "strings" - "sync" - "testing" - "time" -) - -// otherContext is a Context that's not one of the types defined in context.go. -// This lets us test code paths that differ based on the underlying type of the -// Context. -type otherContext struct { - Context -} - -func TestBackground(t *testing.T) { - c := Background() - if c == nil { - t.Fatalf("Background returned nil") - } - select { - case x := <-c.Done(): - t.Errorf("<-c.Done() == %v want nothing (it should block)", x) - default: - } - if got, want := fmt.Sprint(c), "context.Background"; got != want { - t.Errorf("Background().String() = %q want %q", got, want) - } -} - -func TestTODO(t *testing.T) { - c := TODO() - if c == nil { - t.Fatalf("TODO returned nil") - } - select { - case x := <-c.Done(): - t.Errorf("<-c.Done() == %v want nothing (it should block)", x) - default: - } - if got, want := fmt.Sprint(c), "context.TODO"; got != want { - t.Errorf("TODO().String() = %q want %q", got, want) - } -} - -func TestWithCancel(t *testing.T) { - c1, cancel := WithCancel(Background()) - - if got, want := fmt.Sprint(c1), "context.Background.WithCancel"; got != want { - t.Errorf("c1.String() = %q want %q", got, want) - } - - o := otherContext{c1} - c2, _ := WithCancel(o) - contexts := []Context{c1, o, c2} - - for i, c := range contexts { - if d := c.Done(); d == nil { - t.Errorf("c[%d].Done() == %v want non-nil", i, d) - } - if e := c.Err(); e != nil { - t.Errorf("c[%d].Err() == %v want nil", i, e) - } - - select { - case x := <-c.Done(): - t.Errorf("<-c.Done() == %v want nothing (it should block)", x) - default: - } - } - - cancel() - time.Sleep(100 * time.Millisecond) // let cancelation propagate - - for i, c := range contexts { - select { - case <-c.Done(): - default: - t.Errorf("<-c[%d].Done() blocked, but shouldn't have", i) - } - if e := c.Err(); e != Canceled { - t.Errorf("c[%d].Err() == %v want %v", i, e, Canceled) - } - } -} - -func TestParentFinishesChild(t *testing.T) { - // Context tree: - // parent -> cancelChild - // parent -> valueChild -> timerChild - parent, cancel := WithCancel(Background()) - cancelChild, stop := WithCancel(parent) - defer stop() - valueChild := WithValue(parent, "key", "value") - timerChild, stop := WithTimeout(valueChild, 10000*time.Hour) - defer stop() - - select { - case x := <-parent.Done(): - t.Errorf("<-parent.Done() == %v want nothing (it should block)", x) - case x := <-cancelChild.Done(): - t.Errorf("<-cancelChild.Done() == %v want nothing (it should block)", x) - case x := <-timerChild.Done(): - t.Errorf("<-timerChild.Done() == %v want nothing (it should block)", x) - case x := <-valueChild.Done(): - t.Errorf("<-valueChild.Done() == %v want nothing (it should block)", x) - default: - } - - // The parent's children should contain the two cancelable children. - pc := parent.(*cancelCtx) - cc := cancelChild.(*cancelCtx) - tc := timerChild.(*timerCtx) - pc.mu.Lock() - if len(pc.children) != 2 || !pc.children[cc] || !pc.children[tc] { - t.Errorf("bad linkage: pc.children = %v, want %v and %v", - pc.children, cc, tc) - } - pc.mu.Unlock() - - if p, ok := parentCancelCtx(cc.Context); !ok || p != pc { - t.Errorf("bad linkage: parentCancelCtx(cancelChild.Context) = %v, %v want %v, true", p, ok, pc) - } - if p, ok := parentCancelCtx(tc.Context); !ok || p != pc { - t.Errorf("bad linkage: parentCancelCtx(timerChild.Context) = %v, %v want %v, true", p, ok, pc) - } - - cancel() - - pc.mu.Lock() - if len(pc.children) != 0 { - t.Errorf("pc.cancel didn't clear pc.children = %v", pc.children) - } - pc.mu.Unlock() - - // parent and children should all be finished. - check := func(ctx Context, name string) { - select { - case <-ctx.Done(): - default: - t.Errorf("<-%s.Done() blocked, but shouldn't have", name) - } - if e := ctx.Err(); e != Canceled { - t.Errorf("%s.Err() == %v want %v", name, e, Canceled) - } - } - check(parent, "parent") - check(cancelChild, "cancelChild") - check(valueChild, "valueChild") - check(timerChild, "timerChild") - - // WithCancel should return a canceled context on a canceled parent. - precanceledChild := WithValue(parent, "key", "value") - select { - case <-precanceledChild.Done(): - default: - t.Errorf("<-precanceledChild.Done() blocked, but shouldn't have") - } - if e := precanceledChild.Err(); e != Canceled { - t.Errorf("precanceledChild.Err() == %v want %v", e, Canceled) - } -} - -func TestChildFinishesFirst(t *testing.T) { - cancelable, stop := WithCancel(Background()) - defer stop() - for _, parent := range []Context{Background(), cancelable} { - child, cancel := WithCancel(parent) - - select { - case x := <-parent.Done(): - t.Errorf("<-parent.Done() == %v want nothing (it should block)", x) - case x := <-child.Done(): - t.Errorf("<-child.Done() == %v want nothing (it should block)", x) - default: - } - - cc := child.(*cancelCtx) - pc, pcok := parent.(*cancelCtx) // pcok == false when parent == Background() - if p, ok := parentCancelCtx(cc.Context); ok != pcok || (ok && pc != p) { - t.Errorf("bad linkage: parentCancelCtx(cc.Context) = %v, %v want %v, %v", p, ok, pc, pcok) - } - - if pcok { - pc.mu.Lock() - if len(pc.children) != 1 || !pc.children[cc] { - t.Errorf("bad linkage: pc.children = %v, cc = %v", pc.children, cc) - } - pc.mu.Unlock() - } - - cancel() - - if pcok { - pc.mu.Lock() - if len(pc.children) != 0 { - t.Errorf("child's cancel didn't remove self from pc.children = %v", pc.children) - } - pc.mu.Unlock() - } - - // child should be finished. - select { - case <-child.Done(): - default: - t.Errorf("<-child.Done() blocked, but shouldn't have") - } - if e := child.Err(); e != Canceled { - t.Errorf("child.Err() == %v want %v", e, Canceled) - } - - // parent should not be finished. - select { - case x := <-parent.Done(): - t.Errorf("<-parent.Done() == %v want nothing (it should block)", x) - default: - } - if e := parent.Err(); e != nil { - t.Errorf("parent.Err() == %v want nil", e) - } - } -} - -func testDeadline(c Context, wait time.Duration, t *testing.T) { - select { - case <-time.After(wait): - t.Fatalf("context should have timed out") - case <-c.Done(): - } - if e := c.Err(); e != DeadlineExceeded { - t.Errorf("c.Err() == %v want %v", e, DeadlineExceeded) - } -} - -func TestDeadline(t *testing.T) { - c, _ := WithDeadline(Background(), time.Now().Add(100*time.Millisecond)) - if got, prefix := fmt.Sprint(c), "context.Background.WithDeadline("; !strings.HasPrefix(got, prefix) { - t.Errorf("c.String() = %q want prefix %q", got, prefix) - } - testDeadline(c, 200*time.Millisecond, t) - - c, _ = WithDeadline(Background(), time.Now().Add(100*time.Millisecond)) - o := otherContext{c} - testDeadline(o, 200*time.Millisecond, t) - - c, _ = WithDeadline(Background(), time.Now().Add(100*time.Millisecond)) - o = otherContext{c} - c, _ = WithDeadline(o, time.Now().Add(300*time.Millisecond)) - testDeadline(c, 200*time.Millisecond, t) -} - -func TestTimeout(t *testing.T) { - c, _ := WithTimeout(Background(), 100*time.Millisecond) - if got, prefix := fmt.Sprint(c), "context.Background.WithDeadline("; !strings.HasPrefix(got, prefix) { - t.Errorf("c.String() = %q want prefix %q", got, prefix) - } - testDeadline(c, 200*time.Millisecond, t) - - c, _ = WithTimeout(Background(), 100*time.Millisecond) - o := otherContext{c} - testDeadline(o, 200*time.Millisecond, t) - - c, _ = WithTimeout(Background(), 100*time.Millisecond) - o = otherContext{c} - c, _ = WithTimeout(o, 300*time.Millisecond) - testDeadline(c, 200*time.Millisecond, t) -} - -func TestCanceledTimeout(t *testing.T) { - c, _ := WithTimeout(Background(), 200*time.Millisecond) - o := otherContext{c} - c, cancel := WithTimeout(o, 400*time.Millisecond) - cancel() - time.Sleep(100 * time.Millisecond) // let cancelation propagate - select { - case <-c.Done(): - default: - t.Errorf("<-c.Done() blocked, but shouldn't have") - } - if e := c.Err(); e != Canceled { - t.Errorf("c.Err() == %v want %v", e, Canceled) - } -} - -type key1 int -type key2 int - -var k1 = key1(1) -var k2 = key2(1) // same int as k1, different type -var k3 = key2(3) // same type as k2, different int - -func TestValues(t *testing.T) { - check := func(c Context, nm, v1, v2, v3 string) { - if v, ok := c.Value(k1).(string); ok == (len(v1) == 0) || v != v1 { - t.Errorf(`%s.Value(k1).(string) = %q, %t want %q, %t`, nm, v, ok, v1, len(v1) != 0) - } - if v, ok := c.Value(k2).(string); ok == (len(v2) == 0) || v != v2 { - t.Errorf(`%s.Value(k2).(string) = %q, %t want %q, %t`, nm, v, ok, v2, len(v2) != 0) - } - if v, ok := c.Value(k3).(string); ok == (len(v3) == 0) || v != v3 { - t.Errorf(`%s.Value(k3).(string) = %q, %t want %q, %t`, nm, v, ok, v3, len(v3) != 0) - } - } - - c0 := Background() - check(c0, "c0", "", "", "") - - c1 := WithValue(Background(), k1, "c1k1") - check(c1, "c1", "c1k1", "", "") - - if got, want := fmt.Sprint(c1), `context.Background.WithValue(1, "c1k1")`; got != want { - t.Errorf("c.String() = %q want %q", got, want) - } - - c2 := WithValue(c1, k2, "c2k2") - check(c2, "c2", "c1k1", "c2k2", "") - - c3 := WithValue(c2, k3, "c3k3") - check(c3, "c2", "c1k1", "c2k2", "c3k3") - - c4 := WithValue(c3, k1, nil) - check(c4, "c4", "", "c2k2", "c3k3") - - o0 := otherContext{Background()} - check(o0, "o0", "", "", "") - - o1 := otherContext{WithValue(Background(), k1, "c1k1")} - check(o1, "o1", "c1k1", "", "") - - o2 := WithValue(o1, k2, "o2k2") - check(o2, "o2", "c1k1", "o2k2", "") - - o3 := otherContext{c4} - check(o3, "o3", "", "c2k2", "c3k3") - - o4 := WithValue(o3, k3, nil) - check(o4, "o4", "", "c2k2", "") -} - -func TestAllocs(t *testing.T) { - bg := Background() - for _, test := range []struct { - desc string - f func() - limit float64 - gccgoLimit float64 - }{ - { - desc: "Background()", - f: func() { Background() }, - limit: 0, - gccgoLimit: 0, - }, - { - desc: fmt.Sprintf("WithValue(bg, %v, nil)", k1), - f: func() { - c := WithValue(bg, k1, nil) - c.Value(k1) - }, - limit: 3, - gccgoLimit: 3, - }, - { - desc: "WithTimeout(bg, 15*time.Millisecond)", - f: func() { - c, _ := WithTimeout(bg, 15*time.Millisecond) - <-c.Done() - }, - limit: 8, - gccgoLimit: 13, - }, - { - desc: "WithCancel(bg)", - f: func() { - c, cancel := WithCancel(bg) - cancel() - <-c.Done() - }, - limit: 5, - gccgoLimit: 8, - }, - { - desc: "WithTimeout(bg, 100*time.Millisecond)", - f: func() { - c, cancel := WithTimeout(bg, 100*time.Millisecond) - cancel() - <-c.Done() - }, - limit: 8, - gccgoLimit: 25, - }, - } { - limit := test.limit - if runtime.Compiler == "gccgo" { - // gccgo does not yet do escape analysis. - // TOOD(iant): Remove this when gccgo does do escape analysis. - limit = test.gccgoLimit - } - if n := testing.AllocsPerRun(100, test.f); n > limit { - t.Errorf("%s allocs = %f want %d", test.desc, n, int(limit)) - } - } -} - -func TestSimultaneousCancels(t *testing.T) { - root, cancel := WithCancel(Background()) - m := map[Context]CancelFunc{root: cancel} - q := []Context{root} - // Create a tree of contexts. - for len(q) != 0 && len(m) < 100 { - parent := q[0] - q = q[1:] - for i := 0; i < 4; i++ { - ctx, cancel := WithCancel(parent) - m[ctx] = cancel - q = append(q, ctx) - } - } - // Start all the cancels in a random order. - var wg sync.WaitGroup - wg.Add(len(m)) - for _, cancel := range m { - go func(cancel CancelFunc) { - cancel() - wg.Done() - }(cancel) - } - // Wait on all the contexts in a random order. - for ctx := range m { - select { - case <-ctx.Done(): - case <-time.After(1 * time.Second): - buf := make([]byte, 10<<10) - n := runtime.Stack(buf, true) - t.Fatalf("timed out waiting for <-ctx.Done(); stacks:\n%s", buf[:n]) - } - } - // Wait for all the cancel functions to return. - done := make(chan struct{}) - go func() { - wg.Wait() - close(done) - }() - select { - case <-done: - case <-time.After(1 * time.Second): - buf := make([]byte, 10<<10) - n := runtime.Stack(buf, true) - t.Fatalf("timed out waiting for cancel functions; stacks:\n%s", buf[:n]) - } -} - -func TestInterlockedCancels(t *testing.T) { - parent, cancelParent := WithCancel(Background()) - child, cancelChild := WithCancel(parent) - go func() { - parent.Done() - cancelChild() - }() - cancelParent() - select { - case <-child.Done(): - case <-time.After(1 * time.Second): - buf := make([]byte, 10<<10) - n := runtime.Stack(buf, true) - t.Fatalf("timed out waiting for child.Done(); stacks:\n%s", buf[:n]) - } -} - -func TestLayersCancel(t *testing.T) { - testLayers(t, time.Now().UnixNano(), false) -} - -func TestLayersTimeout(t *testing.T) { - testLayers(t, time.Now().UnixNano(), true) -} - -func testLayers(t *testing.T, seed int64, testTimeout bool) { - rand.Seed(seed) - errorf := func(format string, a ...interface{}) { - t.Errorf(fmt.Sprintf("seed=%d: %s", seed, format), a...) - } - const ( - timeout = 200 * time.Millisecond - minLayers = 30 - ) - type value int - var ( - vals []*value - cancels []CancelFunc - numTimers int - ctx = Background() - ) - for i := 0; i < minLayers || numTimers == 0 || len(cancels) == 0 || len(vals) == 0; i++ { - switch rand.Intn(3) { - case 0: - v := new(value) - ctx = WithValue(ctx, v, v) - vals = append(vals, v) - case 1: - var cancel CancelFunc - ctx, cancel = WithCancel(ctx) - cancels = append(cancels, cancel) - case 2: - var cancel CancelFunc - ctx, cancel = WithTimeout(ctx, timeout) - cancels = append(cancels, cancel) - numTimers++ - } - } - checkValues := func(when string) { - for _, key := range vals { - if val := ctx.Value(key).(*value); key != val { - errorf("%s: ctx.Value(%p) = %p want %p", when, key, val, key) - } - } - } - select { - case <-ctx.Done(): - errorf("ctx should not be canceled yet") - default: - } - if s, prefix := fmt.Sprint(ctx), "context.Background."; !strings.HasPrefix(s, prefix) { - t.Errorf("ctx.String() = %q want prefix %q", s, prefix) - } - t.Log(ctx) - checkValues("before cancel") - if testTimeout { - select { - case <-ctx.Done(): - case <-time.After(timeout + timeout/10): - errorf("ctx should have timed out") - } - checkValues("after timeout") - } else { - cancel := cancels[rand.Intn(len(cancels))] - cancel() - select { - case <-ctx.Done(): - default: - errorf("ctx should be canceled") - } - checkValues("after cancel") - } -} - -func TestCancelRemoves(t *testing.T) { - checkChildren := func(when string, ctx Context, want int) { - if got := len(ctx.(*cancelCtx).children); got != want { - t.Errorf("%s: context has %d children, want %d", when, got, want) - } - } - - ctx, _ := WithCancel(Background()) - checkChildren("after creation", ctx, 0) - _, cancel := WithCancel(ctx) - checkChildren("with WithCancel child ", ctx, 1) - cancel() - checkChildren("after cancelling WithCancel child", ctx, 0) - - ctx, _ = WithCancel(Background()) - checkChildren("after creation", ctx, 0) - _, cancel = WithTimeout(ctx, 60*time.Minute) - checkChildren("with WithTimeout child ", ctx, 1) - cancel() - checkChildren("after cancelling WithTimeout child", ctx, 0) -} diff --git a/Godeps/_workspace/src/golang.org/x/net/context/withtimeout_test.go b/Godeps/_workspace/src/golang.org/x/net/context/withtimeout_test.go deleted file mode 100644 index 5ed70717375..00000000000 --- a/Godeps/_workspace/src/golang.org/x/net/context/withtimeout_test.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package context_test - -import ( - "fmt" - "time" - - "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" -) - -func ExampleWithTimeout() { - // Pass a context with a timeout to tell a blocking function that it - // should abandon its work after the timeout elapses. - ctx, _ := context.WithTimeout(context.Background(), 100*time.Millisecond) - select { - case <-time.After(200 * time.Millisecond): - fmt.Println("overslept") - case <-ctx.Done(): - fmt.Println(ctx.Err()) // prints "context deadline exceeded" - } - // Output: - // context deadline exceeded -} diff --git a/package.json b/package.json index 751db38d5ae..0af394021b3 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,11 @@ "name": "go-libp2p", "hash": "QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4", "version": "1.0.0" + }, + { + "name": "go-net", + "hash": "QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt", + "version": "0.0.0" } ], "language": "go", From 3faedb52086cf16b88cc83d3c0e9eedae2b83758 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 8 Feb 2016 16:45:15 -0800 Subject: [PATCH 2/5] remove goprocess from godeps, use gx vendored one License: MIT Signed-off-by: Jeromy --- .../ipfs/go-datastore/leveldb/datastore.go | 3 +- .../ipfs/go-datastore/query/query.go | 2 +- .../github.com/jbenet/goprocess/.travis.yml | 10 - .../src/github.com/jbenet/goprocess/LICENSE | 21 - .../src/github.com/jbenet/goprocess/README.md | 132 ---- .../jbenet/goprocess/context/context.go | 110 --- .../jbenet/goprocess/context/derive.go | 59 -- .../jbenet/goprocess/example_test.go | 37 - .../github.com/jbenet/goprocess/goprocess.go | 283 -------- .../jbenet/goprocess/goprocess_test.go | 638 ------------------ .../github.com/jbenet/goprocess/impl-mutex.go | 271 -------- .../src/github.com/jbenet/goprocess/link.go | 121 ---- .../jbenet/goprocess/periodic/README.md | 4 - .../goprocess/periodic/examples_test.go | 85 --- .../jbenet/goprocess/periodic/periodic.go | 232 ------- .../goprocess/periodic/periodic_test.go | 260 ------- .../jbenet/goprocess/ratelimit/README.md | 4 - .../jbenet/goprocess/ratelimit/ratelimit.go | 68 -- .../goprocess/ratelimit/ratelimit_test.go | 98 --- cmd/ipfswatch/main.go | 2 +- core/bootstrap.go | 6 +- core/builder.go | 2 +- core/core.go | 2 +- core/corehttp/corehttp.go | 2 +- exchange/bitswap/bitswap.go | 4 +- exchange/bitswap/workers.go | 4 +- fuse/mount/fuse.go | 3 +- fuse/mount/mount.go | 3 +- namesys/republisher/repub.go | 4 +- namesys/republisher/repub_test.go | 2 +- package.json | 5 + routing/dht/dht.go | 4 +- routing/dht/dht_bootstrap.go | 4 +- routing/dht/providers.go | 4 +- routing/dht/query.go | 4 +- thirdparty/notifier/notifier.go | 4 +- 36 files changed, 35 insertions(+), 2462 deletions(-) delete mode 100644 Godeps/_workspace/src/github.com/jbenet/goprocess/.travis.yml delete mode 100644 Godeps/_workspace/src/github.com/jbenet/goprocess/LICENSE delete mode 100644 Godeps/_workspace/src/github.com/jbenet/goprocess/README.md delete mode 100644 Godeps/_workspace/src/github.com/jbenet/goprocess/context/context.go delete mode 100644 Godeps/_workspace/src/github.com/jbenet/goprocess/context/derive.go delete mode 100644 Godeps/_workspace/src/github.com/jbenet/goprocess/example_test.go delete mode 100644 Godeps/_workspace/src/github.com/jbenet/goprocess/goprocess.go delete mode 100644 Godeps/_workspace/src/github.com/jbenet/goprocess/goprocess_test.go delete mode 100644 Godeps/_workspace/src/github.com/jbenet/goprocess/impl-mutex.go delete mode 100644 Godeps/_workspace/src/github.com/jbenet/goprocess/link.go delete mode 100644 Godeps/_workspace/src/github.com/jbenet/goprocess/periodic/README.md delete mode 100644 Godeps/_workspace/src/github.com/jbenet/goprocess/periodic/examples_test.go delete mode 100644 Godeps/_workspace/src/github.com/jbenet/goprocess/periodic/periodic.go delete mode 100644 Godeps/_workspace/src/github.com/jbenet/goprocess/periodic/periodic_test.go delete mode 100644 Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit/README.md delete mode 100644 Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit/ratelimit.go delete mode 100644 Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit/ratelimit_test.go diff --git a/Godeps/_workspace/src/github.com/ipfs/go-datastore/leveldb/datastore.go b/Godeps/_workspace/src/github.com/ipfs/go-datastore/leveldb/datastore.go index 3c28cd4fcb0..cc92456405a 100644 --- a/Godeps/_workspace/src/github.com/ipfs/go-datastore/leveldb/datastore.go +++ b/Godeps/_workspace/src/github.com/ipfs/go-datastore/leveldb/datastore.go @@ -3,10 +3,11 @@ package leveldb import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dsq "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/query" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/opt" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/util" + + "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" ) type datastore struct { diff --git a/Godeps/_workspace/src/github.com/ipfs/go-datastore/query/query.go b/Godeps/_workspace/src/github.com/ipfs/go-datastore/query/query.go index 257ff2d4308..5b3a679ce6c 100644 --- a/Godeps/_workspace/src/github.com/ipfs/go-datastore/query/query.go +++ b/Godeps/_workspace/src/github.com/ipfs/go-datastore/query/query.go @@ -1,7 +1,7 @@ package query import ( - goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" + goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" ) /* diff --git a/Godeps/_workspace/src/github.com/jbenet/goprocess/.travis.yml b/Godeps/_workspace/src/github.com/jbenet/goprocess/.travis.yml deleted file mode 100644 index 15de84170c8..00000000000 --- a/Godeps/_workspace/src/github.com/jbenet/goprocess/.travis.yml +++ /dev/null @@ -1,10 +0,0 @@ -sudo: false - -language: go - -go: - - 1.3 - - 1.4 - -script: - - go test -race -cpu=5 -v ./... diff --git a/Godeps/_workspace/src/github.com/jbenet/goprocess/LICENSE b/Godeps/_workspace/src/github.com/jbenet/goprocess/LICENSE deleted file mode 100644 index c7386b3c940..00000000000 --- a/Godeps/_workspace/src/github.com/jbenet/goprocess/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Juan Batiz-Benet - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Godeps/_workspace/src/github.com/jbenet/goprocess/README.md b/Godeps/_workspace/src/github.com/jbenet/goprocess/README.md deleted file mode 100644 index e2f12e16d65..00000000000 --- a/Godeps/_workspace/src/github.com/jbenet/goprocess/README.md +++ /dev/null @@ -1,132 +0,0 @@ -# goprocess - lifecycles in go - -[![travisbadge](https://travis-ci.org/jbenet/goprocess.svg)](https://travis-ci.org/jbenet/goprocess) - -(Based on https://github.com/jbenet/go-ctxgroup) - -- Godoc: https://godoc.org/github.com/jbenet/goprocess - -`goprocess` introduces a way to manage process lifecycles in go. It is -much like [go.net/context](https://godoc.org/code.google.com/p/go.net/context) -(it actually uses a Context), but it is more like a Context-WaitGroup hybrid. -`goprocess` is about being able to start and stop units of work, which may -receive `Close` signals from many clients. Think of it like a UNIX process -tree, but inside go. - -`goprocess` seeks to minimally affect your objects, so you can use it -with both embedding or composition. At the heart of `goprocess` is the -`Process` interface: - -```Go -// Process is the basic unit of work in goprocess. It defines a computation -// with a lifecycle: -// - running (before calling Close), -// - closing (after calling Close at least once), -// - closed (after Close returns, and all teardown has _completed_). -// -// More specifically, it fits this: -// -// p := WithTeardown(tf) // new process is created, it is now running. -// p.AddChild(q) // can register children **before** Closing. -// go p.Close() // blocks until done running teardown func. -// <-p.Closing() // would now return true. -// <-p.childrenDone() // wait on all children to be done -// p.teardown() // runs the user's teardown function tf. -// p.Close() // now returns, with error teardown returned. -// <-p.Closed() // would now return true. -// -// Processes can be arranged in a process "tree", where children are -// automatically Closed if their parents are closed. (Note, it is actually -// a Process DAG, children may have multiple parents). A process may also -// optionally wait for another to fully Close before beginning to Close. -// This makes it easy to ensure order of operations and proper sequential -// teardown of resurces. For example: -// -// p1 := goprocess.WithTeardown(func() error { -// fmt.Println("closing 1") -// }) -// p2 := goprocess.WithTeardown(func() error { -// fmt.Println("closing 2") -// }) -// p3 := goprocess.WithTeardown(func() error { -// fmt.Println("closing 3") -// }) -// -// p1.AddChild(p2) -// p2.AddChild(p3) -// -// -// go p1.Close() -// go p2.Close() -// go p3.Close() -// -// // Output: -// // closing 3 -// // closing 2 -// // closing 1 -// -// Process is modelled after the UNIX processes group idea, and heavily -// informed by sync.WaitGroup and go.net/context.Context. -// -// In the function documentation of this interface, `p` always refers to -// the self Process. -type Process interface { - - // WaitFor makes p wait for q before exiting. Thus, p will _always_ close - // _after_ q. Note well: a waiting cycle is deadlock. - // - // If q is already Closed, WaitFor calls p.Close() - // If p is already Closing or Closed, WaitFor panics. This is the same thing - // as calling Add(1) _after_ calling Done() on a wait group. Calling WaitFor - // on an already-closed process is a programming error likely due to bad - // synchronization - WaitFor(q Process) - - // AddChildNoWait registers child as a "child" of Process. As in UNIX, - // when parent is Closed, child is Closed -- child may Close beforehand. - // This is the equivalent of calling: - // - // go func(parent, child Process) { - // <-parent.Closing() - // child.Close() - // }(p, q) - // - // Note: the naming of functions is `AddChildNoWait` and `AddChild` (instead - // of `AddChild` and `AddChildWaitFor`) because: - // - it is the more common operation, - // - explicitness is helpful in the less common case (no waiting), and - // - usual "child" semantics imply parent Processes should wait for children. - AddChildNoWait(q Process) - - // AddChild is the equivalent of calling: - // parent.AddChildNoWait(q) - // parent.WaitFor(q) - AddChild(q Process) - - // Go creates a new process, adds it as a child, and spawns the ProcessFunc f - // in its own goroutine. It is equivalent to: - // - // GoChild(p, f) - // - // It is useful to construct simple asynchronous workers, children of p. - Go(f ProcessFunc) Process - - // Close ends the process. Close blocks until the process has completely - // shut down, and any teardown has run _exactly once_. The returned error - // is available indefinitely: calling Close twice returns the same error. - // If the process has already been closed, Close returns immediately. - Close() error - - // Closing is a signal to wait upon. The returned channel is closed - // _after_ Close has been called at least once, but teardown may or may - // not be done yet. The primary use case of Closing is for children who - // need to know when a parent is shutting down, and therefore also shut - // down. - Closing() <-chan struct{} - - // Closed is a signal to wait upon. The returned channel is closed - // _after_ Close has completed; teardown has finished. The primary use case - // of Closed is waiting for a Process to Close without _causing_ the Close. - Closed() <-chan struct{} -} -``` diff --git a/Godeps/_workspace/src/github.com/jbenet/goprocess/context/context.go b/Godeps/_workspace/src/github.com/jbenet/goprocess/context/context.go deleted file mode 100644 index 55f1be8ef06..00000000000 --- a/Godeps/_workspace/src/github.com/jbenet/goprocess/context/context.go +++ /dev/null @@ -1,110 +0,0 @@ -package goprocessctx - -import ( - goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" -) - -// WithContext constructs and returns a Process that respects -// given context. It is the equivalent of: -// -// func ProcessWithContext(ctx context.Context) goprocess.Process { -// p := goprocess.WithParent(goprocess.Background()) -// CloseAfterContext(p, ctx) -// return p -// } -// -func WithContext(ctx context.Context) goprocess.Process { - p := goprocess.WithParent(goprocess.Background()) - CloseAfterContext(p, ctx) - return p -} - -// WithContextAndTeardown is a helper function to set teardown at initiation -// of WithContext -func WithContextAndTeardown(ctx context.Context, tf goprocess.TeardownFunc) goprocess.Process { - p := goprocess.WithTeardown(tf) - CloseAfterContext(p, ctx) - return p -} - -// WaitForContext makes p WaitFor ctx. When Closing, p waits for -// ctx.Done(), before being Closed(). It is simply: -// -// p.WaitFor(goprocess.WithContext(ctx)) -// -func WaitForContext(ctx context.Context, p goprocess.Process) { - p.WaitFor(WithContext(ctx)) -} - -// CloseAfterContext schedules the process to close after the given -// context is done. It is the equivalent of: -// -// func CloseAfterContext(p goprocess.Process, ctx context.Context) { -// go func() { -// <-ctx.Done() -// p.Close() -// }() -// } -// -func CloseAfterContext(p goprocess.Process, ctx context.Context) { - if p == nil { - panic("nil Process") - } - if ctx == nil { - panic("nil Context") - } - - // context.Background(). if ctx.Done() is nil, it will never be done. - // we check for this to avoid wasting a goroutine forever. - if ctx.Done() == nil { - return - } - - go func() { - <-ctx.Done() - p.Close() - }() -} - -// WithProcessClosing returns a context.Context derived from ctx that -// is cancelled as p is Closing (after: <-p.Closing()). It is simply: -// -// func WithProcessClosing(ctx context.Context, p goprocess.Process) context.Context { -// ctx, cancel := context.WithCancel(ctx) -// go func() { -// <-p.Closing() -// cancel() -// }() -// return ctx -// } -// -func WithProcessClosing(ctx context.Context, p goprocess.Process) context.Context { - ctx, cancel := context.WithCancel(ctx) - go func() { - <-p.Closing() - cancel() - }() - return ctx -} - -// WithProcessClosed returns a context.Context that is cancelled -// after Process p is Closed. It is the equivalent of: -// -// func WithProcessClosed(ctx context.Context, p goprocess.Process) context.Context { -// ctx, cancel := context.WithCancel(ctx) -// go func() { -// <-p.Closed() -// cancel() -// }() -// return ctx -// } -// -func WithProcessClosed(ctx context.Context, p goprocess.Process) context.Context { - ctx, cancel := context.WithCancel(ctx) - go func() { - <-p.Closed() - cancel() - }() - return ctx -} diff --git a/Godeps/_workspace/src/github.com/jbenet/goprocess/context/derive.go b/Godeps/_workspace/src/github.com/jbenet/goprocess/context/derive.go deleted file mode 100644 index cdd31da2b54..00000000000 --- a/Godeps/_workspace/src/github.com/jbenet/goprocess/context/derive.go +++ /dev/null @@ -1,59 +0,0 @@ -package goprocessctx - -import ( - "errors" - "time" - - goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" -) - -const ( - closing = iota - closed -) - -type procContext struct { - done <-chan struct{} - which int -} - -// OnClosingContext derives a context from a given goprocess that will -// be 'Done' when the process is closing -func OnClosingContext(p goprocess.Process) context.Context { - return &procContext{ - done: p.Closing(), - which: closing, - } -} - -// OnClosedContext derives a context from a given goprocess that will -// be 'Done' when the process is closed -func OnClosedContext(p goprocess.Process) context.Context { - return &procContext{ - done: p.Closed(), - which: closed, - } -} - -func (c *procContext) Done() <-chan struct{} { - return c.done -} - -func (c *procContext) Deadline() (time.Time, bool) { - return time.Time{}, false -} - -func (c *procContext) Err() error { - if c.which == closing { - return errors.New("process closing") - } else if c.which == closed { - return errors.New("process closed") - } else { - panic("unrecognized process context type") - } -} - -func (c *procContext) Value(key interface{}) interface{} { - return nil -} diff --git a/Godeps/_workspace/src/github.com/jbenet/goprocess/example_test.go b/Godeps/_workspace/src/github.com/jbenet/goprocess/example_test.go deleted file mode 100644 index a9d7c152275..00000000000 --- a/Godeps/_workspace/src/github.com/jbenet/goprocess/example_test.go +++ /dev/null @@ -1,37 +0,0 @@ -package goprocess_test - -import ( - "fmt" - "time" - - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" -) - -func ExampleGo() { - p := goprocess.Go(func(p goprocess.Process) { - ticker := time.Tick(200 * time.Millisecond) - for { - select { - case <-ticker: - fmt.Println("tick") - case <-p.Closing(): - fmt.Println("closing") - return - } - } - }) - - <-time.After(1100 * time.Millisecond) - p.Close() - fmt.Println("closed") - <-time.After(100 * time.Millisecond) - - // Output: - // tick - // tick - // tick - // tick - // tick - // closing - // closed -} diff --git a/Godeps/_workspace/src/github.com/jbenet/goprocess/goprocess.go b/Godeps/_workspace/src/github.com/jbenet/goprocess/goprocess.go deleted file mode 100644 index a81ec8b9242..00000000000 --- a/Godeps/_workspace/src/github.com/jbenet/goprocess/goprocess.go +++ /dev/null @@ -1,283 +0,0 @@ -// Package goprocess introduces a Process abstraction that allows simple -// organization, and orchestration of work. It is much like a WaitGroup, -// and much like a context.Context, but also ensures safe **exactly-once**, -// and well-ordered teardown semantics. -package goprocess - -import ( - "os" - "os/signal" -) - -// Process is the basic unit of work in goprocess. It defines a computation -// with a lifecycle: -// - running (before calling Close), -// - closing (after calling Close at least once), -// - closed (after Close returns, and all teardown has _completed_). -// -// More specifically, it fits this: -// -// p := WithTeardown(tf) // new process is created, it is now running. -// p.AddChild(q) // can register children **before** Closed(). -// go p.Close() // blocks until done running teardown func. -// <-p.Closing() // would now return true. -// <-p.childrenDone() // wait on all children to be done -// p.teardown() // runs the user's teardown function tf. -// p.Close() // now returns, with error teardown returned. -// <-p.Closed() // would now return true. -// -// Processes can be arranged in a process "tree", where children are -// automatically Closed if their parents are closed. (Note, it is actually -// a Process DAG, children may have multiple parents). A process may also -// optionally wait for another to fully Close before beginning to Close. -// This makes it easy to ensure order of operations and proper sequential -// teardown of resurces. For example: -// -// p1 := goprocess.WithTeardown(func() error { -// fmt.Println("closing 1") -// }) -// p2 := goprocess.WithTeardown(func() error { -// fmt.Println("closing 2") -// }) -// p3 := goprocess.WithTeardown(func() error { -// fmt.Println("closing 3") -// }) -// -// p1.AddChild(p2) -// p2.AddChild(p3) -// -// -// go p1.Close() -// go p2.Close() -// go p3.Close() -// -// // Output: -// // closing 3 -// // closing 2 -// // closing 1 -// -// Process is modelled after the UNIX processes group idea, and heavily -// informed by sync.WaitGroup and go.net/context.Context. -// -// In the function documentation of this interface, `p` always refers to -// the self Process. -type Process interface { - - // WaitFor makes p wait for q before exiting. Thus, p will _always_ close - // _after_ q. Note well: a waiting cycle is deadlock. - // - // If q is already Closed, WaitFor calls p.Close() - // If p is already Closing or Closed, WaitFor panics. This is the same thing - // as calling Add(1) _after_ calling Done() on a wait group. Calling WaitFor - // on an already-closed process is a programming error likely due to bad - // synchronization - WaitFor(q Process) - - // AddChildNoWait registers child as a "child" of Process. As in UNIX, - // when parent is Closed, child is Closed -- child may Close beforehand. - // This is the equivalent of calling: - // - // go func(parent, child Process) { - // <-parent.Closing() - // child.Close() - // }(p, q) - // - // Note: the naming of functions is `AddChildNoWait` and `AddChild` (instead - // of `AddChild` and `AddChildWaitFor`) because: - // - it is the more common operation, - // - explicitness is helpful in the less common case (no waiting), and - // - usual "child" semantics imply parent Processes should wait for children. - AddChildNoWait(q Process) - - // AddChild is the equivalent of calling: - // parent.AddChildNoWait(q) - // parent.WaitFor(q) - AddChild(q Process) - - // Go is much like `go`, as it runs a function in a newly spawned goroutine. - // The neat part of Process.Go is that the Process object you call it on will: - // * construct a child Process, and call AddChild(child) on it - // * spawn a goroutine, and call the given function - // * Close the child when the function exits. - // This way, you can rest assured each goroutine you spawn has its very own - // Process context, and that it will be closed when the function exits. - // It is the function's responsibility to respect the Closing of its Process, - // namely it should exit (return) when <-Closing() is ready. It is basically: - // - // func (p Process) Go(f ProcessFunc) Process { - // child := WithParent(p) - // go func () { - // f(child) - // child.Close() - // }() - // } - // - // It is useful to construct simple asynchronous workers, children of p. - Go(f ProcessFunc) Process - - // SetTeardown sets the process's teardown to tf. - SetTeardown(tf TeardownFunc) - - // Close ends the process. Close blocks until the process has completely - // shut down, and any teardown has run _exactly once_. The returned error - // is available indefinitely: calling Close twice returns the same error. - // If the process has already been closed, Close returns immediately. - Close() error - - // CloseAfterChildren calls Close _after_ its children have Closed - // normally (i.e. it _does not_ attempt to close them). - CloseAfterChildren() error - - // Closing is a signal to wait upon. The returned channel is closed - // _after_ Close has been called at least once, but teardown may or may - // not be done yet. The primary use case of Closing is for children who - // need to know when a parent is shutting down, and therefore also shut - // down. - Closing() <-chan struct{} - - // Closed is a signal to wait upon. The returned channel is closed - // _after_ Close has completed; teardown has finished. The primary use case - // of Closed is waiting for a Process to Close without _causing_ the Close. - Closed() <-chan struct{} - - // Err waits until the process is closed, and then returns any error that - // occurred during shutdown. - Err() error -} - -// TeardownFunc is a function used to cleanup state at the end of the -// lifecycle of a Process. -type TeardownFunc func() error - -// ProcessFunc is a function that takes a process. Its main use case is goprocess.Go, -// which spawns a ProcessFunc in its own goroutine, and returns a corresponding -// Process object. -type ProcessFunc func(proc Process) - -var nilProcessFunc = func(Process) {} - -// Go is much like `go`: it runs a function in a newly spawned goroutine. The neat -// part of Go is that it provides Process object to communicate between the -// function and the outside world. Thus, callers can easily WaitFor, or Close the -// function. It is the function's responsibility to respect the Closing of its Process, -// namely it should exit (return) when <-Closing() is ready. It is simply: -// -// func Go(f ProcessFunc) Process { -// p := WithParent(Background()) -// p.Go(f) -// return p -// } -// -// Note that a naive implementation of Go like the following would not work: -// -// func Go(f ProcessFunc) Process { -// return Background().Go(f) -// } -// -// This is because having the process you -func Go(f ProcessFunc) Process { - // return GoChild(Background(), f) - - // we use two processes, one for communication, and - // one for ensuring we wait on the function (unclosable from the outside). - p := newProcess(nil) - waitFor := newProcess(nil) - p.WaitFor(waitFor) // prevent p from closing - go func() { - f(p) - waitFor.Close() // allow p to close. - p.Close() // ensure p closes. - }() - return p -} - -// GoChild is like Go, but it registers the returned Process as a child of parent, -// **before** spawning the goroutine, which ensures proper synchronization with parent. -// It is somewhat like -// -// func GoChild(parent Process, f ProcessFunc) Process { -// p := WithParent(parent) -// p.Go(f) -// return p -// } -// -// And it is similar to the classic WaitGroup use case: -// -// func WaitGroupGo(wg sync.WaitGroup, child func()) { -// wg.Add(1) -// go func() { -// child() -// wg.Done() -// }() -// } -// -func GoChild(parent Process, f ProcessFunc) Process { - p := WithParent(parent) - p.Go(f) - return p -} - -// Spawn is an alias of `Go`. In many contexts, Spawn is a -// well-known Process launching word, which fits our use case. -var Spawn = Go - -// SpawnChild is an alias of `GoChild`. In many contexts, Spawn is a -// well-known Process launching word, which fits our use case. -var SpawnChild = GoChild - -// WithTeardown constructs and returns a Process with a TeardownFunc. -// TeardownFunc tf will be called **exactly-once** when Process is -// Closing, after all Children have fully closed, and before p is Closed. -// In fact, Process p will not be Closed until tf runs and exits. -// See lifecycle in Process doc. -func WithTeardown(tf TeardownFunc) Process { - if tf == nil { - panic("nil tf TeardownFunc") - } - return newProcess(tf) -} - -// WithParent constructs and returns a Process with a given parent. -func WithParent(parent Process) Process { - if parent == nil { - panic("nil parent Process") - } - q := newProcess(nil) - parent.AddChild(q) - return q -} - -// WithSignals returns a Process that will Close() when any given signal fires. -// This is useful to bind Process trees to syscall.SIGTERM, SIGKILL, etc. -func WithSignals(sig ...os.Signal) Process { - p := WithParent(Background()) - c := make(chan os.Signal) - signal.Notify(c, sig...) - go func() { - <-c - signal.Stop(c) - p.Close() - }() - return p -} - -// Background returns the "background" Process: a statically allocated -// process that can _never_ close. It also never enters Closing() state. -// Calling Background().Close() will hang indefinitely. -func Background() Process { - return background -} - -// background is the background process -var background = &unclosable{Process: newProcess(nil)} - -// unclosable is a process that _cannot_ be closed. calling Close simply hangs. -type unclosable struct { - Process -} - -func (p *unclosable) Close() error { - var hang chan struct{} - <-hang // hang forever - return nil -} diff --git a/Godeps/_workspace/src/github.com/jbenet/goprocess/goprocess_test.go b/Godeps/_workspace/src/github.com/jbenet/goprocess/goprocess_test.go deleted file mode 100644 index 3a16de7e63f..00000000000 --- a/Godeps/_workspace/src/github.com/jbenet/goprocess/goprocess_test.go +++ /dev/null @@ -1,638 +0,0 @@ -package goprocess - -import ( - "fmt" - "runtime" - "syscall" - "testing" - "time" -) - -type tree struct { - Process - c []tree -} - -func setupHierarchy(p Process) tree { - t := func(n Process, ts ...tree) tree { - return tree{n, ts} - } - - a := WithParent(p) - b1 := WithParent(a) - b2 := WithParent(a) - c1 := WithParent(b1) - c2 := WithParent(b1) - c3 := WithParent(b2) - c4 := WithParent(b2) - - return t(a, t(b1, t(c1), t(c2)), t(b2, t(c3), t(c4))) -} - -func TestClosingClosed(t *testing.T) { - - bWait := make(chan struct{}) - a := WithParent(Background()) - a.Go(func(proc Process) { - <-bWait - }) - - Q := make(chan string, 3) - - go func() { - <-a.Closing() - Q <- "closing" - bWait <- struct{}{} - }() - - go func() { - <-a.Closed() - Q <- "closed" - }() - - go func() { - a.Close() - Q <- "closed" - }() - - if q := <-Q; q != "closing" { - t.Error("order incorrect. closing not first") - } - if q := <-Q; q != "closed" { - t.Error("order incorrect. closing not first") - } - if q := <-Q; q != "closed" { - t.Error("order incorrect. closing not first") - } -} - -func TestChildFunc(t *testing.T) { - a := WithParent(Background()) - - wait1 := make(chan struct{}) - wait2 := make(chan struct{}) - wait3 := make(chan struct{}) - wait4 := make(chan struct{}) - - a.Go(func(process Process) { - wait1 <- struct{}{} - <-wait2 - wait3 <- struct{}{} - }) - - go func() { - a.Close() - wait4 <- struct{}{} - }() - - <-wait1 - select { - case <-wait3: - t.Error("should not be closed yet") - case <-wait4: - t.Error("should not be closed yet") - case <-a.Closed(): - t.Error("should not be closed yet") - default: - } - - wait2 <- struct{}{} - - select { - case <-wait3: - case <-time.After(time.Second): - t.Error("should be closed now") - } - - select { - case <-wait4: - case <-time.After(time.Second): - t.Error("should be closed now") - } -} - -func TestTeardownCalledOnce(t *testing.T) { - a := setupHierarchy(Background()) - - onlyOnce := func() func() error { - count := 0 - return func() error { - count++ - if count > 1 { - t.Error("called", count, "times") - } - return nil - } - } - - a.SetTeardown(onlyOnce()) - a.c[0].SetTeardown(onlyOnce()) - a.c[0].c[0].SetTeardown(onlyOnce()) - a.c[0].c[1].SetTeardown(onlyOnce()) - a.c[1].SetTeardown(onlyOnce()) - a.c[1].c[0].SetTeardown(onlyOnce()) - a.c[1].c[1].SetTeardown(onlyOnce()) - - a.c[0].c[0].Close() - a.c[0].c[0].Close() - a.c[0].c[0].Close() - a.c[0].c[0].Close() - a.c[0].Close() - a.c[0].Close() - a.c[0].Close() - a.c[0].Close() - a.Close() - a.Close() - a.Close() - a.Close() - a.c[1].Close() - a.c[1].Close() - a.c[1].Close() - a.c[1].Close() -} - -func TestOnClosedAll(t *testing.T) { - - Q := make(chan string, 10) - p := WithParent(Background()) - a := setupHierarchy(p) - - go onClosedStr(Q, "0", a.c[0]) - go onClosedStr(Q, "10", a.c[1].c[0]) - go onClosedStr(Q, "", a) - go onClosedStr(Q, "00", a.c[0].c[0]) - go onClosedStr(Q, "1", a.c[1]) - go onClosedStr(Q, "01", a.c[0].c[1]) - go onClosedStr(Q, "11", a.c[1].c[1]) - - go p.Close() - - testStrs(t, Q, "00", "01", "10", "11", "0", "1", "") - testStrs(t, Q, "00", "01", "10", "11", "0", "1", "") - testStrs(t, Q, "00", "01", "10", "11", "0", "1", "") - testStrs(t, Q, "00", "01", "10", "11", "0", "1", "") - testStrs(t, Q, "00", "01", "10", "11", "0", "1", "") - testStrs(t, Q, "00", "01", "10", "11", "0", "1", "") -} - -func TestOnClosedLeaves(t *testing.T) { - - Q := make(chan string, 10) - p := WithParent(Background()) - a := setupHierarchy(p) - - go onClosedStr(Q, "0", a.c[0]) - go onClosedStr(Q, "10", a.c[1].c[0]) - go onClosedStr(Q, "", a) - go onClosedStr(Q, "00", a.c[0].c[0]) - go onClosedStr(Q, "1", a.c[1]) - go onClosedStr(Q, "01", a.c[0].c[1]) - go onClosedStr(Q, "11", a.c[1].c[1]) - - go a.c[0].Close() - testStrs(t, Q, "00", "01", "0") - testStrs(t, Q, "00", "01", "0") - testStrs(t, Q, "00", "01", "0") - - go a.c[1].Close() - testStrs(t, Q, "10", "11", "1") - testStrs(t, Q, "10", "11", "1") - testStrs(t, Q, "10", "11", "1") - - go p.Close() - testStrs(t, Q, "") -} - -func TestWaitFor(t *testing.T) { - - Q := make(chan string, 5) - a := WithParent(Background()) - b := WithParent(Background()) - c := WithParent(Background()) - d := WithParent(Background()) - e := WithParent(Background()) - - go onClosedStr(Q, "a", a) - go onClosedStr(Q, "b", b) - go onClosedStr(Q, "c", c) - go onClosedStr(Q, "d", d) - go onClosedStr(Q, "e", e) - - testNone(t, Q) - a.WaitFor(b) - a.WaitFor(c) - b.WaitFor(d) - e.WaitFor(d) - testNone(t, Q) - - go a.Close() // should do nothing. - testNone(t, Q) - - go e.Close() - testNone(t, Q) - - d.Close() - testStrs(t, Q, "d", "e") - testStrs(t, Q, "d", "e") - - c.Close() - testStrs(t, Q, "c") - - b.Close() - testStrs(t, Q, "a", "b") - testStrs(t, Q, "a", "b") -} - -func TestAddChildNoWait(t *testing.T) { - - Q := make(chan string, 5) - a := WithParent(Background()) - b := WithParent(Background()) - c := WithParent(Background()) - d := WithParent(Background()) - e := WithParent(Background()) - - go onClosedStr(Q, "a", a) - go onClosedStr(Q, "b", b) - go onClosedStr(Q, "c", c) - go onClosedStr(Q, "d", d) - go onClosedStr(Q, "e", e) - - testNone(t, Q) - a.AddChildNoWait(b) - a.AddChildNoWait(c) - b.AddChildNoWait(d) - e.AddChildNoWait(d) - testNone(t, Q) - - b.Close() - testStrs(t, Q, "b", "d") - testStrs(t, Q, "b", "d") - - a.Close() - testStrs(t, Q, "a", "c") - testStrs(t, Q, "a", "c") - - e.Close() - testStrs(t, Q, "e") -} - -func TestAddChild(t *testing.T) { - - a := WithParent(Background()) - b := WithParent(Background()) - c := WithParent(Background()) - d := WithParent(Background()) - e := WithParent(Background()) - Q := make(chan string, 5) - - go onClosedStr(Q, "a", a) - go onClosedStr(Q, "b", b) - go onClosedStr(Q, "c", c) - go onClosedStr(Q, "d", d) - go onClosedStr(Q, "e", e) - - testNone(t, Q) - a.AddChild(b) - a.AddChild(c) - b.AddChild(d) - e.AddChild(d) - testNone(t, Q) - - go b.Close() - d.Close() - testStrs(t, Q, "b", "d") - testStrs(t, Q, "b", "d") - - go a.Close() - c.Close() - testStrs(t, Q, "a", "c") - testStrs(t, Q, "a", "c") - - e.Close() - testStrs(t, Q, "e") -} - -func TestGoChildrenClose(t *testing.T) { - - var a, b, c, d, e Process - var ready = make(chan struct{}) - var bWait = make(chan struct{}) - var cWait = make(chan struct{}) - var dWait = make(chan struct{}) - var eWait = make(chan struct{}) - - a = WithParent(Background()) - a.Go(func(p Process) { - b = p - b.Go(func(p Process) { - c = p - ready <- struct{}{} - <-cWait - }) - ready <- struct{}{} - <-bWait - }) - a.Go(func(p Process) { - d = p - d.Go(func(p Process) { - e = p - ready <- struct{}{} - <-eWait - }) - ready <- struct{}{} - <-dWait - }) - - <-ready - <-ready - <-ready - <-ready - - Q := make(chan string, 5) - - go onClosedStr(Q, "a", a) - go onClosedStr(Q, "b", b) - go onClosedStr(Q, "c", c) - go onClosedStr(Q, "d", d) - go onClosedStr(Q, "e", e) - - testNone(t, Q) - go a.Close() - testNone(t, Q) - - bWait <- struct{}{} // relase b - go b.Close() - testNone(t, Q) - - cWait <- struct{}{} // relase c - <-c.Closed() - <-b.Closed() - testStrs(t, Q, "b", "c") - testStrs(t, Q, "b", "c") - - eWait <- struct{}{} // release e - <-e.Closed() - testStrs(t, Q, "e") - - dWait <- struct{}{} // releasse d - <-d.Closed() - <-a.Closed() - testStrs(t, Q, "a", "d") - testStrs(t, Q, "a", "d") -} - -func TestCloseAfterChildren(t *testing.T) { - - var a, b, c, d, e Process - - var ready = make(chan struct{}) - - a = WithParent(Background()) - a.Go(func(p Process) { - b = p - b.Go(func(p Process) { - c = p - ready <- struct{}{} - <-p.Closing() // wait till we're told to close (parents mustnt) - }) - ready <- struct{}{} - // <-p.Closing() // will CloseAfterChildren - }) - a.Go(func(p Process) { - d = p - d.Go(func(p Process) { - e = p - ready <- struct{}{} - <-p.Closing() // wait till we're told to close (parents mustnt) - }) - ready <- struct{}{} - <-p.Closing() - }) - - <-ready - <-ready - <-ready - <-ready - - Q := make(chan string, 5) - - go onClosedStr(Q, "a", a) - go onClosedStr(Q, "b", b) - go onClosedStr(Q, "c", c) - go onClosedStr(Q, "d", d) - go onClosedStr(Q, "e", e) - - aDone := make(chan struct{}) - bDone := make(chan struct{}) - - t.Log("test none when waiting on a") - testNone(t, Q) - go func() { - a.CloseAfterChildren() - aDone <- struct{}{} - }() - testNone(t, Q) - - t.Log("test none when waiting on b") - go func() { - b.CloseAfterChildren() - bDone <- struct{}{} - }() - testNone(t, Q) - - c.Close() - <-bDone - <-b.Closed() - testStrs(t, Q, "b", "c") - testStrs(t, Q, "b", "c") - - e.Close() - testStrs(t, Q, "e") - - d.Close() - <-aDone - <-a.Closed() - testStrs(t, Q, "a", "d") - testStrs(t, Q, "a", "d") -} - -func TestGoClosing(t *testing.T) { - - var ready = make(chan struct{}) - a := WithParent(Background()) - a.Go(func(p Process) { - - // this should be fine. - a.Go(func(p Process) { - ready <- struct{}{} - }) - - // set a to close. should not fully close until after this func returns. - go a.Close() - - // wait until a is marked as closing - <-a.Closing() - - // this should also be fine. - a.Go(func(p Process) { - - select { - case <-p.Closing(): - // p should be marked as closing - default: - t.Error("not marked closing when it should be.") - } - - ready <- struct{}{} - }) - - ready <- struct{}{} - }) - - <-ready - <-ready - <-ready -} - -func TestBackground(t *testing.T) { - // test it hangs indefinitely: - b := Background() - go b.Close() - - select { - case <-b.Closing(): - t.Error("b.Closing() closed :(") - default: - } -} - -func TestWithSignals(t *testing.T) { - p := WithSignals(syscall.SIGABRT) - testNotClosed(t, p) - - syscall.Kill(syscall.Getpid(), syscall.SIGABRT) - testClosed(t, p) -} - -func TestMemoryLeak(t *testing.T) { - iters := 100 - fanout := 10 - P := newProcess(nil) - var memories []float32 - - measure := func(str string) float32 { - s := new(runtime.MemStats) - runtime.ReadMemStats(s) - //fmt.Printf("%d ", s.HeapObjects) - //fmt.Printf("%d ", len(P.children)) - //fmt.Printf("%d ", runtime.NumGoroutine()) - //fmt.Printf("%s: %dk\n", str, s.HeapAlloc/1000) - return float32(s.HeapAlloc) / 1000 - } - - spawn := func() []Process { - var ps []Process - // Spawn processes - for i := 0; i < fanout; i++ { - p := WithParent(P) - ps = append(ps, p) - - for i := 0; i < fanout; i++ { - p2 := WithParent(p) - ps = append(ps, p2) - - for i := 0; i < fanout; i++ { - p3 := WithParent(p2) - ps = append(ps, p3) - } - } - } - return ps - } - - // Read initial memory stats - measure("initial") - for i := 0; i < iters; i++ { - ps := spawn() - //measure("alloc") // read after alloc - - // Close all processes - for _, p := range ps { - p.Close() - <-p.Closed() - } - ps = nil - - //measure("dealloc") // read after dealloc, but before gc - - // wait until all/most goroutines finish - <-time.After(time.Millisecond) - - // Run GC - runtime.GC() - memories = append(memories, measure("gc")) // read after gc - } - - memoryInit := memories[10] - percentGrowth := 100 * (memories[len(memories)-1] - memoryInit) / memoryInit - fmt.Printf("Memory growth after %d iteration with each %d processes: %.2f%% after %dk\n", iters, fanout*fanout*fanout, percentGrowth, int(memoryInit)) - -} - -func testClosing(t *testing.T, p Process) { - select { - case <-p.Closing(): - case <-time.After(50 * time.Millisecond): - t.Fatal("should be closing") - } -} - -func testNotClosing(t *testing.T, p Process) { - select { - case <-p.Closing(): - t.Fatal("should not be closing") - case <-p.Closed(): - t.Fatal("should not be closed") - default: - } -} - -func testClosed(t *testing.T, p Process) { - select { - case <-p.Closed(): - case <-time.After(50 * time.Millisecond): - t.Fatal("should be closed") - } -} - -func testNotClosed(t *testing.T, p Process) { - select { - case <-p.Closed(): - t.Fatal("should not be closed") - case <-time.After(50 * time.Millisecond): - } -} - -func testNone(t *testing.T, c <-chan string) { - select { - case out := <-c: - t.Fatal("none should be closed", out) - default: - } -} - -func testStrs(t *testing.T, Q <-chan string, ss ...string) { - s1 := <-Q - for _, s2 := range ss { - if s1 == s2 { - return - } - } - t.Error("context not in group:", s1, ss) -} - -func onClosedStr(Q chan<- string, s string, p Process) { - <-p.Closed() - Q <- s -} diff --git a/Godeps/_workspace/src/github.com/jbenet/goprocess/impl-mutex.go b/Godeps/_workspace/src/github.com/jbenet/goprocess/impl-mutex.go deleted file mode 100644 index fb86fcce273..00000000000 --- a/Godeps/_workspace/src/github.com/jbenet/goprocess/impl-mutex.go +++ /dev/null @@ -1,271 +0,0 @@ -package goprocess - -import ( - "sync" -) - -// process implements Process -type process struct { - children map[*processLink]struct{} // process to close with us - waitfors map[*processLink]struct{} // process to only wait for - waiters []*processLink // processes that wait for us. for gc. - - teardown TeardownFunc // called to run the teardown logic. - waiting chan struct{} // closed when CloseAfterChildrenClosed is called. - closing chan struct{} // closed once close starts. - closed chan struct{} // closed once close is done. - closeErr error // error to return to clients of Close() - - sync.Mutex -} - -// newProcess constructs and returns a Process. -// It will call tf TeardownFunc exactly once: -// **after** all children have fully Closed, -// **after** entering <-Closing(), and -// **before** <-Closed(). -func newProcess(tf TeardownFunc) *process { - return &process{ - teardown: tf, - closed: make(chan struct{}), - closing: make(chan struct{}), - waitfors: make(map[*processLink]struct{}), - children: make(map[*processLink]struct{}), - } -} - -func (p *process) WaitFor(q Process) { - if q == nil { - panic("waiting for nil process") - } - - p.Lock() - - select { - case <-p.Closed(): - panic("Process cannot wait after being closed") - default: - } - - pl := newProcessLink(p, q) - p.waitfors[pl] = struct{}{} - p.Unlock() - go pl.AddToChild() -} - -func (p *process) AddChildNoWait(child Process) { - if child == nil { - panic("adding nil child process") - } - - p.Lock() - - select { - case <-p.Closed(): - panic("Process cannot add children after being closed") - case <-p.Closing(): - go child.Close() - default: - } - - pl := newProcessLink(p, child) - p.children[pl] = struct{}{} - p.Unlock() - go pl.AddToChild() -} - -func (p *process) AddChild(child Process) { - if child == nil { - panic("adding nil child process") - } - - p.Lock() - - select { - case <-p.Closed(): - panic("Process cannot add children after being closed") - case <-p.Closing(): - go child.Close() - default: - } - - pl := newProcessLink(p, child) - if p.waitfors != nil { // if p.waitfors hasn't been set nil - p.waitfors[pl] = struct{}{} - } - if p.children != nil { // if p.children hasn't been set nil - p.children[pl] = struct{}{} - } - p.Unlock() - go pl.AddToChild() -} - -func (p *process) Go(f ProcessFunc) Process { - child := newProcess(nil) - waitFor := newProcess(nil) - child.WaitFor(waitFor) // prevent child from closing - - // add child last, to prevent a closing parent from - // closing all of them prematurely, before running the func. - p.AddChild(child) - go func() { - f(child) - waitFor.Close() // allow child to close. - child.CloseAfterChildren() // close to tear down. - }() - return child -} - -// SetTeardown to assign a teardown function -func (p *process) SetTeardown(tf TeardownFunc) { - if tf == nil { - panic("cannot set nil TeardownFunc") - } - - p.Lock() - if p.teardown != nil { - panic("cannot SetTeardown twice") - } - - p.teardown = tf - select { - case <-p.Closed(): - p.closeErr = tf() - default: - } - p.Unlock() -} - -// Close is the external close function. -// it's a wrapper around internalClose that waits on Closed() -func (p *process) Close() error { - p.Lock() - - // if already closing, or closed, get out. (but wait!) - select { - case <-p.Closing(): - p.Unlock() - <-p.Closed() - return p.closeErr - default: - } - - p.doClose() - p.Unlock() - return p.closeErr -} - -func (p *process) Closing() <-chan struct{} { - return p.closing -} - -func (p *process) Closed() <-chan struct{} { - return p.closed -} - -func (p *process) Err() error { - <-p.Closed() - return p.closeErr -} - -// the _actual_ close process. -func (p *process) doClose() { - // this function is only be called once (protected by p.Lock()). - // and it will panic (on closing channels) otherwise. - - close(p.closing) // signal that we're shutting down (Closing) - - for len(p.children) > 0 || len(p.waitfors) > 0 { - for plc, _ := range p.children { - child := plc.Child() - if child != nil { // check because child may already have been removed. - go child.Close() // force all children to shut down - } - plc.ParentClear() - } - p.children = nil // clear them. release memory. - - // we must be careful not to iterate over waitfors directly, as it may - // change under our feet. - wf := p.waitfors - p.waitfors = nil // clear them. release memory. - for w, _ := range wf { - // Here, we wait UNLOCKED, so that waitfors who are in the middle of - // adding a child to us can finish. we will immediately close the child. - p.Unlock() - <-w.ChildClosed() // wait till all waitfors are fully closed (before teardown) - p.Lock() - w.ParentClear() - } - } - - if p.teardown != nil { - p.closeErr = p.teardown() // actually run the close logic (ok safe to teardown) - } - close(p.closed) // signal that we're shut down (Closed) - - // go remove all the parents from the process links. optimization. - go func(waiters []*processLink) { - for _, pl := range waiters { - pl.ClearChild() - pr, ok := pl.Parent().(*process) - if !ok { - // parent has already been called to close - continue - } - pr.Lock() - delete(pr.waitfors, pl) - delete(pr.children, pl) - pr.Unlock() - } - }(p.waiters) // pass in so - p.waiters = nil // clear them. release memory. -} - -// We will only wait on the children we have now. -// We will not wait on children added subsequently. -// this may change in the future. -func (p *process) CloseAfterChildren() error { - p.Lock() - select { - case <-p.Closed(): - p.Unlock() - return p.Close() // get error. safe, after p.Closed() - case <-p.waiting: // already called it. - p.Unlock() - <-p.Closed() - return p.Close() // get error. safe, after p.Closed() - default: - } - p.Unlock() - - // here only from one goroutine. - - nextToWaitFor := func() Process { - p.Lock() - defer p.Unlock() - for e, _ := range p.waitfors { - c := e.Child() - if c == nil { - continue - } - - select { - case <-c.Closed(): - default: - return c - } - } - return nil - } - - // wait for all processes we're waiting for are closed. - // the semantics here are simple: we will _only_ close - // if there are no processes currently waiting for. - for next := nextToWaitFor(); next != nil; next = nextToWaitFor() { - <-next.Closed() - } - - // YAY! we're done. close - return p.Close() -} diff --git a/Godeps/_workspace/src/github.com/jbenet/goprocess/link.go b/Godeps/_workspace/src/github.com/jbenet/goprocess/link.go deleted file mode 100644 index c344c1e6136..00000000000 --- a/Godeps/_workspace/src/github.com/jbenet/goprocess/link.go +++ /dev/null @@ -1,121 +0,0 @@ -package goprocess - -import ( - "sync" -) - -// closedCh is an alread-closed channel. used to return -// in cases where we already know a channel is closed. -var closedCh chan struct{} - -func init() { - closedCh = make(chan struct{}) - close(closedCh) -} - -// a processLink is an internal bookkeeping datastructure. -// it's used to form a relationship between two processes. -// It is mostly for keeping memory usage down (letting -// children close and be garbage-collected). -type processLink struct { - // guards all fields. - // DO NOT HOLD while holding process locks. - // it may be slow, and could deadlock if not careful. - sync.Mutex - parent Process - child Process -} - -func newProcessLink(p, c Process) *processLink { - return &processLink{ - parent: p, - child: c, - } -} - -// Closing returns whether the child is closing -func (pl *processLink) ChildClosing() <-chan struct{} { - // grab a hold of it, and unlock, as .Closing may block. - pl.Lock() - child := pl.child - pl.Unlock() - - if child == nil { // already closed? memory optimization. - return closedCh - } - return child.Closing() -} - -func (pl *processLink) ChildClosed() <-chan struct{} { - // grab a hold of it, and unlock, as .Closed may block. - pl.Lock() - child := pl.child - pl.Unlock() - - if child == nil { // already closed? memory optimization. - return closedCh - } - return child.Closed() -} - -func (pl *processLink) ChildClose() { - // grab a hold of it, and unlock, as .Closed may block. - pl.Lock() - child := pl.child - pl.Unlock() - - if child != nil { // already closed? memory optimization. - child.Close() - } -} - -func (pl *processLink) ClearChild() { - pl.Lock() - pl.child = nil - pl.Unlock() -} - -func (pl *processLink) ParentClear() { - pl.Lock() - pl.parent = nil - pl.Unlock() -} - -func (pl *processLink) Child() Process { - pl.Lock() - defer pl.Unlock() - return pl.child -} - -func (pl *processLink) Parent() Process { - pl.Lock() - defer pl.Unlock() - return pl.parent -} - -func (pl *processLink) AddToChild() { - cp := pl.Child() - - // is it a *process ? if not... panic. - c, ok := cp.(*process) - if !ok { - panic("goprocess does not yet support other process impls.") - } - - // first, is it Closed? - c.Lock() - select { - case <-c.Closed(): - c.Unlock() - - // already closed. must not add. - // we must clear it, though. do so without the lock. - pl.ClearChild() - return - - default: - // put the process link into q's waiters - c.waiters = append(c.waiters, pl) - c.Unlock() - } -} diff --git a/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic/README.md b/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic/README.md deleted file mode 100644 index 7a2c55db1c6..00000000000 --- a/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# goprocess/periodic - periodic process creation - -- goprocess: https://github.com/jbenet/goprocess -- Godoc: https://godoc.org/github.com/jbenet/goprocess/periodic diff --git a/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic/examples_test.go b/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic/examples_test.go deleted file mode 100644 index 4d48f7526c7..00000000000 --- a/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic/examples_test.go +++ /dev/null @@ -1,85 +0,0 @@ -package periodicproc_test - -import ( - "fmt" - "time" - - goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - periodicproc "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic" -) - -func ExampleEvery() { - tock := make(chan struct{}) - - i := 0 - p := periodicproc.Every(time.Second, func(proc goprocess.Process) { - tock <- struct{}{} - fmt.Printf("hello %d\n", i) - i++ - }) - - <-tock - <-tock - <-tock - p.Close() - - // Output: - // hello 0 - // hello 1 - // hello 2 -} - -func ExampleTick() { - p := periodicproc.Tick(time.Second, func(proc goprocess.Process) { - fmt.Println("tick") - }) - - <-time.After(3*time.Second + 500*time.Millisecond) - p.Close() - - // Output: - // tick - // tick - // tick -} - -func ExampleTickGo() { - - // with TickGo, execution is not rate limited, - // there can be many in-flight simultaneously - - wait := make(chan struct{}) - p := periodicproc.TickGo(time.Second, func(proc goprocess.Process) { - fmt.Println("tick") - <-wait - }) - - <-time.After(3*time.Second + 500*time.Millisecond) - - wait <- struct{}{} - wait <- struct{}{} - wait <- struct{}{} - p.Close() // blocks us until all children are closed. - - // Output: - // tick - // tick - // tick -} - -func ExampleOnSignal() { - sig := make(chan struct{}) - p := periodicproc.OnSignal(sig, func(proc goprocess.Process) { - fmt.Println("fire!") - }) - - sig <- struct{}{} - sig <- struct{}{} - sig <- struct{}{} - p.Close() - - // Output: - // fire! - // fire! - // fire! -} diff --git a/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic/periodic.go b/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic/periodic.go deleted file mode 100644 index b4bd32b39d5..00000000000 --- a/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic/periodic.go +++ /dev/null @@ -1,232 +0,0 @@ -// Package periodic is part of github.com/jbenet/goprocess. -// It provides a simple periodic processor that calls a function -// periodically based on some options. -// -// For example: -// -// // use a time.Duration -// p := periodicproc.Every(time.Second, func(proc goprocess.Process) { -// fmt.Printf("the time is %s and all is well", time.Now()) -// }) -// -// <-time.After(5*time.Second) -// p.Close() -// -// // use a time.Time channel (like time.Ticker) -// p := periodicproc.Tick(time.Tick(time.Second), func(proc goprocess.Process) { -// fmt.Printf("the time is %s and all is well", time.Now()) -// }) -// -// <-time.After(5*time.Second) -// p.Close() -// -// // or arbitrary signals -// signal := make(chan struct{}) -// p := periodicproc.OnSignal(signal, func(proc goprocess.Process) { -// fmt.Printf("the time is %s and all is well", time.Now()) -// }) -// -// signal<- struct{}{} -// signal<- struct{}{} -// <-time.After(5 * time.Second) -// signal<- struct{}{} -// p.Close() -// -package periodicproc - -import ( - "time" - - gp "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" -) - -// Every calls the given ProcessFunc at periodic intervals. Internally, it uses -// <-time.After(interval), so it will have the behavior of waiting _at least_ -// interval in between calls. If you'd prefer the time.Ticker behavior, use -// periodicproc.Tick instead. -// This is sequentially rate limited, only one call will be in-flight at a time. -func Every(interval time.Duration, procfunc gp.ProcessFunc) gp.Process { - return gp.Go(func(proc gp.Process) { - for { - select { - case <-time.After(interval): - select { - case <-proc.Go(procfunc).Closed(): // spin it out as a child, and wait till it's done. - case <-proc.Closing(): // we're told to close - return - } - case <-proc.Closing(): // we're told to close - return - } - } - }) -} - -// EveryGo calls the given ProcessFunc at periodic intervals. Internally, it uses -// <-time.After(interval) -// This is not rate limited, multiple calls could be in-flight at the same time. -func EveryGo(interval time.Duration, procfunc gp.ProcessFunc) gp.Process { - return gp.Go(func(proc gp.Process) { - for { - select { - case <-time.After(interval): - proc.Go(procfunc) - case <-proc.Closing(): // we're told to close - return - } - } - }) -} - -// Tick constructs a ticker with interval, and calls the given ProcessFunc every -// time the ticker fires. -// This is sequentially rate limited, only one call will be in-flight at a time. -// -// p := periodicproc.Tick(time.Second, func(proc goprocess.Process) { -// fmt.Println("fire!") -// }) -// -// <-time.After(3 * time.Second) -// p.Close() -// -// // Output: -// // fire! -// // fire! -// // fire! -func Tick(interval time.Duration, procfunc gp.ProcessFunc) gp.Process { - return gp.Go(func(proc gp.Process) { - ticker := time.NewTicker(interval) - callOnTicker(ticker.C, procfunc)(proc) - ticker.Stop() - }) -} - -// TickGo constructs a ticker with interval, and calls the given ProcessFunc every -// time the ticker fires. -// This is not rate limited, multiple calls could be in-flight at the same time. -// -// p := periodicproc.TickGo(time.Second, func(proc goprocess.Process) { -// fmt.Println("fire!") -// <-time.After(10 * time.Second) // will not block sequential execution -// }) -// -// <-time.After(3 * time.Second) -// p.Close() -// -// // Output: -// // fire! -// // fire! -// // fire! -func TickGo(interval time.Duration, procfunc gp.ProcessFunc) gp.Process { - return gp.Go(func(proc gp.Process) { - ticker := time.NewTicker(interval) - goCallOnTicker(ticker.C, procfunc)(proc) - ticker.Stop() - }) -} - -// Ticker calls the given ProcessFunc every time the ticker fires. -// This is sequentially rate limited, only one call will be in-flight at a time. -func Ticker(ticker <-chan time.Time, procfunc gp.ProcessFunc) gp.Process { - return gp.Go(callOnTicker(ticker, procfunc)) -} - -// TickerGo calls the given ProcessFunc every time the ticker fires. -// This is not rate limited, multiple calls could be in-flight at the same time. -func TickerGo(ticker <-chan time.Time, procfunc gp.ProcessFunc) gp.Process { - return gp.Go(goCallOnTicker(ticker, procfunc)) -} - -func callOnTicker(ticker <-chan time.Time, pf gp.ProcessFunc) gp.ProcessFunc { - return func(proc gp.Process) { - for { - select { - case <-ticker: - select { - case <-proc.Go(pf).Closed(): // spin it out as a child, and wait till it's done. - case <-proc.Closing(): // we're told to close - return - } - case <-proc.Closing(): // we're told to close - return - } - } - } -} - -func goCallOnTicker(ticker <-chan time.Time, pf gp.ProcessFunc) gp.ProcessFunc { - return func(proc gp.Process) { - for { - select { - case <-ticker: - proc.Go(pf) - case <-proc.Closing(): // we're told to close - return - } - } - } -} - -// OnSignal calls the given ProcessFunc every time the signal fires, and waits for it to exit. -// This is sequentially rate limited, only one call will be in-flight at a time. -// -// sig := make(chan struct{}) -// p := periodicproc.OnSignal(sig, func(proc goprocess.Process) { -// fmt.Println("fire!") -// <-time.After(time.Second) // delays sequential execution by 1 second -// }) -// -// sig<- struct{} -// sig<- struct{} -// sig<- struct{} -// -// // Output: -// // fire! -// // fire! -// // fire! -func OnSignal(sig <-chan struct{}, procfunc gp.ProcessFunc) gp.Process { - return gp.Go(func(proc gp.Process) { - for { - select { - case <-sig: - select { - case <-proc.Go(procfunc).Closed(): // spin it out as a child, and wait till it's done. - case <-proc.Closing(): // we're told to close - return - } - case <-proc.Closing(): // we're told to close - return - } - } - }) -} - -// OnSignalGo calls the given ProcessFunc every time the signal fires. -// This is not rate limited, multiple calls could be in-flight at the same time. -// -// sig := make(chan struct{}) -// p := periodicproc.OnSignalGo(sig, func(proc goprocess.Process) { -// fmt.Println("fire!") -// <-time.After(time.Second) // wont block execution -// }) -// -// sig<- struct{} -// sig<- struct{} -// sig<- struct{} -// -// // Output: -// // fire! -// // fire! -// // fire! -func OnSignalGo(sig <-chan struct{}, procfunc gp.ProcessFunc) gp.Process { - return gp.Go(func(proc gp.Process) { - for { - select { - case <-sig: - proc.Go(procfunc) - case <-proc.Closing(): // we're told to close - return - } - } - }) -} diff --git a/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic/periodic_test.go b/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic/periodic_test.go deleted file mode 100644 index a008fffa5a4..00000000000 --- a/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic/periodic_test.go +++ /dev/null @@ -1,260 +0,0 @@ -package periodicproc - -import ( - "testing" - "time" - - gp "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - ci "gx/ipfs/QmZcUXuzsUSvxNj9pmU112V8L5kGUFMTYCdFcAbQ3Zj5cp/go-cienv" -) - -var ( - grace = time.Millisecond * 5 - interval = time.Millisecond * 10 - timeout = time.Second * 5 -) - -func init() { - if ci.IsRunning() { - grace = time.Millisecond * 500 - interval = time.Millisecond * 1000 - timeout = time.Second * 15 - } -} - -func between(min, diff, max time.Duration) bool { - return min <= diff && diff <= max -} - -func testBetween(t *testing.T, min, diff, max time.Duration) { - if !between(min, diff, max) { - t.Error("time diff incorrect:", min, diff, max) - } -} - -type intervalFunc func(times chan<- time.Time, wait <-chan struct{}) (proc gp.Process) - -func testSeq(t *testing.T, toTest intervalFunc) { - t.Parallel() - - last := time.Now() - times := make(chan time.Time, 10) - p := toTest(times, nil) - - for i := 0; i < 5; i++ { - next := <-times - testBetween(t, interval-grace, next.Sub(last), interval+grace) - last = next - } - - go p.Close() - select { - case <-p.Closed(): - case <-time.After(timeout): - t.Error("proc failed to close") - } -} - -func testSeqWait(t *testing.T, toTest intervalFunc) { - t.Parallel() - - last := time.Now() - times := make(chan time.Time, 10) - wait := make(chan struct{}) - p := toTest(times, wait) - - for i := 0; i < 5; i++ { - next := <-times - testBetween(t, interval-grace, next.Sub(last), interval+grace) - - <-time.After(interval * 2) // make it wait. - last = time.Now() // make it now (sequential) - wait <- struct{}{} // release it. - } - - go p.Close() - - select { - case <-p.Closed(): - case <-time.After(timeout): - t.Error("proc failed to close") - } -} - -func testSeqNoWait(t *testing.T, toTest intervalFunc) { - t.Parallel() - - last := time.Now() - times := make(chan time.Time, 10) - wait := make(chan struct{}) - p := toTest(times, wait) - - for i := 0; i < 5; i++ { - next := <-times - testBetween(t, 0, next.Sub(last), interval+grace) // min of 0 - - <-time.After(interval * 2) // make it wait. - last = time.Now() // make it now (sequential) - wait <- struct{}{} // release it. - } - - go p.Close() - -end: - select { - case wait <- struct{}{}: // drain any extras. - goto end - case <-p.Closed(): - case <-time.After(timeout): - t.Error("proc failed to close") - } -} - -func testParallel(t *testing.T, toTest intervalFunc) { - t.Parallel() - - last := time.Now() - times := make(chan time.Time, 10) - wait := make(chan struct{}) - p := toTest(times, wait) - - for i := 0; i < 5; i++ { - next := <-times - testBetween(t, interval-grace, next.Sub(last), interval+grace) - last = next - - <-time.After(interval * 2) // make it wait. - wait <- struct{}{} // release it. - } - - go p.Close() - -end: - select { - case wait <- struct{}{}: // drain any extras. - goto end - case <-p.Closed(): - case <-time.After(timeout): - t.Error("proc failed to close") - } -} - -func TestEverySeq(t *testing.T) { - testSeq(t, func(times chan<- time.Time, wait <-chan struct{}) (proc gp.Process) { - return Every(interval, func(proc gp.Process) { - times <- time.Now() - }) - }) -} - -func TestEverySeqWait(t *testing.T) { - testSeqWait(t, func(times chan<- time.Time, wait <-chan struct{}) (proc gp.Process) { - return Every(interval, func(proc gp.Process) { - times <- time.Now() - select { - case <-wait: - case <-proc.Closing(): - } - }) - }) -} - -func TestEveryGoSeq(t *testing.T) { - testSeq(t, func(times chan<- time.Time, wait <-chan struct{}) (proc gp.Process) { - return EveryGo(interval, func(proc gp.Process) { - times <- time.Now() - }) - }) -} - -func TestEveryGoSeqParallel(t *testing.T) { - testParallel(t, func(times chan<- time.Time, wait <-chan struct{}) (proc gp.Process) { - return EveryGo(interval, func(proc gp.Process) { - times <- time.Now() - select { - case <-wait: - case <-proc.Closing(): - } - }) - }) -} - -func TestTickSeq(t *testing.T) { - testSeq(t, func(times chan<- time.Time, wait <-chan struct{}) (proc gp.Process) { - return Tick(interval, func(proc gp.Process) { - times <- time.Now() - }) - }) -} - -func TestTickSeqNoWait(t *testing.T) { - testSeqNoWait(t, func(times chan<- time.Time, wait <-chan struct{}) (proc gp.Process) { - return Tick(interval, func(proc gp.Process) { - times <- time.Now() - select { - case <-wait: - case <-proc.Closing(): - } - }) - }) -} - -func TestTickGoSeq(t *testing.T) { - testSeq(t, func(times chan<- time.Time, wait <-chan struct{}) (proc gp.Process) { - return TickGo(interval, func(proc gp.Process) { - times <- time.Now() - }) - }) -} - -func TestTickGoSeqParallel(t *testing.T) { - testParallel(t, func(times chan<- time.Time, wait <-chan struct{}) (proc gp.Process) { - return TickGo(interval, func(proc gp.Process) { - times <- time.Now() - select { - case <-wait: - case <-proc.Closing(): - } - }) - }) -} - -func TestTickerSeq(t *testing.T) { - testSeq(t, func(times chan<- time.Time, wait <-chan struct{}) (proc gp.Process) { - return Ticker(time.Tick(interval), func(proc gp.Process) { - times <- time.Now() - }) - }) -} - -func TestTickerSeqNoWait(t *testing.T) { - testSeqNoWait(t, func(times chan<- time.Time, wait <-chan struct{}) (proc gp.Process) { - return Ticker(time.Tick(interval), func(proc gp.Process) { - times <- time.Now() - select { - case <-wait: - case <-proc.Closing(): - } - }) - }) -} - -func TestTickerGoSeq(t *testing.T) { - testSeq(t, func(times chan<- time.Time, wait <-chan struct{}) (proc gp.Process) { - return TickerGo(time.Tick(interval), func(proc gp.Process) { - times <- time.Now() - }) - }) -} - -func TestTickerGoParallel(t *testing.T) { - testParallel(t, func(times chan<- time.Time, wait <-chan struct{}) (proc gp.Process) { - return TickerGo(time.Tick(interval), func(proc gp.Process) { - times <- time.Now() - select { - case <-wait: - case <-proc.Closing(): - } - }) - }) -} diff --git a/Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit/README.md b/Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit/README.md deleted file mode 100644 index 3c91185e4eb..00000000000 --- a/Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# goprocess/ratelimit - ratelimit children creation - -- goprocess: https://github.com/jbenet/goprocess -- Godoc: https://godoc.org/github.com/jbenet/goprocess/ratelimit diff --git a/Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit/ratelimit.go b/Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit/ratelimit.go deleted file mode 100644 index 87a052189ac..00000000000 --- a/Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit/ratelimit.go +++ /dev/null @@ -1,68 +0,0 @@ -// Package ratelimit is part of github.com/jbenet/goprocess. -// It provides a simple process that ratelimits child creation. -// This is done internally with a channel/semaphore. -// So the call `RateLimiter.LimitedGo` may block until another -// child is Closed(). -package ratelimit - -import ( - process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" -) - -// RateLimiter limits the spawning of children. It does so -// with an internal semaphore. Note that Go will continue -// to be the unlimited process.Process.Go, and ONLY the -// added function `RateLimiter.LimitedGo` will honor the -// limit. This is to improve readability and avoid confusion -// for the reader, particularly if code changes over time. -type RateLimiter struct { - process.Process - - limiter chan struct{} -} - -func NewRateLimiter(parent process.Process, limit int) *RateLimiter { - proc := process.WithParent(parent) - return &RateLimiter{Process: proc, limiter: LimitChan(limit)} -} - -// LimitedGo creates a new process, adds it as a child, and spawns the -// ProcessFunc f in its own goroutine, but may block according to the -// internal rate limit. It is equivalent to: -// -// func(f process.ProcessFunc) { -// <-limitch -// p.Go(func (child process.Process) { -// f(child) -// f.Close() // make sure its children close too! -// limitch<- struct{}{} -// }) -/// } -// -// It is useful to construct simple asynchronous workers, children of p, -// and rate limit their creation, to avoid spinning up too many, too fast. -// This is great for providing backpressure to producers. -func (rl *RateLimiter) LimitedGo(f process.ProcessFunc) { - - <-rl.limiter - p := rl.Go(f) - - // this <-closed() is here because the child may have spawned - // children of its own, and our rate limiter should capture that. - go func() { - <-p.Closed() - rl.limiter <- struct{}{} - }() -} - -// LimitChan returns a rate-limiting channel. it is the usual, simple, -// golang-idiomatic rate-limiting semaphore. This function merely -// initializes it with certain buffer size, and sends that many values, -// so it is ready to be used. -func LimitChan(limit int) chan struct{} { - limitch := make(chan struct{}, limit) - for i := 0; i < limit; i++ { - limitch <- struct{}{} - } - return limitch -} diff --git a/Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit/ratelimit_test.go b/Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit/ratelimit_test.go deleted file mode 100644 index a3d46d3e91b..00000000000 --- a/Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit/ratelimit_test.go +++ /dev/null @@ -1,98 +0,0 @@ -package ratelimit - -import ( - "testing" - "time" - - process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" -) - -func TestRateLimitLimitedGoBlocks(t *testing.T) { - numChildren := 6 - - t.Logf("create a rate limiter with limit of %d", numChildren/2) - rl := NewRateLimiter(process.Background(), numChildren/2) - - doneSpawning := make(chan struct{}) - childClosing := make(chan struct{}) - - t.Log("spawn 6 children with LimitedGo.") - go func() { - for i := 0; i < numChildren; i++ { - rl.LimitedGo(func(child process.Process) { - // hang until we drain childClosing - childClosing <- struct{}{} - }) - t.Logf("spawned %d", i) - } - close(doneSpawning) - }() - - t.Log("should have blocked.") - select { - case <-doneSpawning: - t.Error("did not block") - case <-time.After(time.Millisecond): // for scheduler - t.Log("blocked") - } - - t.Logf("drain %d children so they close", numChildren/2) - for i := 0; i < numChildren/2; i++ { - t.Logf("closing %d", i) - <-childClosing // consume child cloing - t.Logf("closed %d", i) - } - - t.Log("should be done spawning.") - select { - case <-doneSpawning: - case <-time.After(100 * time.Millisecond): // for scheduler - t.Error("still blocked...") - } - - t.Logf("drain %d children so they close", numChildren/2) - for i := 0; i < numChildren/2; i++ { - <-childClosing - t.Logf("closed %d", i) - } - - rl.Close() // ensure everyone's closed. -} - -func TestRateLimitGoDoesntBlock(t *testing.T) { - numChildren := 6 - - t.Logf("create a rate limiter with limit of %d", numChildren/2) - rl := NewRateLimiter(process.Background(), numChildren/2) - - doneSpawning := make(chan struct{}) - childClosing := make(chan struct{}) - - t.Log("spawn 6 children with usual Process.Go.") - go func() { - for i := 0; i < numChildren; i++ { - rl.Go(func(child process.Process) { - // hang until we drain childClosing - childClosing <- struct{}{} - }) - t.Logf("spawned %d", i) - } - close(doneSpawning) - }() - - t.Log("should not have blocked.") - select { - case <-doneSpawning: - t.Log("did not block") - case <-time.After(100 * time.Millisecond): // for scheduler - t.Error("process.Go blocked. it should not.") - } - - t.Log("drain children so they close") - for i := 0; i < numChildren; i++ { - <-childClosing - t.Logf("closed %d", i) - } - - rl.Close() // ensure everyone's closed. -} diff --git a/cmd/ipfswatch/main.go b/cmd/ipfswatch/main.go index 3c03c6b0fad..aa6210adce9 100644 --- a/cmd/ipfswatch/main.go +++ b/cmd/ipfswatch/main.go @@ -7,7 +7,6 @@ import ( "os/signal" "path/filepath" - process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" homedir "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/mitchellh/go-homedir" fsnotify "github.com/ipfs/go-ipfs/Godeps/_workspace/src/gopkg.in/fsnotify.v1" commands "github.com/ipfs/go-ipfs/commands" @@ -16,6 +15,7 @@ import ( coreunix "github.com/ipfs/go-ipfs/core/coreunix" config "github.com/ipfs/go-ipfs/repo/config" fsrepo "github.com/ipfs/go-ipfs/repo/fsrepo" + process "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/core/bootstrap.go b/core/bootstrap.go index ff757730021..46c8451faa4 100644 --- a/core/bootstrap.go +++ b/core/bootstrap.go @@ -15,9 +15,9 @@ import ( inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" - goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - procctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" - periodicproc "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic" + goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" + procctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" + periodicproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/periodic" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/core/builder.go b/core/builder.go index cd1c0f77c42..107eeffd29f 100644 --- a/core/builder.go +++ b/core/builder.go @@ -7,7 +7,6 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dsync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" - goprocessctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" bstore "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" bserv "github.com/ipfs/go-ipfs/blockservice" @@ -17,6 +16,7 @@ import ( pin "github.com/ipfs/go-ipfs/pin" repo "github.com/ipfs/go-ipfs/repo" cfg "github.com/ipfs/go-ipfs/repo/config" + goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/core/core.go b/core/core.go index 761a17389c2..1563511f768 100644 --- a/core/core.go +++ b/core/core.go @@ -18,9 +18,9 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" b58 "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" - goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" mamask "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/whyrusleeping/multiaddr-filter" diag "github.com/ipfs/go-ipfs/diagnostics" + goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" ic "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" discovery "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/discovery" diff --git a/core/corehttp/corehttp.go b/core/corehttp/corehttp.go index ed14165ced8..8efe554e664 100644 --- a/core/corehttp/corehttp.go +++ b/core/corehttp/corehttp.go @@ -10,8 +10,8 @@ import ( "net/http" "time" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" core "github.com/ipfs/go-ipfs/core" + "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" manet "gx/ipfs/QmYtzQmUwPFGxjCXctJ8e6GXS8sYfoXy2pdeMbS5SFWqRi/go-multiaddr-net" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" diff --git a/exchange/bitswap/bitswap.go b/exchange/bitswap/bitswap.go index 17f4f36862f..3d3add327f7 100644 --- a/exchange/bitswap/bitswap.go +++ b/exchange/bitswap/bitswap.go @@ -8,8 +8,6 @@ import ( "sync" "time" - process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - procctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" blocks "github.com/ipfs/go-ipfs/blocks" blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" @@ -20,6 +18,8 @@ import ( notifications "github.com/ipfs/go-ipfs/exchange/bitswap/notifications" wantlist "github.com/ipfs/go-ipfs/exchange/bitswap/wantlist" "github.com/ipfs/go-ipfs/thirdparty/delay" + process "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" + procctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" diff --git a/exchange/bitswap/workers.go b/exchange/bitswap/workers.go index b9dc963bedd..46f5693f4cd 100644 --- a/exchange/bitswap/workers.go +++ b/exchange/bitswap/workers.go @@ -3,8 +3,8 @@ package bitswap import ( "time" - process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - procctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" + process "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" + procctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/fuse/mount/fuse.go b/fuse/mount/fuse.go index 0351b7f167f..a09ec8b6512 100644 --- a/fuse/mount/fuse.go +++ b/fuse/mount/fuse.go @@ -11,7 +11,8 @@ import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/bazil.org/fuse" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/bazil.org/fuse/fs" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" + + goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" ) var ErrNotMounted = errors.New("not mounted") diff --git a/fuse/mount/mount.go b/fuse/mount/mount.go index cb7d25ffa43..2ad174d7744 100644 --- a/fuse/mount/mount.go +++ b/fuse/mount/mount.go @@ -8,8 +8,7 @@ import ( "runtime" "time" - goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - + goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 37d4d19e23c..4c4ca9386cb 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -15,8 +15,8 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - gpctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" + goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" + gpctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index a56111874eb..31195892a6a 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" + goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" "github.com/ipfs/go-ipfs/core" diff --git a/package.json b/package.json index 0af394021b3..6cfb1505841 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,11 @@ "name": "go-net", "hash": "QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt", "version": "0.0.0" + }, + { + "name": "goprocess", + "hash": "QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn", + "version": "0.0.0" } ], "language": "go", diff --git a/routing/dht/dht.go b/routing/dht/dht.go index eadd5b4be39..ddab5044f3d 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -22,8 +22,8 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - goprocessctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" + goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" + goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 3865bca13a0..b059c11d670 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -12,8 +12,8 @@ import ( u "github.com/ipfs/go-ipfs/util" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" - goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - periodicproc "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic" + goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" + periodicproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/periodic" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/providers.go b/routing/dht/providers.go index c0c16c54e09..2f0a8e64dfc 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -3,9 +3,9 @@ package dht import ( "time" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - goprocessctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" key "github.com/ipfs/go-ipfs/blocks/key" + goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" + goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/routing/dht/query.go b/routing/dht/query.go index 53e75fecbce..e7dc7a8e1be 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -13,8 +13,8 @@ import ( queue "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer/queue" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" - process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - ctxproc "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" + process "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" + ctxproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/thirdparty/notifier/notifier.go b/thirdparty/notifier/notifier.go index 5d5a830b095..c9e9475b32e 100644 --- a/thirdparty/notifier/notifier.go +++ b/thirdparty/notifier/notifier.go @@ -6,8 +6,8 @@ package notifier import ( "sync" - process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - ratelimit "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit" + process "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" + ratelimit "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/ratelimit" ) // Notifiee is a generic interface. Clients implement From bf7dd2bd2bec2f84d3f2eea71d0b17eee33632e8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 8 Feb 2016 23:10:19 -0800 Subject: [PATCH 3/5] remove randbo from godeps License: MIT Signed-off-by: Jeromy --- .../src/github.com/dustin/randbo/.gitignore | 2 - .../github.com/dustin/randbo/README.markdown | 11 ----- .../src/github.com/dustin/randbo/randbo.go | 40 ------------------ .../src/github.com/dustin/randbo/randbo.png | Bin 247626 -> 0 bytes .../github.com/dustin/randbo/randbo_test.go | 37 ---------------- mfs/mfs_test.go | 2 +- package.json | 5 +++ 7 files changed, 6 insertions(+), 91 deletions(-) delete mode 100644 Godeps/_workspace/src/github.com/dustin/randbo/.gitignore delete mode 100644 Godeps/_workspace/src/github.com/dustin/randbo/README.markdown delete mode 100644 Godeps/_workspace/src/github.com/dustin/randbo/randbo.go delete mode 100644 Godeps/_workspace/src/github.com/dustin/randbo/randbo.png delete mode 100644 Godeps/_workspace/src/github.com/dustin/randbo/randbo_test.go diff --git a/Godeps/_workspace/src/github.com/dustin/randbo/.gitignore b/Godeps/_workspace/src/github.com/dustin/randbo/.gitignore deleted file mode 100644 index 9f8072e9840..00000000000 --- a/Godeps/_workspace/src/github.com/dustin/randbo/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ - -*~ diff --git a/Godeps/_workspace/src/github.com/dustin/randbo/README.markdown b/Godeps/_workspace/src/github.com/dustin/randbo/README.markdown deleted file mode 100644 index 7f2ae4f03bd..00000000000 --- a/Godeps/_workspace/src/github.com/dustin/randbo/README.markdown +++ /dev/null @@ -1,11 +0,0 @@ -A fast random number `io.Reader` implementation. - -![randbo](https://raw.github.com/dustin/randbo/master/randbo.png) - -> IN A WORLD where no integer sequence is certain ... -> -> ONE MAN must become statistically indistinguishable from noise -> -> THIS SUMMER, entropy has a new name: RANDBO - -(thanks @snej) diff --git a/Godeps/_workspace/src/github.com/dustin/randbo/randbo.go b/Godeps/_workspace/src/github.com/dustin/randbo/randbo.go deleted file mode 100644 index 8159c53ba30..00000000000 --- a/Godeps/_workspace/src/github.com/dustin/randbo/randbo.go +++ /dev/null @@ -1,40 +0,0 @@ -package randbo - -import ( - "io" - "math/rand" - "time" -) - -// Randbo creates a stream of non-crypto quality random bytes -type randbo struct { - rand.Source -} - -// New creates a new random reader with a time source. -func New() io.Reader { - return NewFrom(rand.NewSource(time.Now().UnixNano())) -} - -// NewFrom creates a new reader from your own rand.Source -func NewFrom(src rand.Source) io.Reader { - return &randbo{src} -} - -// Read satisfies io.Reader -func (r *randbo) Read(p []byte) (n int, err error) { - todo := len(p) - offset := 0 - for { - val := int64(r.Int63()) - for i := 0; i < 8; i++ { - p[offset] = byte(val) - todo-- - if todo == 0 { - return len(p), nil - } - offset++ - val >>= 8 - } - } -} diff --git a/Godeps/_workspace/src/github.com/dustin/randbo/randbo.png b/Godeps/_workspace/src/github.com/dustin/randbo/randbo.png deleted file mode 100644 index c58f3dda9f9a5814baaad43dd7bbd59167e5a6bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247626 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 z
~Jr3)aZgcU^+}VQ9$!?wV(+%Qjy~yX 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˧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∈M&|B%iqC~o6@FZ3OvUP#&h%a^bYVX_ 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 Date: Tue, 9 Feb 2016 10:07:20 -0800 Subject: [PATCH 4/5] remove gogo-protobuf from godeps, use gx vendored License: MIT Signed-off-by: Jeromy --- .../src/github.com/gogo/protobuf/io/full.go | 96 - .../src/github.com/gogo/protobuf/io/io.go | 57 - .../github.com/gogo/protobuf/io/io_test.go | 221 -- .../src/github.com/gogo/protobuf/io/uint32.go | 120 - .../src/github.com/gogo/protobuf/io/varint.go | 128 - .../github.com/gogo/protobuf/proto/Makefile | 40 - .../gogo/protobuf/proto/all_test.go | 1979 -------------- .../github.com/gogo/protobuf/proto/clone.go | 179 -- .../gogo/protobuf/proto/clone_test.go | 201 -- .../github.com/gogo/protobuf/proto/decode.go | 726 ----- .../gogo/protobuf/proto/decode_gogo.go | 220 -- .../github.com/gogo/protobuf/proto/encode.go | 1054 -------- .../gogo/protobuf/proto/encode_gogo.go | 383 --- .../github.com/gogo/protobuf/proto/equal.go | 241 -- .../gogo/protobuf/proto/equal_test.go | 166 -- .../gogo/protobuf/proto/extensions.go | 472 ---- .../gogo/protobuf/proto/extensions_gogo.go | 221 -- .../gogo/protobuf/proto/extensions_test.go | 94 - .../src/github.com/gogo/protobuf/proto/lib.go | 740 ------ .../gogo/protobuf/proto/lib_gogo.go | 40 - .../gogo/protobuf/proto/message_set.go | 287 -- .../gogo/protobuf/proto/message_set_test.go | 66 - .../gogo/protobuf/proto/pointer_reflect.go | 384 --- .../gogo/protobuf/proto/pointer_unsafe.go | 218 -- .../protobuf/proto/pointer_unsafe_gogo.go | 166 -- .../gogo/protobuf/proto/properties.go | 683 ----- .../gogo/protobuf/proto/properties_gogo.go | 111 - .../gogo/protobuf/proto/size2_test.go | 63 - .../gogo/protobuf/proto/size_test.go | 120 - .../gogo/protobuf/proto/skip_gogo.go | 117 - .../gogo/protobuf/proto/testdata/Makefile | 47 - .../protobuf/proto/testdata/golden_test.go | 86 - .../gogo/protobuf/proto/testdata/test.pb.go | 2356 ----------------- .../protobuf/proto/testdata/test.pb.go.golden | 1737 ------------ .../gogo/protobuf/proto/testdata/test.proto | 428 --- .../github.com/gogo/protobuf/proto/text.go | 730 ----- .../gogo/protobuf/proto/text_gogo.go | 55 - .../gogo/protobuf/proto/text_parser.go | 730 ----- .../gogo/protobuf/proto/text_parser_test.go | 468 ---- .../gogo/protobuf/proto/text_test.go | 407 --- diagnostics/diag.go | 4 +- diagnostics/pb/diagnostics.pb.go | 2 +- exchange/bitswap/message/message.go | 4 +- exchange/bitswap/message/message_test.go | 2 +- exchange/bitswap/message/pb/message.pb.go | 2 +- fuse/readonly/readonly_unix.go | 2 +- merkledag/pb/merkledag.pb.go | 4 +- merkledag/pb/merkledagpb_test.go | 2 +- namesys/ipns_select_test.go | 2 +- namesys/pb/namesys.pb.go | 2 +- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/routing.go | 2 +- package.json | 5 + pin/internal/pb/header.pb.go | 2 +- pin/set.go | 2 +- routing/dht/dht.go | 2 +- routing/dht/dht_net.go | 2 +- routing/dht/ext_test.go | 2 +- routing/dht/handlers.go | 2 +- routing/dht/pb/dht.pb.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/offline/offline.go | 2 +- routing/record/record.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- unixfs/archive/tar/writer.go | 2 +- unixfs/format.go | 2 +- unixfs/format_test.go | 2 +- unixfs/io/dagreader.go | 2 +- unixfs/mod/dagmodifier.go | 2 +- unixfs/pb/unixfs.pb.go | 2 +- 74 files changed, 41 insertions(+), 16673 deletions(-) delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/io/full.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/io/io.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/io/io_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/io/uint32.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/io/varint.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/Makefile delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/all_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/clone.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/clone_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/decode.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/decode_gogo.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/encode.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/encode_gogo.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/equal.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/equal_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/extensions.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/extensions_gogo.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/extensions_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/lib.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/lib_gogo.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/message_set.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/message_set_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/pointer_reflect.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/pointer_unsafe.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/properties.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/properties_gogo.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/size2_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/size_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/skip_gogo.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/Makefile delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/golden_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.pb.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.pb.go.golden delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.proto delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/text.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_gogo.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_parser.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_parser_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_test.go diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/io/full.go b/Godeps/_workspace/src/github.com/gogo/protobuf/io/full.go deleted file mode 100644 index a2a32e11e89..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/io/full.go +++ /dev/null @@ -1,96 +0,0 @@ -// Extensions for Protocol Buffers to create more go like structures. -// -// Copyright (c) 2013, Vastech SA (PTY) LTD. All rights reserved. -// http://github.com/gogo/protobuf/gogoproto -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package io - -import ( - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" - "io" -) - -func NewFullWriter(w io.Writer) WriteCloser { - return &fullWriter{w, nil} -} - -type fullWriter struct { - w io.Writer - buffer []byte -} - -func (this *fullWriter) WriteMsg(msg proto.Message) (err error) { - var data []byte - if m, ok := msg.(marshaler); ok { - n := m.Size() - if n >= len(this.buffer) { - this.buffer = make([]byte, n) - } - _, err = m.MarshalTo(this.buffer) - if err != nil { - return err - } - data = this.buffer[:n] - } else { - data, err = proto.Marshal(msg) - if err != nil { - return err - } - } - _, err = this.w.Write(data) - return err -} - -func (this *fullWriter) Close() error { - if closer, ok := this.w.(io.Closer); ok { - return closer.Close() - } - return nil -} - -type fullReader struct { - r io.Reader - buf []byte -} - -func NewFullReader(r io.Reader, maxSize int) ReadCloser { - return &fullReader{r, make([]byte, maxSize)} -} - -func (this *fullReader) ReadMsg(msg proto.Message) error { - length, err := this.r.Read(this.buf) - if err != nil { - return err - } - return proto.Unmarshal(this.buf[:length], msg) -} - -func (this *fullReader) Close() error { - if closer, ok := this.r.(io.Closer); ok { - return closer.Close() - } - return nil -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/io/io.go b/Godeps/_workspace/src/github.com/gogo/protobuf/io/io.go deleted file mode 100644 index 9304d4f609a..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/io/io.go +++ /dev/null @@ -1,57 +0,0 @@ -// Extensions for Protocol Buffers to create more go like structures. -// -// Copyright (c) 2013, Vastech SA (PTY) LTD. All rights reserved. -// http://github.com/gogo/protobuf/gogoproto -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package io - -import ( - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" - "io" -) - -type Writer interface { - WriteMsg(proto.Message) error -} - -type WriteCloser interface { - Writer - io.Closer -} - -type Reader interface { - ReadMsg(msg proto.Message) error -} - -type ReadCloser interface { - Reader - io.Closer -} - -type marshaler interface { - MarshalTo(data []byte) (n int, err error) - Size() (n int) -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/io/io_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/io/io_test.go deleted file mode 100644 index 08ed47c11f1..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/io/io_test.go +++ /dev/null @@ -1,221 +0,0 @@ -// Extensions for Protocol Buffers to create more go like structures. -// -// Copyright (c) 2013, Vastech SA (PTY) LTD. All rights reserved. -// http://github.com/gogo/protobuf/gogoproto -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package io_test - -import ( - "bytes" - "encoding/binary" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" - "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/test" - goio "io" - "math/rand" - "testing" - "time" -) - -func iotest(writer io.WriteCloser, reader io.ReadCloser) error { - size := 1000 - msgs := make([]*test.NinOptNative, size) - r := rand.New(rand.NewSource(time.Now().UnixNano())) - for i := range msgs { - msgs[i] = test.NewPopulatedNinOptNative(r, true) - //issue 31 - if i == 5 { - msgs[i] = &test.NinOptNative{} - } - //issue 31 - if i == 999 { - msgs[i] = &test.NinOptNative{} - } - err := writer.WriteMsg(msgs[i]) - if err != nil { - return err - } - } - if err := writer.Close(); err != nil { - return err - } - i := 0 - for { - msg := &test.NinOptNative{} - if err := reader.ReadMsg(msg); err != nil { - if err == goio.EOF { - break - } - return err - } - if err := msg.VerboseEqual(msgs[i]); err != nil { - return err - } - i++ - } - if i != size { - panic("not enough messages read") - } - if err := reader.Close(); err != nil { - return err - } - return nil -} - -type buffer struct { - *bytes.Buffer - closed bool -} - -func (this *buffer) Close() error { - this.closed = true - return nil -} - -func newBuffer() *buffer { - return &buffer{bytes.NewBuffer(nil), false} -} - -func TestBigUint32Normal(t *testing.T) { - buf := newBuffer() - writer := io.NewUint32DelimitedWriter(buf, binary.BigEndian) - reader := io.NewUint32DelimitedReader(buf, binary.BigEndian, 1024*1024) - if err := iotest(writer, reader); err != nil { - t.Error(err) - } - if !buf.closed { - t.Fatalf("did not close buffer") - } -} - -func TestBigUint32MaxSize(t *testing.T) { - buf := newBuffer() - writer := io.NewUint32DelimitedWriter(buf, binary.BigEndian) - reader := io.NewUint32DelimitedReader(buf, binary.BigEndian, 20) - if err := iotest(writer, reader); err != goio.ErrShortBuffer { - t.Error(err) - } else { - t.Logf("%s", err) - } -} - -func TestLittleUint32Normal(t *testing.T) { - buf := newBuffer() - writer := io.NewUint32DelimitedWriter(buf, binary.LittleEndian) - reader := io.NewUint32DelimitedReader(buf, binary.LittleEndian, 1024*1024) - if err := iotest(writer, reader); err != nil { - t.Error(err) - } - if !buf.closed { - t.Fatalf("did not close buffer") - } -} - -func TestLittleUint32MaxSize(t *testing.T) { - buf := newBuffer() - writer := io.NewUint32DelimitedWriter(buf, binary.LittleEndian) - reader := io.NewUint32DelimitedReader(buf, binary.LittleEndian, 20) - if err := iotest(writer, reader); err != goio.ErrShortBuffer { - t.Error(err) - } else { - t.Logf("%s", err) - } -} - -func TestVarintNormal(t *testing.T) { - buf := newBuffer() - writer := io.NewDelimitedWriter(buf) - reader := io.NewDelimitedReader(buf, 1024*1024) - if err := iotest(writer, reader); err != nil { - t.Error(err) - } - if !buf.closed { - t.Fatalf("did not close buffer") - } -} - -func TestVarintNoClose(t *testing.T) { - buf := bytes.NewBuffer(nil) - writer := io.NewDelimitedWriter(buf) - reader := io.NewDelimitedReader(buf, 1024*1024) - if err := iotest(writer, reader); err != nil { - t.Error(err) - } -} - -//issue 32 -func TestVarintMaxSize(t *testing.T) { - buf := newBuffer() - writer := io.NewDelimitedWriter(buf) - reader := io.NewDelimitedReader(buf, 20) - if err := iotest(writer, reader); err != goio.ErrShortBuffer { - t.Error(err) - } else { - t.Logf("%s", err) - } -} - -func TestVarintError(t *testing.T) { - buf := newBuffer() - buf.Write([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f}) - reader := io.NewDelimitedReader(buf, 1024*1024) - msg := &test.NinOptNative{} - err := reader.ReadMsg(msg) - if err == nil { - t.Fatalf("Expected error") - } -} - -func TestFull(t *testing.T) { - buf := newBuffer() - writer := io.NewFullWriter(buf) - reader := io.NewFullReader(buf, 1024*1024) - r := rand.New(rand.NewSource(time.Now().UnixNano())) - msgIn := test.NewPopulatedNinOptNative(r, true) - if err := writer.WriteMsg(msgIn); err != nil { - panic(err) - } - if err := writer.Close(); err != nil { - panic(err) - } - msgOut := &test.NinOptNative{} - if err := reader.ReadMsg(msgOut); err != nil { - panic(err) - } - if err := msgIn.VerboseEqual(msgOut); err != nil { - panic(err) - } - if err := reader.ReadMsg(msgOut); err != nil { - if err != goio.EOF { - panic(err) - } - } - if err := reader.Close(); err != nil { - panic(err) - } - if !buf.closed { - t.Fatalf("did not close buffer") - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/io/uint32.go b/Godeps/_workspace/src/github.com/gogo/protobuf/io/uint32.go deleted file mode 100644 index 870c79f0bed..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/io/uint32.go +++ /dev/null @@ -1,120 +0,0 @@ -// Extensions for Protocol Buffers to create more go like structures. -// -// Copyright (c) 2013, Vastech SA (PTY) LTD. All rights reserved. -// http://github.com/gogo/protobuf/gogoproto -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package io - -import ( - "encoding/binary" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" - "io" -) - -func NewUint32DelimitedWriter(w io.Writer, byteOrder binary.ByteOrder) WriteCloser { - return &uint32Writer{w, byteOrder, nil} -} - -func NewSizeUint32DelimitedWriter(w io.Writer, byteOrder binary.ByteOrder, size int) WriteCloser { - return &uint32Writer{w, byteOrder, make([]byte, size)} -} - -type uint32Writer struct { - w io.Writer - byteOrder binary.ByteOrder - buffer []byte -} - -func (this *uint32Writer) WriteMsg(msg proto.Message) (err error) { - var data []byte - if m, ok := msg.(marshaler); ok { - n := m.Size() - if n >= len(this.buffer) { - this.buffer = make([]byte, n) - } - _, err = m.MarshalTo(this.buffer) - if err != nil { - return err - } - data = this.buffer[:n] - } else { - data, err = proto.Marshal(msg) - if err != nil { - return err - } - } - length := uint32(len(data)) - if err := binary.Write(this.w, this.byteOrder, &length); err != nil { - return err - } - _, err = this.w.Write(data) - return err -} - -func (this *uint32Writer) Close() error { - if closer, ok := this.w.(io.Closer); ok { - return closer.Close() - } - return nil -} - -type uint32Reader struct { - r io.Reader - byteOrder binary.ByteOrder - lenBuf []byte - buf []byte - maxSize int -} - -func NewUint32DelimitedReader(r io.Reader, byteOrder binary.ByteOrder, maxSize int) ReadCloser { - return &uint32Reader{r, byteOrder, make([]byte, 4), nil, maxSize} -} - -func (this *uint32Reader) ReadMsg(msg proto.Message) error { - if _, err := io.ReadFull(this.r, this.lenBuf); err != nil { - return err - } - length32 := this.byteOrder.Uint32(this.lenBuf) - length := int(length32) - if length < 0 || length > this.maxSize { - return io.ErrShortBuffer - } - if length >= len(this.buf) { - this.buf = make([]byte, length) - } - _, err := io.ReadFull(this.r, this.buf[:length]) - if err != nil { - return err - } - return proto.Unmarshal(this.buf[:length], msg) -} - -func (this *uint32Reader) Close() error { - if closer, ok := this.r.(io.Closer); ok { - return closer.Close() - } - return nil -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/io/varint.go b/Godeps/_workspace/src/github.com/gogo/protobuf/io/varint.go deleted file mode 100644 index 4f812e471e5..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/io/varint.go +++ /dev/null @@ -1,128 +0,0 @@ -// Extensions for Protocol Buffers to create more go like structures. -// -// Copyright (c) 2013, Vastech SA (PTY) LTD. All rights reserved. -// http://github.com/gogo/protobuf/gogoproto -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package io - -import ( - "bufio" - "encoding/binary" - "errors" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" - "io" -) - -var ( - errSmallBuffer = errors.New("Buffer Too Small") - errLargeValue = errors.New("Value is Larger than 64 bits") -) - -func NewDelimitedWriter(w io.Writer) WriteCloser { - return &varintWriter{w, make([]byte, 10), nil} -} - -type varintWriter struct { - w io.Writer - lenBuf []byte - buffer []byte -} - -func (this *varintWriter) WriteMsg(msg proto.Message) (err error) { - var data []byte - if m, ok := msg.(marshaler); ok { - n := m.Size() - if n >= len(this.buffer) { - this.buffer = make([]byte, n) - } - _, err = m.MarshalTo(this.buffer) - if err != nil { - return err - } - data = this.buffer[:n] - } else { - data, err = proto.Marshal(msg) - if err != nil { - return err - } - } - length := uint64(len(data)) - n := binary.PutUvarint(this.lenBuf, length) - _, err = this.w.Write(this.lenBuf[:n]) - if err != nil { - return err - } - _, err = this.w.Write(data) - return err -} - -func (this *varintWriter) Close() error { - if closer, ok := this.w.(io.Closer); ok { - return closer.Close() - } - return nil -} - -func NewDelimitedReader(r io.Reader, maxSize int) ReadCloser { - var closer io.Closer - if c, ok := r.(io.Closer); ok { - closer = c - } - return &varintReader{bufio.NewReader(r), nil, maxSize, closer} -} - -type varintReader struct { - r *bufio.Reader - buf []byte - maxSize int - closer io.Closer -} - -func (this *varintReader) ReadMsg(msg proto.Message) error { - length64, err := binary.ReadUvarint(this.r) - if err != nil { - return err - } - length := int(length64) - if length < 0 || length > this.maxSize { - return io.ErrShortBuffer - } - if len(this.buf) < length { - this.buf = make([]byte, length) - } - buf := this.buf[:length] - if _, err := io.ReadFull(this.r, buf); err != nil { - return err - } - return proto.Unmarshal(buf, msg) -} - -func (this *varintReader) Close() error { - if this.closer != nil { - return this.closer.Close() - } - return nil -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/Makefile b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/Makefile deleted file mode 100644 index 66bd2f29943..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/Makefile +++ /dev/null @@ -1,40 +0,0 @@ -# Go support for Protocol Buffers - Google's data interchange format -# -# Copyright 2010 The Go Authors. All rights reserved. -# https://github.com/golang/protobuf -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -install: - go install - -test: install generate-test-pbs - go test - - -generate-test-pbs: - make install && cd testdata && make diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/all_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/all_test.go deleted file mode 100644 index e9cde0aa788..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/all_test.go +++ /dev/null @@ -1,1979 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto_test - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "math" - "math/rand" - "reflect" - "runtime/debug" - "strings" - "testing" - "time" - - . "./testdata" - . "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" -) - -var globalO *Buffer - -func old() *Buffer { - if globalO == nil { - globalO = NewBuffer(nil) - } - globalO.Reset() - return globalO -} - -func equalbytes(b1, b2 []byte, t *testing.T) { - if len(b1) != len(b2) { - t.Errorf("wrong lengths: 2*%d != %d", len(b1), len(b2)) - return - } - for i := 0; i < len(b1); i++ { - if b1[i] != b2[i] { - t.Errorf("bad byte[%d]:%x %x: %s %s", i, b1[i], b2[i], b1, b2) - } - } -} - -func initGoTestField() *GoTestField { - f := new(GoTestField) - f.Label = String("label") - f.Type = String("type") - return f -} - -// These are all structurally equivalent but the tag numbers differ. -// (It's remarkable that required, optional, and repeated all have -// 8 letters.) -func initGoTest_RequiredGroup() *GoTest_RequiredGroup { - return &GoTest_RequiredGroup{ - RequiredField: String("required"), - } -} - -func initGoTest_OptionalGroup() *GoTest_OptionalGroup { - return &GoTest_OptionalGroup{ - RequiredField: String("optional"), - } -} - -func initGoTest_RepeatedGroup() *GoTest_RepeatedGroup { - return &GoTest_RepeatedGroup{ - RequiredField: String("repeated"), - } -} - -func initGoTest(setdefaults bool) *GoTest { - pb := new(GoTest) - if setdefaults { - pb.F_BoolDefaulted = Bool(Default_GoTest_F_BoolDefaulted) - pb.F_Int32Defaulted = Int32(Default_GoTest_F_Int32Defaulted) - pb.F_Int64Defaulted = Int64(Default_GoTest_F_Int64Defaulted) - pb.F_Fixed32Defaulted = Uint32(Default_GoTest_F_Fixed32Defaulted) - pb.F_Fixed64Defaulted = Uint64(Default_GoTest_F_Fixed64Defaulted) - pb.F_Uint32Defaulted = Uint32(Default_GoTest_F_Uint32Defaulted) - pb.F_Uint64Defaulted = Uint64(Default_GoTest_F_Uint64Defaulted) - pb.F_FloatDefaulted = Float32(Default_GoTest_F_FloatDefaulted) - pb.F_DoubleDefaulted = Float64(Default_GoTest_F_DoubleDefaulted) - pb.F_StringDefaulted = String(Default_GoTest_F_StringDefaulted) - pb.F_BytesDefaulted = Default_GoTest_F_BytesDefaulted - pb.F_Sint32Defaulted = Int32(Default_GoTest_F_Sint32Defaulted) - pb.F_Sint64Defaulted = Int64(Default_GoTest_F_Sint64Defaulted) - } - - pb.Kind = GoTest_TIME.Enum() - pb.RequiredField = initGoTestField() - pb.F_BoolRequired = Bool(true) - pb.F_Int32Required = Int32(3) - pb.F_Int64Required = Int64(6) - pb.F_Fixed32Required = Uint32(32) - pb.F_Fixed64Required = Uint64(64) - pb.F_Uint32Required = Uint32(3232) - pb.F_Uint64Required = Uint64(6464) - pb.F_FloatRequired = Float32(3232) - pb.F_DoubleRequired = Float64(6464) - pb.F_StringRequired = String("string") - pb.F_BytesRequired = []byte("bytes") - pb.F_Sint32Required = Int32(-32) - pb.F_Sint64Required = Int64(-64) - pb.Requiredgroup = initGoTest_RequiredGroup() - - return pb -} - -func fail(msg string, b *bytes.Buffer, s string, t *testing.T) { - data := b.Bytes() - ld := len(data) - ls := len(s) / 2 - - fmt.Printf("fail %s ld=%d ls=%d\n", msg, ld, ls) - - // find the interesting spot - n - n := ls - if ld < ls { - n = ld - } - j := 0 - for i := 0; i < n; i++ { - bs := hex(s[j])*16 + hex(s[j+1]) - j += 2 - if data[i] == bs { - continue - } - n = i - break - } - l := n - 10 - if l < 0 { - l = 0 - } - h := n + 10 - - // find the interesting spot - n - fmt.Printf("is[%d]:", l) - for i := l; i < h; i++ { - if i >= ld { - fmt.Printf(" --") - continue - } - fmt.Printf(" %.2x", data[i]) - } - fmt.Printf("\n") - - fmt.Printf("sb[%d]:", l) - for i := l; i < h; i++ { - if i >= ls { - fmt.Printf(" --") - continue - } - bs := hex(s[j])*16 + hex(s[j+1]) - j += 2 - fmt.Printf(" %.2x", bs) - } - fmt.Printf("\n") - - t.Fail() - - // t.Errorf("%s: \ngood: %s\nbad: %x", msg, s, b.Bytes()) - // Print the output in a partially-decoded format; can - // be helpful when updating the test. It produces the output - // that is pasted, with minor edits, into the argument to verify(). - // data := b.Bytes() - // nesting := 0 - // for b.Len() > 0 { - // start := len(data) - b.Len() - // var u uint64 - // u, err := DecodeVarint(b) - // if err != nil { - // fmt.Printf("decode error on varint:", err) - // return - // } - // wire := u & 0x7 - // tag := u >> 3 - // switch wire { - // case WireVarint: - // v, err := DecodeVarint(b) - // if err != nil { - // fmt.Printf("decode error on varint:", err) - // return - // } - // fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n", - // data[start:len(data)-b.Len()], tag, wire, v) - // case WireFixed32: - // v, err := DecodeFixed32(b) - // if err != nil { - // fmt.Printf("decode error on fixed32:", err) - // return - // } - // fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n", - // data[start:len(data)-b.Len()], tag, wire, v) - // case WireFixed64: - // v, err := DecodeFixed64(b) - // if err != nil { - // fmt.Printf("decode error on fixed64:", err) - // return - // } - // fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n", - // data[start:len(data)-b.Len()], tag, wire, v) - // case WireBytes: - // nb, err := DecodeVarint(b) - // if err != nil { - // fmt.Printf("decode error on bytes:", err) - // return - // } - // after_tag := len(data) - b.Len() - // str := make([]byte, nb) - // _, err = b.Read(str) - // if err != nil { - // fmt.Printf("decode error on bytes:", err) - // return - // } - // fmt.Printf("\t\t\"%x\" \"%x\" // field %d, encoding %d (FIELD)\n", - // data[start:after_tag], str, tag, wire) - // case WireStartGroup: - // nesting++ - // fmt.Printf("\t\t\"%x\"\t\t// start group field %d level %d\n", - // data[start:len(data)-b.Len()], tag, nesting) - // case WireEndGroup: - // fmt.Printf("\t\t\"%x\"\t\t// end group field %d level %d\n", - // data[start:len(data)-b.Len()], tag, nesting) - // nesting-- - // default: - // fmt.Printf("unrecognized wire type %d\n", wire) - // return - // } - // } -} - -func hex(c uint8) uint8 { - if '0' <= c && c <= '9' { - return c - '0' - } - if 'a' <= c && c <= 'f' { - return 10 + c - 'a' - } - if 'A' <= c && c <= 'F' { - return 10 + c - 'A' - } - return 0 -} - -func equal(b []byte, s string, t *testing.T) bool { - if 2*len(b) != len(s) { - // fail(fmt.Sprintf("wrong lengths: 2*%d != %d", len(b), len(s)), b, s, t) - fmt.Printf("wrong lengths: 2*%d != %d\n", len(b), len(s)) - return false - } - for i, j := 0, 0; i < len(b); i, j = i+1, j+2 { - x := hex(s[j])*16 + hex(s[j+1]) - if b[i] != x { - // fail(fmt.Sprintf("bad byte[%d]:%x %x", i, b[i], x), b, s, t) - fmt.Printf("bad byte[%d]:%x %x", i, b[i], x) - return false - } - } - return true -} - -func overify(t *testing.T, pb *GoTest, expected string) { - o := old() - err := o.Marshal(pb) - if err != nil { - fmt.Printf("overify marshal-1 err = %v", err) - o.DebugPrint("", o.Bytes()) - t.Fatalf("expected = %s", expected) - } - if !equal(o.Bytes(), expected, t) { - o.DebugPrint("overify neq 1", o.Bytes()) - t.Fatalf("expected = %s", expected) - } - - // Now test Unmarshal by recreating the original buffer. - pbd := new(GoTest) - err = o.Unmarshal(pbd) - if err != nil { - t.Fatalf("overify unmarshal err = %v", err) - o.DebugPrint("", o.Bytes()) - t.Fatalf("string = %s", expected) - } - o.Reset() - err = o.Marshal(pbd) - if err != nil { - t.Errorf("overify marshal-2 err = %v", err) - o.DebugPrint("", o.Bytes()) - t.Fatalf("string = %s", expected) - } - if !equal(o.Bytes(), expected, t) { - o.DebugPrint("overify neq 2", o.Bytes()) - t.Fatalf("string = %s", expected) - } -} - -// Simple tests for numeric encode/decode primitives (varint, etc.) -func TestNumericPrimitives(t *testing.T) { - for i := uint64(0); i < 1e6; i += 111 { - o := old() - if o.EncodeVarint(i) != nil { - t.Error("EncodeVarint") - break - } - x, e := o.DecodeVarint() - if e != nil { - t.Fatal("DecodeVarint") - } - if x != i { - t.Fatal("varint decode fail:", i, x) - } - - o = old() - if o.EncodeFixed32(i) != nil { - t.Fatal("encFixed32") - } - x, e = o.DecodeFixed32() - if e != nil { - t.Fatal("decFixed32") - } - if x != i { - t.Fatal("fixed32 decode fail:", i, x) - } - - o = old() - if o.EncodeFixed64(i*1234567) != nil { - t.Error("encFixed64") - break - } - x, e = o.DecodeFixed64() - if e != nil { - t.Error("decFixed64") - break - } - if x != i*1234567 { - t.Error("fixed64 decode fail:", i*1234567, x) - break - } - - o = old() - i32 := int32(i - 12345) - if o.EncodeZigzag32(uint64(i32)) != nil { - t.Fatal("EncodeZigzag32") - } - x, e = o.DecodeZigzag32() - if e != nil { - t.Fatal("DecodeZigzag32") - } - if x != uint64(uint32(i32)) { - t.Fatal("zigzag32 decode fail:", i32, x) - } - - o = old() - i64 := int64(i - 12345) - if o.EncodeZigzag64(uint64(i64)) != nil { - t.Fatal("EncodeZigzag64") - } - x, e = o.DecodeZigzag64() - if e != nil { - t.Fatal("DecodeZigzag64") - } - if x != uint64(i64) { - t.Fatal("zigzag64 decode fail:", i64, x) - } - } -} - -// fakeMarshaler is a simple struct implementing Marshaler and Message interfaces. -type fakeMarshaler struct { - b []byte - err error -} - -func (f fakeMarshaler) Marshal() ([]byte, error) { - return f.b, f.err -} - -func (f fakeMarshaler) String() string { - return fmt.Sprintf("Bytes: %v Error: %v", f.b, f.err) -} - -func (f fakeMarshaler) ProtoMessage() {} - -func (f fakeMarshaler) Reset() {} - -// Simple tests for proto messages that implement the Marshaler interface. -func TestMarshalerEncoding(t *testing.T) { - tests := []struct { - name string - m Message - want []byte - wantErr error - }{ - { - name: "Marshaler that fails", - m: fakeMarshaler{ - err: errors.New("some marshal err"), - b: []byte{5, 6, 7}, - }, - // Since there's an error, nothing should be written to buffer. - want: nil, - wantErr: errors.New("some marshal err"), - }, - { - name: "Marshaler that succeeds", - m: fakeMarshaler{ - b: []byte{0, 1, 2, 3, 4, 127, 255}, - }, - want: []byte{0, 1, 2, 3, 4, 127, 255}, - wantErr: nil, - }, - } - for _, test := range tests { - b := NewBuffer(nil) - err := b.Marshal(test.m) - if !reflect.DeepEqual(test.wantErr, err) { - t.Errorf("%s: got err %v wanted %v", test.name, err, test.wantErr) - } - if !reflect.DeepEqual(test.want, b.Bytes()) { - t.Errorf("%s: got bytes %v wanted %v", test.name, b.Bytes(), test.want) - } - } -} - -// Simple tests for bytes -func TestBytesPrimitives(t *testing.T) { - o := old() - bytes := []byte{'n', 'o', 'w', ' ', 'i', 's', ' ', 't', 'h', 'e', ' ', 't', 'i', 'm', 'e'} - if o.EncodeRawBytes(bytes) != nil { - t.Error("EncodeRawBytes") - } - decb, e := o.DecodeRawBytes(false) - if e != nil { - t.Error("DecodeRawBytes") - } - equalbytes(bytes, decb, t) -} - -// Simple tests for strings -func TestStringPrimitives(t *testing.T) { - o := old() - s := "now is the time" - if o.EncodeStringBytes(s) != nil { - t.Error("enc_string") - } - decs, e := o.DecodeStringBytes() - if e != nil { - t.Error("dec_string") - } - if s != decs { - t.Error("string encode/decode fail:", s, decs) - } -} - -// Do we catch the "required bit not set" case? -func TestRequiredBit(t *testing.T) { - o := old() - pb := new(GoTest) - err := o.Marshal(pb) - if err == nil { - t.Error("did not catch missing required fields") - } else if strings.Index(err.Error(), "Kind") < 0 { - t.Error("wrong error type:", err) - } -} - -// Check that all fields are nil. -// Clearly silly, and a residue from a more interesting test with an earlier, -// different initialization property, but it once caught a compiler bug so -// it lives. -func checkInitialized(pb *GoTest, t *testing.T) { - if pb.F_BoolDefaulted != nil { - t.Error("New or Reset did not set boolean:", *pb.F_BoolDefaulted) - } - if pb.F_Int32Defaulted != nil { - t.Error("New or Reset did not set int32:", *pb.F_Int32Defaulted) - } - if pb.F_Int64Defaulted != nil { - t.Error("New or Reset did not set int64:", *pb.F_Int64Defaulted) - } - if pb.F_Fixed32Defaulted != nil { - t.Error("New or Reset did not set fixed32:", *pb.F_Fixed32Defaulted) - } - if pb.F_Fixed64Defaulted != nil { - t.Error("New or Reset did not set fixed64:", *pb.F_Fixed64Defaulted) - } - if pb.F_Uint32Defaulted != nil { - t.Error("New or Reset did not set uint32:", *pb.F_Uint32Defaulted) - } - if pb.F_Uint64Defaulted != nil { - t.Error("New or Reset did not set uint64:", *pb.F_Uint64Defaulted) - } - if pb.F_FloatDefaulted != nil { - t.Error("New or Reset did not set float:", *pb.F_FloatDefaulted) - } - if pb.F_DoubleDefaulted != nil { - t.Error("New or Reset did not set double:", *pb.F_DoubleDefaulted) - } - if pb.F_StringDefaulted != nil { - t.Error("New or Reset did not set string:", *pb.F_StringDefaulted) - } - if pb.F_BytesDefaulted != nil { - t.Error("New or Reset did not set bytes:", string(pb.F_BytesDefaulted)) - } - if pb.F_Sint32Defaulted != nil { - t.Error("New or Reset did not set int32:", *pb.F_Sint32Defaulted) - } - if pb.F_Sint64Defaulted != nil { - t.Error("New or Reset did not set int64:", *pb.F_Sint64Defaulted) - } -} - -// Does Reset() reset? -func TestReset(t *testing.T) { - pb := initGoTest(true) - // muck with some values - pb.F_BoolDefaulted = Bool(false) - pb.F_Int32Defaulted = Int32(237) - pb.F_Int64Defaulted = Int64(12346) - pb.F_Fixed32Defaulted = Uint32(32000) - pb.F_Fixed64Defaulted = Uint64(666) - pb.F_Uint32Defaulted = Uint32(323232) - pb.F_Uint64Defaulted = nil - pb.F_FloatDefaulted = nil - pb.F_DoubleDefaulted = Float64(0) - pb.F_StringDefaulted = String("gotcha") - pb.F_BytesDefaulted = []byte("asdfasdf") - pb.F_Sint32Defaulted = Int32(123) - pb.F_Sint64Defaulted = Int64(789) - pb.Reset() - checkInitialized(pb, t) -} - -// All required fields set, no defaults provided. -func TestEncodeDecode1(t *testing.T) { - pb := initGoTest(false) - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 0x20 - "714000000000000000"+ // field 14, encoding 1, value 0x40 - "78a019"+ // field 15, encoding 0, value 0xca0 = 3232 - "8001c032"+ // field 16, encoding 0, value 0x1940 = 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2, string "string" - "b304"+ // field 70, encoding 3, start group - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // field 70, encoding 4, end group - "aa0605"+"6279746573"+ // field 101, encoding 2, string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f") // field 103, encoding 0, 0x7f zigzag64 -} - -// All required fields set, defaults provided. -func TestEncodeDecode2(t *testing.T) { - pb := initGoTest(true) - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 32 - "714000000000000000"+ // field 14, encoding 1, value 64 - "78a019"+ // field 15, encoding 0, value 3232 - "8001c032"+ // field 16, encoding 0, value 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" - "c00201"+ // field 40, encoding 0, value 1 - "c80220"+ // field 41, encoding 0, value 32 - "d00240"+ // field 42, encoding 0, value 64 - "dd0240010000"+ // field 43, encoding 5, value 320 - "e1028002000000000000"+ // field 44, encoding 1, value 640 - "e8028019"+ // field 45, encoding 0, value 3200 - "f0028032"+ // field 46, encoding 0, value 6400 - "fd02e0659948"+ // field 47, encoding 5, value 314159.0 - "81030000000050971041"+ // field 48, encoding 1, value 271828.0 - "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" - "b304"+ // start group field 70 level 1 - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // end group field 70 level 1 - "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 - "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" - "90193f"+ // field 402, encoding 0, value 63 - "98197f") // field 403, encoding 0, value 127 - -} - -// All default fields set to their default value by hand -func TestEncodeDecode3(t *testing.T) { - pb := initGoTest(false) - pb.F_BoolDefaulted = Bool(true) - pb.F_Int32Defaulted = Int32(32) - pb.F_Int64Defaulted = Int64(64) - pb.F_Fixed32Defaulted = Uint32(320) - pb.F_Fixed64Defaulted = Uint64(640) - pb.F_Uint32Defaulted = Uint32(3200) - pb.F_Uint64Defaulted = Uint64(6400) - pb.F_FloatDefaulted = Float32(314159) - pb.F_DoubleDefaulted = Float64(271828) - pb.F_StringDefaulted = String("hello, \"world!\"\n") - pb.F_BytesDefaulted = []byte("Bignose") - pb.F_Sint32Defaulted = Int32(-32) - pb.F_Sint64Defaulted = Int64(-64) - - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 32 - "714000000000000000"+ // field 14, encoding 1, value 64 - "78a019"+ // field 15, encoding 0, value 3232 - "8001c032"+ // field 16, encoding 0, value 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" - "c00201"+ // field 40, encoding 0, value 1 - "c80220"+ // field 41, encoding 0, value 32 - "d00240"+ // field 42, encoding 0, value 64 - "dd0240010000"+ // field 43, encoding 5, value 320 - "e1028002000000000000"+ // field 44, encoding 1, value 640 - "e8028019"+ // field 45, encoding 0, value 3200 - "f0028032"+ // field 46, encoding 0, value 6400 - "fd02e0659948"+ // field 47, encoding 5, value 314159.0 - "81030000000050971041"+ // field 48, encoding 1, value 271828.0 - "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" - "b304"+ // start group field 70 level 1 - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // end group field 70 level 1 - "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 - "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" - "90193f"+ // field 402, encoding 0, value 63 - "98197f") // field 403, encoding 0, value 127 - -} - -// All required fields set, defaults provided, all non-defaulted optional fields have values. -func TestEncodeDecode4(t *testing.T) { - pb := initGoTest(true) - pb.Table = String("hello") - pb.Param = Int32(7) - pb.OptionalField = initGoTestField() - pb.F_BoolOptional = Bool(true) - pb.F_Int32Optional = Int32(32) - pb.F_Int64Optional = Int64(64) - pb.F_Fixed32Optional = Uint32(3232) - pb.F_Fixed64Optional = Uint64(6464) - pb.F_Uint32Optional = Uint32(323232) - pb.F_Uint64Optional = Uint64(646464) - pb.F_FloatOptional = Float32(32.) - pb.F_DoubleOptional = Float64(64.) - pb.F_StringOptional = String("hello") - pb.F_BytesOptional = []byte("Bignose") - pb.F_Sint32Optional = Int32(-32) - pb.F_Sint64Optional = Int64(-64) - pb.Optionalgroup = initGoTest_OptionalGroup() - - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "1205"+"68656c6c6f"+ // field 2, encoding 2, string "hello" - "1807"+ // field 3, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "320d"+"0a056c6162656c120474797065"+ // field 6, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 32 - "714000000000000000"+ // field 14, encoding 1, value 64 - "78a019"+ // field 15, encoding 0, value 3232 - "8001c032"+ // field 16, encoding 0, value 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" - "f00101"+ // field 30, encoding 0, value 1 - "f80120"+ // field 31, encoding 0, value 32 - "800240"+ // field 32, encoding 0, value 64 - "8d02a00c0000"+ // field 33, encoding 5, value 3232 - "91024019000000000000"+ // field 34, encoding 1, value 6464 - "9802a0dd13"+ // field 35, encoding 0, value 323232 - "a002c0ba27"+ // field 36, encoding 0, value 646464 - "ad0200000042"+ // field 37, encoding 5, value 32.0 - "b1020000000000005040"+ // field 38, encoding 1, value 64.0 - "ba0205"+"68656c6c6f"+ // field 39, encoding 2, string "hello" - "c00201"+ // field 40, encoding 0, value 1 - "c80220"+ // field 41, encoding 0, value 32 - "d00240"+ // field 42, encoding 0, value 64 - "dd0240010000"+ // field 43, encoding 5, value 320 - "e1028002000000000000"+ // field 44, encoding 1, value 640 - "e8028019"+ // field 45, encoding 0, value 3200 - "f0028032"+ // field 46, encoding 0, value 6400 - "fd02e0659948"+ // field 47, encoding 5, value 314159.0 - "81030000000050971041"+ // field 48, encoding 1, value 271828.0 - "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" - "b304"+ // start group field 70 level 1 - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // end group field 70 level 1 - "d305"+ // start group field 90 level 1 - "da0508"+"6f7074696f6e616c"+ // field 91, encoding 2, string "optional" - "d405"+ // end group field 90 level 1 - "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 - "ea1207"+"4269676e6f7365"+ // field 301, encoding 2, string "Bignose" - "f0123f"+ // field 302, encoding 0, value 63 - "f8127f"+ // field 303, encoding 0, value 127 - "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" - "90193f"+ // field 402, encoding 0, value 63 - "98197f") // field 403, encoding 0, value 127 - -} - -// All required fields set, defaults provided, all repeated fields given two values. -func TestEncodeDecode5(t *testing.T) { - pb := initGoTest(true) - pb.RepeatedField = []*GoTestField{initGoTestField(), initGoTestField()} - pb.F_BoolRepeated = []bool{false, true} - pb.F_Int32Repeated = []int32{32, 33} - pb.F_Int64Repeated = []int64{64, 65} - pb.F_Fixed32Repeated = []uint32{3232, 3333} - pb.F_Fixed64Repeated = []uint64{6464, 6565} - pb.F_Uint32Repeated = []uint32{323232, 333333} - pb.F_Uint64Repeated = []uint64{646464, 656565} - pb.F_FloatRepeated = []float32{32., 33.} - pb.F_DoubleRepeated = []float64{64., 65.} - pb.F_StringRepeated = []string{"hello", "sailor"} - pb.F_BytesRepeated = [][]byte{[]byte("big"), []byte("nose")} - pb.F_Sint32Repeated = []int32{32, -32} - pb.F_Sint64Repeated = []int64{64, -64} - pb.Repeatedgroup = []*GoTest_RepeatedGroup{initGoTest_RepeatedGroup(), initGoTest_RepeatedGroup()} - - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "2a0d"+"0a056c6162656c120474797065"+ // field 5, encoding 2 (GoTestField) - "2a0d"+"0a056c6162656c120474797065"+ // field 5, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 32 - "714000000000000000"+ // field 14, encoding 1, value 64 - "78a019"+ // field 15, encoding 0, value 3232 - "8001c032"+ // field 16, encoding 0, value 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" - "a00100"+ // field 20, encoding 0, value 0 - "a00101"+ // field 20, encoding 0, value 1 - "a80120"+ // field 21, encoding 0, value 32 - "a80121"+ // field 21, encoding 0, value 33 - "b00140"+ // field 22, encoding 0, value 64 - "b00141"+ // field 22, encoding 0, value 65 - "bd01a00c0000"+ // field 23, encoding 5, value 3232 - "bd01050d0000"+ // field 23, encoding 5, value 3333 - "c1014019000000000000"+ // field 24, encoding 1, value 6464 - "c101a519000000000000"+ // field 24, encoding 1, value 6565 - "c801a0dd13"+ // field 25, encoding 0, value 323232 - "c80195ac14"+ // field 25, encoding 0, value 333333 - "d001c0ba27"+ // field 26, encoding 0, value 646464 - "d001b58928"+ // field 26, encoding 0, value 656565 - "dd0100000042"+ // field 27, encoding 5, value 32.0 - "dd0100000442"+ // field 27, encoding 5, value 33.0 - "e1010000000000005040"+ // field 28, encoding 1, value 64.0 - "e1010000000000405040"+ // field 28, encoding 1, value 65.0 - "ea0105"+"68656c6c6f"+ // field 29, encoding 2, string "hello" - "ea0106"+"7361696c6f72"+ // field 29, encoding 2, string "sailor" - "c00201"+ // field 40, encoding 0, value 1 - "c80220"+ // field 41, encoding 0, value 32 - "d00240"+ // field 42, encoding 0, value 64 - "dd0240010000"+ // field 43, encoding 5, value 320 - "e1028002000000000000"+ // field 44, encoding 1, value 640 - "e8028019"+ // field 45, encoding 0, value 3200 - "f0028032"+ // field 46, encoding 0, value 6400 - "fd02e0659948"+ // field 47, encoding 5, value 314159.0 - "81030000000050971041"+ // field 48, encoding 1, value 271828.0 - "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" - "b304"+ // start group field 70 level 1 - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // end group field 70 level 1 - "8305"+ // start group field 80 level 1 - "8a0508"+"7265706561746564"+ // field 81, encoding 2, string "repeated" - "8405"+ // end group field 80 level 1 - "8305"+ // start group field 80 level 1 - "8a0508"+"7265706561746564"+ // field 81, encoding 2, string "repeated" - "8405"+ // end group field 80 level 1 - "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 - "ca0c03"+"626967"+ // field 201, encoding 2, string "big" - "ca0c04"+"6e6f7365"+ // field 201, encoding 2, string "nose" - "d00c40"+ // field 202, encoding 0, value 32 - "d00c3f"+ // field 202, encoding 0, value -32 - "d80c8001"+ // field 203, encoding 0, value 64 - "d80c7f"+ // field 203, encoding 0, value -64 - "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" - "90193f"+ // field 402, encoding 0, value 63 - "98197f") // field 403, encoding 0, value 127 - -} - -// All required fields set, all packed repeated fields given two values. -func TestEncodeDecode6(t *testing.T) { - pb := initGoTest(false) - pb.F_BoolRepeatedPacked = []bool{false, true} - pb.F_Int32RepeatedPacked = []int32{32, 33} - pb.F_Int64RepeatedPacked = []int64{64, 65} - pb.F_Fixed32RepeatedPacked = []uint32{3232, 3333} - pb.F_Fixed64RepeatedPacked = []uint64{6464, 6565} - pb.F_Uint32RepeatedPacked = []uint32{323232, 333333} - pb.F_Uint64RepeatedPacked = []uint64{646464, 656565} - pb.F_FloatRepeatedPacked = []float32{32., 33.} - pb.F_DoubleRepeatedPacked = []float64{64., 65.} - pb.F_Sint32RepeatedPacked = []int32{32, -32} - pb.F_Sint64RepeatedPacked = []int64{64, -64} - - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 32 - "714000000000000000"+ // field 14, encoding 1, value 64 - "78a019"+ // field 15, encoding 0, value 3232 - "8001c032"+ // field 16, encoding 0, value 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" - "9203020001"+ // field 50, encoding 2, 2 bytes, value 0, value 1 - "9a03022021"+ // field 51, encoding 2, 2 bytes, value 32, value 33 - "a203024041"+ // field 52, encoding 2, 2 bytes, value 64, value 65 - "aa0308"+ // field 53, encoding 2, 8 bytes - "a00c0000050d0000"+ // value 3232, value 3333 - "b20310"+ // field 54, encoding 2, 16 bytes - "4019000000000000a519000000000000"+ // value 6464, value 6565 - "ba0306"+ // field 55, encoding 2, 6 bytes - "a0dd1395ac14"+ // value 323232, value 333333 - "c20306"+ // field 56, encoding 2, 6 bytes - "c0ba27b58928"+ // value 646464, value 656565 - "ca0308"+ // field 57, encoding 2, 8 bytes - "0000004200000442"+ // value 32.0, value 33.0 - "d20310"+ // field 58, encoding 2, 16 bytes - "00000000000050400000000000405040"+ // value 64.0, value 65.0 - "b304"+ // start group field 70 level 1 - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // end group field 70 level 1 - "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 - "b21f02"+ // field 502, encoding 2, 2 bytes - "403f"+ // value 32, value -32 - "ba1f03"+ // field 503, encoding 2, 3 bytes - "80017f") // value 64, value -64 -} - -// Test that we can encode empty bytes fields. -func TestEncodeDecodeBytes1(t *testing.T) { - pb := initGoTest(false) - - // Create our bytes - pb.F_BytesRequired = []byte{} - pb.F_BytesRepeated = [][]byte{{}} - pb.F_BytesOptional = []byte{} - - d, err := Marshal(pb) - if err != nil { - t.Error(err) - } - - pbd := new(GoTest) - if err := Unmarshal(d, pbd); err != nil { - t.Error(err) - } - - if pbd.F_BytesRequired == nil || len(pbd.F_BytesRequired) != 0 { - t.Error("required empty bytes field is incorrect") - } - if pbd.F_BytesRepeated == nil || len(pbd.F_BytesRepeated) == 1 && pbd.F_BytesRepeated[0] == nil { - t.Error("repeated empty bytes field is incorrect") - } - if pbd.F_BytesOptional == nil || len(pbd.F_BytesOptional) != 0 { - t.Error("optional empty bytes field is incorrect") - } -} - -// Test that we encode nil-valued fields of a repeated bytes field correctly. -// Since entries in a repeated field cannot be nil, nil must mean empty value. -func TestEncodeDecodeBytes2(t *testing.T) { - pb := initGoTest(false) - - // Create our bytes - pb.F_BytesRepeated = [][]byte{nil} - - d, err := Marshal(pb) - if err != nil { - t.Error(err) - } - - pbd := new(GoTest) - if err := Unmarshal(d, pbd); err != nil { - t.Error(err) - } - - if len(pbd.F_BytesRepeated) != 1 || pbd.F_BytesRepeated[0] == nil { - t.Error("Unexpected value for repeated bytes field") - } -} - -// All required fields set, defaults provided, all repeated fields given two values. -func TestSkippingUnrecognizedFields(t *testing.T) { - o := old() - pb := initGoTestField() - - // Marshal it normally. - o.Marshal(pb) - - // Now new a GoSkipTest record. - skip := &GoSkipTest{ - SkipInt32: Int32(32), - SkipFixed32: Uint32(3232), - SkipFixed64: Uint64(6464), - SkipString: String("skipper"), - Skipgroup: &GoSkipTest_SkipGroup{ - GroupInt32: Int32(75), - GroupString: String("wxyz"), - }, - } - - // Marshal it into same buffer. - o.Marshal(skip) - - pbd := new(GoTestField) - o.Unmarshal(pbd) - - // The __unrecognized field should be a marshaling of GoSkipTest - skipd := new(GoSkipTest) - - o.SetBuf(pbd.XXX_unrecognized) - o.Unmarshal(skipd) - - if *skipd.SkipInt32 != *skip.SkipInt32 { - t.Error("skip int32", skipd.SkipInt32) - } - if *skipd.SkipFixed32 != *skip.SkipFixed32 { - t.Error("skip fixed32", skipd.SkipFixed32) - } - if *skipd.SkipFixed64 != *skip.SkipFixed64 { - t.Error("skip fixed64", skipd.SkipFixed64) - } - if *skipd.SkipString != *skip.SkipString { - t.Error("skip string", *skipd.SkipString) - } - if *skipd.Skipgroup.GroupInt32 != *skip.Skipgroup.GroupInt32 { - t.Error("skip group int32", skipd.Skipgroup.GroupInt32) - } - if *skipd.Skipgroup.GroupString != *skip.Skipgroup.GroupString { - t.Error("skip group string", *skipd.Skipgroup.GroupString) - } -} - -// Check that unrecognized fields of a submessage are preserved. -func TestSubmessageUnrecognizedFields(t *testing.T) { - nm := &NewMessage{ - Nested: &NewMessage_Nested{ - Name: String("Nigel"), - FoodGroup: String("carbs"), - }, - } - b, err := Marshal(nm) - if err != nil { - t.Fatalf("Marshal of NewMessage: %v", err) - } - - // Unmarshal into an OldMessage. - om := new(OldMessage) - if err := Unmarshal(b, om); err != nil { - t.Fatalf("Unmarshal to OldMessage: %v", err) - } - exp := &OldMessage{ - Nested: &OldMessage_Nested{ - Name: String("Nigel"), - // normal protocol buffer users should not do this - XXX_unrecognized: []byte("\x12\x05carbs"), - }, - } - if !Equal(om, exp) { - t.Errorf("om = %v, want %v", om, exp) - } - - // Clone the OldMessage. - om = Clone(om).(*OldMessage) - if !Equal(om, exp) { - t.Errorf("Clone(om) = %v, want %v", om, exp) - } - - // Marshal the OldMessage, then unmarshal it into an empty NewMessage. - if b, err = Marshal(om); err != nil { - t.Fatalf("Marshal of OldMessage: %v", err) - } - t.Logf("Marshal(%v) -> %q", om, b) - nm2 := new(NewMessage) - if err := Unmarshal(b, nm2); err != nil { - t.Fatalf("Unmarshal to NewMessage: %v", err) - } - if !Equal(nm, nm2) { - t.Errorf("NewMessage round-trip: %v => %v", nm, nm2) - } -} - -// Check that an int32 field can be upgraded to an int64 field. -func TestNegativeInt32(t *testing.T) { - om := &OldMessage{ - Num: Int32(-1), - } - b, err := Marshal(om) - if err != nil { - t.Fatalf("Marshal of OldMessage: %v", err) - } - - // Check the size. It should be 11 bytes; - // 1 for the field/wire type, and 10 for the negative number. - if len(b) != 11 { - t.Errorf("%v marshaled as %q, wanted 11 bytes", om, b) - } - - // Unmarshal into a NewMessage. - nm := new(NewMessage) - if err := Unmarshal(b, nm); err != nil { - t.Fatalf("Unmarshal to NewMessage: %v", err) - } - want := &NewMessage{ - Num: Int64(-1), - } - if !Equal(nm, want) { - t.Errorf("nm = %v, want %v", nm, want) - } -} - -// Check that we can grow an array (repeated field) to have many elements. -// This test doesn't depend only on our encoding; for variety, it makes sure -// we create, encode, and decode the correct contents explicitly. It's therefore -// a bit messier. -// This test also uses (and hence tests) the Marshal/Unmarshal functions -// instead of the methods. -func TestBigRepeated(t *testing.T) { - pb := initGoTest(true) - - // Create the arrays - const N = 50 // Internally the library starts much smaller. - pb.Repeatedgroup = make([]*GoTest_RepeatedGroup, N) - pb.F_Sint64Repeated = make([]int64, N) - pb.F_Sint32Repeated = make([]int32, N) - pb.F_BytesRepeated = make([][]byte, N) - pb.F_StringRepeated = make([]string, N) - pb.F_DoubleRepeated = make([]float64, N) - pb.F_FloatRepeated = make([]float32, N) - pb.F_Uint64Repeated = make([]uint64, N) - pb.F_Uint32Repeated = make([]uint32, N) - pb.F_Fixed64Repeated = make([]uint64, N) - pb.F_Fixed32Repeated = make([]uint32, N) - pb.F_Int64Repeated = make([]int64, N) - pb.F_Int32Repeated = make([]int32, N) - pb.F_BoolRepeated = make([]bool, N) - pb.RepeatedField = make([]*GoTestField, N) - - // Fill in the arrays with checkable values. - igtf := initGoTestField() - igtrg := initGoTest_RepeatedGroup() - for i := 0; i < N; i++ { - pb.Repeatedgroup[i] = igtrg - pb.F_Sint64Repeated[i] = int64(i) - pb.F_Sint32Repeated[i] = int32(i) - s := fmt.Sprint(i) - pb.F_BytesRepeated[i] = []byte(s) - pb.F_StringRepeated[i] = s - pb.F_DoubleRepeated[i] = float64(i) - pb.F_FloatRepeated[i] = float32(i) - pb.F_Uint64Repeated[i] = uint64(i) - pb.F_Uint32Repeated[i] = uint32(i) - pb.F_Fixed64Repeated[i] = uint64(i) - pb.F_Fixed32Repeated[i] = uint32(i) - pb.F_Int64Repeated[i] = int64(i) - pb.F_Int32Repeated[i] = int32(i) - pb.F_BoolRepeated[i] = i%2 == 0 - pb.RepeatedField[i] = igtf - } - - // Marshal. - buf, _ := Marshal(pb) - - // Now test Unmarshal by recreating the original buffer. - pbd := new(GoTest) - Unmarshal(buf, pbd) - - // Check the checkable values - for i := uint64(0); i < N; i++ { - if pbd.Repeatedgroup[i] == nil { // TODO: more checking? - t.Error("pbd.Repeatedgroup bad") - } - var x uint64 - x = uint64(pbd.F_Sint64Repeated[i]) - if x != i { - t.Error("pbd.F_Sint64Repeated bad", x, i) - } - x = uint64(pbd.F_Sint32Repeated[i]) - if x != i { - t.Error("pbd.F_Sint32Repeated bad", x, i) - } - s := fmt.Sprint(i) - equalbytes(pbd.F_BytesRepeated[i], []byte(s), t) - if pbd.F_StringRepeated[i] != s { - t.Error("pbd.F_Sint32Repeated bad", pbd.F_StringRepeated[i], i) - } - x = uint64(pbd.F_DoubleRepeated[i]) - if x != i { - t.Error("pbd.F_DoubleRepeated bad", x, i) - } - x = uint64(pbd.F_FloatRepeated[i]) - if x != i { - t.Error("pbd.F_FloatRepeated bad", x, i) - } - x = pbd.F_Uint64Repeated[i] - if x != i { - t.Error("pbd.F_Uint64Repeated bad", x, i) - } - x = uint64(pbd.F_Uint32Repeated[i]) - if x != i { - t.Error("pbd.F_Uint32Repeated bad", x, i) - } - x = pbd.F_Fixed64Repeated[i] - if x != i { - t.Error("pbd.F_Fixed64Repeated bad", x, i) - } - x = uint64(pbd.F_Fixed32Repeated[i]) - if x != i { - t.Error("pbd.F_Fixed32Repeated bad", x, i) - } - x = uint64(pbd.F_Int64Repeated[i]) - if x != i { - t.Error("pbd.F_Int64Repeated bad", x, i) - } - x = uint64(pbd.F_Int32Repeated[i]) - if x != i { - t.Error("pbd.F_Int32Repeated bad", x, i) - } - if pbd.F_BoolRepeated[i] != (i%2 == 0) { - t.Error("pbd.F_BoolRepeated bad", x, i) - } - if pbd.RepeatedField[i] == nil { // TODO: more checking? - t.Error("pbd.RepeatedField bad") - } - } -} - -// Verify we give a useful message when decoding to the wrong structure type. -func TestTypeMismatch(t *testing.T) { - pb1 := initGoTest(true) - - // Marshal - o := old() - o.Marshal(pb1) - - // Now Unmarshal it to the wrong type. - pb2 := initGoTestField() - err := o.Unmarshal(pb2) - if err == nil { - t.Error("expected error, got no error") - } else if !strings.Contains(err.Error(), "bad wiretype") { - t.Error("expected bad wiretype error, got", err) - } -} - -func encodeDecode(t *testing.T, in, out Message, msg string) { - buf, err := Marshal(in) - if err != nil { - t.Fatalf("failed marshaling %v: %v", msg, err) - } - if err := Unmarshal(buf, out); err != nil { - t.Fatalf("failed unmarshaling %v: %v", msg, err) - } -} - -func TestPackedNonPackedDecoderSwitching(t *testing.T) { - np, p := new(NonPackedTest), new(PackedTest) - - // non-packed -> packed - np.A = []int32{0, 1, 1, 2, 3, 5} - encodeDecode(t, np, p, "non-packed -> packed") - if !reflect.DeepEqual(np.A, p.B) { - t.Errorf("failed non-packed -> packed; np.A=%+v, p.B=%+v", np.A, p.B) - } - - // packed -> non-packed - np.Reset() - p.B = []int32{3, 1, 4, 1, 5, 9} - encodeDecode(t, p, np, "packed -> non-packed") - if !reflect.DeepEqual(p.B, np.A) { - t.Errorf("failed packed -> non-packed; p.B=%+v, np.A=%+v", p.B, np.A) - } -} - -func TestProto1RepeatedGroup(t *testing.T) { - pb := &MessageList{ - Message: []*MessageList_Message{ - { - Name: String("blah"), - Count: Int32(7), - }, - // NOTE: pb.Message[1] is a nil - nil, - }, - } - - o := old() - if err := o.Marshal(pb); err != ErrRepeatedHasNil { - t.Fatalf("unexpected or no error when marshaling: %v", err) - } -} - -// Test that enums work. Checks for a bug introduced by making enums -// named types instead of int32: newInt32FromUint64 would crash with -// a type mismatch in reflect.PointTo. -func TestEnum(t *testing.T) { - pb := new(GoEnum) - pb.Foo = FOO_FOO1.Enum() - o := old() - if err := o.Marshal(pb); err != nil { - t.Fatal("error encoding enum:", err) - } - pb1 := new(GoEnum) - if err := o.Unmarshal(pb1); err != nil { - t.Fatal("error decoding enum:", err) - } - if *pb1.Foo != FOO_FOO1 { - t.Error("expected 7 but got ", *pb1.Foo) - } -} - -// Enum types have String methods. Check that enum fields can be printed. -// We don't care what the value actually is, just as long as it doesn't crash. -func TestPrintingNilEnumFields(t *testing.T) { - pb := new(GoEnum) - fmt.Sprintf("%+v", pb) -} - -// Verify that absent required fields cause Marshal/Unmarshal to return errors. -func TestRequiredFieldEnforcement(t *testing.T) { - pb := new(GoTestField) - _, err := Marshal(pb) - if err == nil { - t.Error("marshal: expected error, got nil") - } else if strings.Index(err.Error(), "Label") < 0 { - t.Errorf("marshal: bad error type: %v", err) - } - - // A slightly sneaky, yet valid, proto. It encodes the same required field twice, - // so simply counting the required fields is insufficient. - // field 1, encoding 2, value "hi" - buf := []byte("\x0A\x02hi\x0A\x02hi") - err = Unmarshal(buf, pb) - if err == nil { - t.Error("unmarshal: expected error, got nil") - } else if strings.Index(err.Error(), "{Unknown}") < 0 { - t.Errorf("unmarshal: bad error type: %v", err) - } -} - -func TestTypedNilMarshal(t *testing.T) { - // A typed nil should return ErrNil and not crash. - _, err := Marshal((*GoEnum)(nil)) - if err != ErrNil { - t.Errorf("Marshal: got err %v, want ErrNil", err) - } -} - -// A type that implements the Marshaler interface, but is not nillable. -type nonNillableInt uint64 - -func (nni nonNillableInt) Marshal() ([]byte, error) { - return EncodeVarint(uint64(nni)), nil -} - -type NNIMessage struct { - nni nonNillableInt -} - -func (*NNIMessage) Reset() {} -func (*NNIMessage) String() string { return "" } -func (*NNIMessage) ProtoMessage() {} - -// A type that implements the Marshaler interface and is nillable. -type nillableMessage struct { - x uint64 -} - -func (nm *nillableMessage) Marshal() ([]byte, error) { - return EncodeVarint(nm.x), nil -} - -type NMMessage struct { - nm *nillableMessage -} - -func (*NMMessage) Reset() {} -func (*NMMessage) String() string { return "" } -func (*NMMessage) ProtoMessage() {} - -// Verify a type that uses the Marshaler interface, but has a nil pointer. -func TestNilMarshaler(t *testing.T) { - // Try a struct with a Marshaler field that is nil. - // It should be directly marshable. - nmm := new(NMMessage) - if _, err := Marshal(nmm); err != nil { - t.Error("unexpected error marshaling nmm: ", err) - } - - // Try a struct with a Marshaler field that is not nillable. - nnim := new(NNIMessage) - nnim.nni = 7 - var _ Marshaler = nnim.nni // verify it is truly a Marshaler - if _, err := Marshal(nnim); err != nil { - t.Error("unexpected error marshaling nnim: ", err) - } -} - -func TestAllSetDefaults(t *testing.T) { - // Exercise SetDefaults with all scalar field types. - m := &Defaults{ - // NaN != NaN, so override that here. - F_Nan: Float32(1.7), - } - expected := &Defaults{ - F_Bool: Bool(true), - F_Int32: Int32(32), - F_Int64: Int64(64), - F_Fixed32: Uint32(320), - F_Fixed64: Uint64(640), - F_Uint32: Uint32(3200), - F_Uint64: Uint64(6400), - F_Float: Float32(314159), - F_Double: Float64(271828), - F_String: String(`hello, "world!"` + "\n"), - F_Bytes: []byte("Bignose"), - F_Sint32: Int32(-32), - F_Sint64: Int64(-64), - F_Enum: Defaults_GREEN.Enum(), - F_Pinf: Float32(float32(math.Inf(1))), - F_Ninf: Float32(float32(math.Inf(-1))), - F_Nan: Float32(1.7), - StrZero: String(""), - } - SetDefaults(m) - if !Equal(m, expected) { - t.Errorf("SetDefaults failed\n got %v\nwant %v", m, expected) - } -} - -func TestSetDefaultsWithSetField(t *testing.T) { - // Check that a set value is not overridden. - m := &Defaults{ - F_Int32: Int32(12), - } - SetDefaults(m) - if v := m.GetF_Int32(); v != 12 { - t.Errorf("m.FInt32 = %v, want 12", v) - } -} - -func TestSetDefaultsWithSubMessage(t *testing.T) { - m := &OtherMessage{ - Key: Int64(123), - Inner: &InnerMessage{ - Host: String("gopher"), - }, - } - expected := &OtherMessage{ - Key: Int64(123), - Inner: &InnerMessage{ - Host: String("gopher"), - Port: Int32(4000), - }, - } - SetDefaults(m) - if !Equal(m, expected) { - t.Errorf("\n got %v\nwant %v", m, expected) - } -} - -func TestSetDefaultsWithRepeatedSubMessage(t *testing.T) { - m := &MyMessage{ - RepInner: []*InnerMessage{{}}, - } - expected := &MyMessage{ - RepInner: []*InnerMessage{{ - Port: Int32(4000), - }}, - } - SetDefaults(m) - if !Equal(m, expected) { - t.Errorf("\n got %v\nwant %v", m, expected) - } -} - -func TestMaximumTagNumber(t *testing.T) { - m := &MaxTag{ - LastField: String("natural goat essence"), - } - buf, err := Marshal(m) - if err != nil { - t.Fatalf("proto.Marshal failed: %v", err) - } - m2 := new(MaxTag) - if err := Unmarshal(buf, m2); err != nil { - t.Fatalf("proto.Unmarshal failed: %v", err) - } - if got, want := m2.GetLastField(), *m.LastField; got != want { - t.Errorf("got %q, want %q", got, want) - } -} - -func TestJSON(t *testing.T) { - m := &MyMessage{ - Count: Int32(4), - Pet: []string{"bunny", "kitty"}, - Inner: &InnerMessage{ - Host: String("cauchy"), - }, - Bikeshed: MyMessage_GREEN.Enum(), - } - const expected = `{"count":4,"pet":["bunny","kitty"],"inner":{"host":"cauchy"},"bikeshed":1}` - - b, err := json.Marshal(m) - if err != nil { - t.Fatalf("json.Marshal failed: %v", err) - } - s := string(b) - if s != expected { - t.Errorf("got %s\nwant %s", s, expected) - } - - received := new(MyMessage) - if err := json.Unmarshal(b, received); err != nil { - t.Fatalf("json.Unmarshal failed: %v", err) - } - if !Equal(received, m) { - t.Fatalf("got %s, want %s", received, m) - } - - // Test unmarshalling of JSON with symbolic enum name. - const old = `{"count":4,"pet":["bunny","kitty"],"inner":{"host":"cauchy"},"bikeshed":"GREEN"}` - received.Reset() - if err := json.Unmarshal([]byte(old), received); err != nil { - t.Fatalf("json.Unmarshal failed: %v", err) - } - if !Equal(received, m) { - t.Fatalf("got %s, want %s", received, m) - } -} - -func TestBadWireType(t *testing.T) { - b := []byte{7<<3 | 6} // field 7, wire type 6 - pb := new(OtherMessage) - if err := Unmarshal(b, pb); err == nil { - t.Errorf("Unmarshal did not fail") - } else if !strings.Contains(err.Error(), "unknown wire type") { - t.Errorf("wrong error: %v", err) - } -} - -func TestBytesWithInvalidLength(t *testing.T) { - // If a byte sequence has an invalid (negative) length, Unmarshal should not panic. - b := []byte{2<<3 | WireBytes, 0xff, 0xff, 0xff, 0xff, 0xff, 0} - Unmarshal(b, new(MyMessage)) -} - -func TestLengthOverflow(t *testing.T) { - // Overflowing a length should not panic. - b := []byte{2<<3 | WireBytes, 1, 1, 3<<3 | WireBytes, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x01} - Unmarshal(b, new(MyMessage)) -} - -func TestVarintOverflow(t *testing.T) { - // Overflowing a 64-bit length should not be allowed. - b := []byte{1<<3 | WireVarint, 0x01, 3<<3 | WireBytes, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01} - if err := Unmarshal(b, new(MyMessage)); err == nil { - t.Fatalf("Overflowed uint64 length without error") - } -} - -func TestUnmarshalFuzz(t *testing.T) { - const N = 1000 - seed := time.Now().UnixNano() - t.Logf("RNG seed is %d", seed) - rng := rand.New(rand.NewSource(seed)) - buf := make([]byte, 20) - for i := 0; i < N; i++ { - for j := range buf { - buf[j] = byte(rng.Intn(256)) - } - fuzzUnmarshal(t, buf) - } -} - -func TestMergeMessages(t *testing.T) { - pb := &MessageList{Message: []*MessageList_Message{{Name: String("x"), Count: Int32(1)}}} - data, err := Marshal(pb) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - - pb1 := new(MessageList) - if err := Unmarshal(data, pb1); err != nil { - t.Fatalf("first Unmarshal: %v", err) - } - if err := Unmarshal(data, pb1); err != nil { - t.Fatalf("second Unmarshal: %v", err) - } - if len(pb1.Message) != 1 { - t.Errorf("two Unmarshals produced %d Messages, want 1", len(pb1.Message)) - } - - pb2 := new(MessageList) - if err := UnmarshalMerge(data, pb2); err != nil { - t.Fatalf("first UnmarshalMerge: %v", err) - } - if err := UnmarshalMerge(data, pb2); err != nil { - t.Fatalf("second UnmarshalMerge: %v", err) - } - if len(pb2.Message) != 2 { - t.Errorf("two UnmarshalMerges produced %d Messages, want 2", len(pb2.Message)) - } -} - -func TestExtensionMarshalOrder(t *testing.T) { - m := &MyMessage{Count: Int(123)} - if err := SetExtension(m, E_Ext_More, &Ext{Data: String("alpha")}); err != nil { - t.Fatalf("SetExtension: %v", err) - } - if err := SetExtension(m, E_Ext_Text, String("aleph")); err != nil { - t.Fatalf("SetExtension: %v", err) - } - if err := SetExtension(m, E_Ext_Number, Int32(1)); err != nil { - t.Fatalf("SetExtension: %v", err) - } - - // Serialize m several times, and check we get the same bytes each time. - var orig []byte - for i := 0; i < 100; i++ { - b, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - if i == 0 { - orig = b - continue - } - if !bytes.Equal(b, orig) { - t.Errorf("Bytes differ on attempt #%d", i) - } - } -} - -// Many extensions, because small maps might not iterate differently on each iteration. -var exts = []*ExtensionDesc{ - E_X201, - E_X202, - E_X203, - E_X204, - E_X205, - E_X206, - E_X207, - E_X208, - E_X209, - E_X210, - E_X211, - E_X212, - E_X213, - E_X214, - E_X215, - E_X216, - E_X217, - E_X218, - E_X219, - E_X220, - E_X221, - E_X222, - E_X223, - E_X224, - E_X225, - E_X226, - E_X227, - E_X228, - E_X229, - E_X230, - E_X231, - E_X232, - E_X233, - E_X234, - E_X235, - E_X236, - E_X237, - E_X238, - E_X239, - E_X240, - E_X241, - E_X242, - E_X243, - E_X244, - E_X245, - E_X246, - E_X247, - E_X248, - E_X249, - E_X250, -} - -func TestMessageSetMarshalOrder(t *testing.T) { - m := &MyMessageSet{} - for _, x := range exts { - if err := SetExtension(m, x, &Empty{}); err != nil { - t.Fatalf("SetExtension: %v", err) - } - } - - buf, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - - // Serialize m several times, and check we get the same bytes each time. - for i := 0; i < 10; i++ { - b1, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - if !bytes.Equal(b1, buf) { - t.Errorf("Bytes differ on re-Marshal #%d", i) - } - - m2 := &MyMessageSet{} - if err := Unmarshal(buf, m2); err != nil { - t.Errorf("Unmarshal: %v", err) - } - b2, err := Marshal(m2) - if err != nil { - t.Errorf("re-Marshal: %v", err) - } - if !bytes.Equal(b2, buf) { - t.Errorf("Bytes differ on round-trip #%d", i) - } - } -} - -func TestUnmarshalMergesMessages(t *testing.T) { - // If a nested message occurs twice in the input, - // the fields should be merged when decoding. - a := &OtherMessage{ - Key: Int64(123), - Inner: &InnerMessage{ - Host: String("polhode"), - Port: Int32(1234), - }, - } - aData, err := Marshal(a) - if err != nil { - t.Fatalf("Marshal(a): %v", err) - } - b := &OtherMessage{ - Weight: Float32(1.2), - Inner: &InnerMessage{ - Host: String("herpolhode"), - Connected: Bool(true), - }, - } - bData, err := Marshal(b) - if err != nil { - t.Fatalf("Marshal(b): %v", err) - } - want := &OtherMessage{ - Key: Int64(123), - Weight: Float32(1.2), - Inner: &InnerMessage{ - Host: String("herpolhode"), - Port: Int32(1234), - Connected: Bool(true), - }, - } - got := new(OtherMessage) - if err := Unmarshal(append(aData, bData...), got); err != nil { - t.Fatalf("Unmarshal: %v", err) - } - if !Equal(got, want) { - t.Errorf("\n got %v\nwant %v", got, want) - } -} - -func TestEncodingSizes(t *testing.T) { - tests := []struct { - m Message - n int - }{ - {&Defaults{F_Int32: Int32(math.MaxInt32)}, 6}, - {&Defaults{F_Int32: Int32(math.MinInt32)}, 11}, - {&Defaults{F_Uint32: Uint32(uint32(math.MaxInt32) + 1)}, 6}, - {&Defaults{F_Uint32: Uint32(math.MaxUint32)}, 6}, - } - for _, test := range tests { - b, err := Marshal(test.m) - if err != nil { - t.Errorf("Marshal(%v): %v", test.m, err) - continue - } - if len(b) != test.n { - t.Errorf("Marshal(%v) yielded %d bytes, want %d bytes", test.m, len(b), test.n) - } - } -} - -func TestRequiredNotSetError(t *testing.T) { - pb := initGoTest(false) - pb.RequiredField.Label = nil - pb.F_Int32Required = nil - pb.F_Int64Required = nil - - expected := "0807" + // field 1, encoding 0, value 7 - "2206" + "120474797065" + // field 4, encoding 2 (GoTestField) - "5001" + // field 10, encoding 0, value 1 - "6d20000000" + // field 13, encoding 5, value 0x20 - "714000000000000000" + // field 14, encoding 1, value 0x40 - "78a019" + // field 15, encoding 0, value 0xca0 = 3232 - "8001c032" + // field 16, encoding 0, value 0x1940 = 6464 - "8d0100004a45" + // field 17, encoding 5, value 3232.0 - "9101000000000040b940" + // field 18, encoding 1, value 6464.0 - "9a0106" + "737472696e67" + // field 19, encoding 2, string "string" - "b304" + // field 70, encoding 3, start group - "ba0408" + "7265717569726564" + // field 71, encoding 2, string "required" - "b404" + // field 70, encoding 4, end group - "aa0605" + "6279746573" + // field 101, encoding 2, string "bytes" - "b0063f" + // field 102, encoding 0, 0x3f zigzag32 - "b8067f" // field 103, encoding 0, 0x7f zigzag64 - - o := old() - bytes, err := Marshal(pb) - if _, ok := err.(*RequiredNotSetError); !ok { - fmt.Printf("marshal-1 err = %v, want *RequiredNotSetError", err) - o.DebugPrint("", bytes) - t.Fatalf("expected = %s", expected) - } - if strings.Index(err.Error(), "RequiredField.Label") < 0 { - t.Errorf("marshal-1 wrong err msg: %v", err) - } - if !equal(bytes, expected, t) { - o.DebugPrint("neq 1", bytes) - t.Fatalf("expected = %s", expected) - } - - // Now test Unmarshal by recreating the original buffer. - pbd := new(GoTest) - err = Unmarshal(bytes, pbd) - if _, ok := err.(*RequiredNotSetError); !ok { - t.Fatalf("unmarshal err = %v, want *RequiredNotSetError", err) - o.DebugPrint("", bytes) - t.Fatalf("string = %s", expected) - } - if strings.Index(err.Error(), "RequiredField.{Unknown}") < 0 { - t.Errorf("unmarshal wrong err msg: %v", err) - } - bytes, err = Marshal(pbd) - if _, ok := err.(*RequiredNotSetError); !ok { - t.Errorf("marshal-2 err = %v, want *RequiredNotSetError", err) - o.DebugPrint("", bytes) - t.Fatalf("string = %s", expected) - } - if strings.Index(err.Error(), "RequiredField.Label") < 0 { - t.Errorf("marshal-2 wrong err msg: %v", err) - } - if !equal(bytes, expected, t) { - o.DebugPrint("neq 2", bytes) - t.Fatalf("string = %s", expected) - } -} - -func fuzzUnmarshal(t *testing.T, data []byte) { - defer func() { - if e := recover(); e != nil { - t.Errorf("These bytes caused a panic: %+v", data) - t.Logf("Stack:\n%s", debug.Stack()) - t.FailNow() - } - }() - - pb := new(MyMessage) - Unmarshal(data, pb) -} - -// Benchmarks - -func testMsg() *GoTest { - pb := initGoTest(true) - const N = 1000 // Internally the library starts much smaller. - pb.F_Int32Repeated = make([]int32, N) - pb.F_DoubleRepeated = make([]float64, N) - for i := 0; i < N; i++ { - pb.F_Int32Repeated[i] = int32(i) - pb.F_DoubleRepeated[i] = float64(i) - } - return pb -} - -func bytesMsg() *GoTest { - pb := initGoTest(true) - buf := make([]byte, 4000) - for i := range buf { - buf[i] = byte(i) - } - pb.F_BytesDefaulted = buf - return pb -} - -func benchmarkMarshal(b *testing.B, pb Message, marshal func(Message) ([]byte, error)) { - d, _ := marshal(pb) - b.SetBytes(int64(len(d))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - marshal(pb) - } -} - -func benchmarkBufferMarshal(b *testing.B, pb Message) { - p := NewBuffer(nil) - benchmarkMarshal(b, pb, func(pb0 Message) ([]byte, error) { - p.Reset() - err := p.Marshal(pb0) - return p.Bytes(), err - }) -} - -func benchmarkSize(b *testing.B, pb Message) { - benchmarkMarshal(b, pb, func(pb0 Message) ([]byte, error) { - Size(pb) - return nil, nil - }) -} - -func newOf(pb Message) Message { - in := reflect.ValueOf(pb) - if in.IsNil() { - return pb - } - return reflect.New(in.Type().Elem()).Interface().(Message) -} - -func benchmarkUnmarshal(b *testing.B, pb Message, unmarshal func([]byte, Message) error) { - d, _ := Marshal(pb) - b.SetBytes(int64(len(d))) - pbd := newOf(pb) - - b.ResetTimer() - for i := 0; i < b.N; i++ { - unmarshal(d, pbd) - } -} - -func benchmarkBufferUnmarshal(b *testing.B, pb Message) { - p := NewBuffer(nil) - benchmarkUnmarshal(b, pb, func(d []byte, pb0 Message) error { - p.SetBuf(d) - return p.Unmarshal(pb0) - }) -} - -// Benchmark{Marshal,BufferMarshal,Size,Unmarshal,BufferUnmarshal}{,Bytes} - -func BenchmarkMarshal(b *testing.B) { - benchmarkMarshal(b, testMsg(), Marshal) -} - -func BenchmarkBufferMarshal(b *testing.B) { - benchmarkBufferMarshal(b, testMsg()) -} - -func BenchmarkSize(b *testing.B) { - benchmarkSize(b, testMsg()) -} - -func BenchmarkUnmarshal(b *testing.B) { - benchmarkUnmarshal(b, testMsg(), Unmarshal) -} - -func BenchmarkBufferUnmarshal(b *testing.B) { - benchmarkBufferUnmarshal(b, testMsg()) -} - -func BenchmarkMarshalBytes(b *testing.B) { - benchmarkMarshal(b, bytesMsg(), Marshal) -} - -func BenchmarkBufferMarshalBytes(b *testing.B) { - benchmarkBufferMarshal(b, bytesMsg()) -} - -func BenchmarkSizeBytes(b *testing.B) { - benchmarkSize(b, bytesMsg()) -} - -func BenchmarkUnmarshalBytes(b *testing.B) { - benchmarkUnmarshal(b, bytesMsg(), Unmarshal) -} - -func BenchmarkBufferUnmarshalBytes(b *testing.B) { - benchmarkBufferUnmarshal(b, bytesMsg()) -} - -func BenchmarkUnmarshalUnrecognizedFields(b *testing.B) { - b.StopTimer() - pb := initGoTestField() - skip := &GoSkipTest{ - SkipInt32: Int32(32), - SkipFixed32: Uint32(3232), - SkipFixed64: Uint64(6464), - SkipString: String("skipper"), - Skipgroup: &GoSkipTest_SkipGroup{ - GroupInt32: Int32(75), - GroupString: String("wxyz"), - }, - } - - pbd := new(GoTestField) - p := NewBuffer(nil) - p.Marshal(pb) - p.Marshal(skip) - p2 := NewBuffer(nil) - - b.StartTimer() - for i := 0; i < b.N; i++ { - p2.SetBuf(p.Bytes()) - p2.Unmarshal(pbd) - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/clone.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/clone.go deleted file mode 100644 index 8f9de86f701..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/clone.go +++ /dev/null @@ -1,179 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Protocol buffer deep copy. -// TODO: MessageSet and RawMessage. - -package proto - -import ( - "log" - "reflect" - "strings" -) - -// Clone returns a deep copy of a protocol buffer. -func Clone(pb Message) Message { - in := reflect.ValueOf(pb) - if in.IsNil() { - return pb - } - - out := reflect.New(in.Type().Elem()) - // out is empty so a merge is a deep copy. - mergeStruct(out.Elem(), in.Elem()) - return out.Interface().(Message) -} - -// Merge merges src into dst. -// Required and optional fields that are set in src will be set to that value in dst. -// Elements of repeated fields will be appended. -// Merge panics if src and dst are not the same type, or if dst is nil. -func Merge(dst, src Message) { - in := reflect.ValueOf(src) - out := reflect.ValueOf(dst) - if out.IsNil() { - panic("proto: nil destination") - } - if in.Type() != out.Type() { - // Explicit test prior to mergeStruct so that mistyped nils will fail - panic("proto: type mismatch") - } - if in.IsNil() { - // Merging nil into non-nil is a quiet no-op - return - } - mergeStruct(out.Elem(), in.Elem()) -} - -func mergeStruct(out, in reflect.Value) { - for i := 0; i < in.NumField(); i++ { - f := in.Type().Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - mergeAny(out.Field(i), in.Field(i)) - } - - if emIn, ok := in.Addr().Interface().(extensionsMap); ok { - emOut := out.Addr().Interface().(extensionsMap) - mergeExtension(emOut.ExtensionMap(), emIn.ExtensionMap()) - } else if emIn, ok := in.Addr().Interface().(extensionsBytes); ok { - emOut := out.Addr().Interface().(extensionsBytes) - bIn := emIn.GetExtensions() - bOut := emOut.GetExtensions() - *bOut = append(*bOut, *bIn...) - } - - uf := in.FieldByName("XXX_unrecognized") - if !uf.IsValid() { - return - } - uin := uf.Bytes() - if len(uin) > 0 { - out.FieldByName("XXX_unrecognized").SetBytes(append([]byte(nil), uin...)) - } -} - -func mergeAny(out, in reflect.Value) { - if in.Type() == protoMessageType { - if !in.IsNil() { - if out.IsNil() { - out.Set(reflect.ValueOf(Clone(in.Interface().(Message)))) - } else { - Merge(out.Interface().(Message), in.Interface().(Message)) - } - } - return - } - switch in.Kind() { - case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, - reflect.String, reflect.Uint32, reflect.Uint64: - out.Set(in) - case reflect.Ptr: - if in.IsNil() { - return - } - if out.IsNil() { - out.Set(reflect.New(in.Elem().Type())) - } - mergeAny(out.Elem(), in.Elem()) - case reflect.Slice: - if in.IsNil() { - return - } - if in.Type().Elem().Kind() == reflect.Uint8 { - // []byte is a scalar bytes field, not a repeated field. - // Make a deep copy. - // Append to []byte{} instead of []byte(nil) so that we never end up - // with a nil result. - out.SetBytes(append([]byte{}, in.Bytes()...)) - return - } - n := in.Len() - if out.IsNil() { - out.Set(reflect.MakeSlice(in.Type(), 0, n)) - } - switch in.Type().Elem().Kind() { - case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, - reflect.String, reflect.Uint32, reflect.Uint64: - out.Set(reflect.AppendSlice(out, in)) - default: - for i := 0; i < n; i++ { - x := reflect.Indirect(reflect.New(in.Type().Elem())) - mergeAny(x, in.Index(i)) - out.Set(reflect.Append(out, x)) - } - } - case reflect.Struct: - mergeStruct(out, in) - default: - // unknown type, so not a protocol buffer - log.Printf("proto: don't know how to copy %v", in) - } -} - -func mergeExtension(out, in map[int32]Extension) { - for extNum, eIn := range in { - eOut := Extension{desc: eIn.desc} - if eIn.value != nil { - v := reflect.New(reflect.TypeOf(eIn.value)).Elem() - mergeAny(v, reflect.ValueOf(eIn.value)) - eOut.value = v.Interface() - } - if eIn.enc != nil { - eOut.enc = make([]byte, len(eIn.enc)) - copy(eOut.enc, eIn.enc) - } - - out[extNum] = eOut - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/clone_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/clone_test.go deleted file mode 100644 index 91b62e7c8c1..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/clone_test.go +++ /dev/null @@ -1,201 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto_test - -import ( - "testing" - - pb "./testdata" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" -) - -var cloneTestMessage = &pb.MyMessage{ - Count: proto.Int32(42), - Name: proto.String("Dave"), - Pet: []string{"bunny", "kitty", "horsey"}, - Inner: &pb.InnerMessage{ - Host: proto.String("niles"), - Port: proto.Int32(9099), - Connected: proto.Bool(true), - }, - Others: []*pb.OtherMessage{ - { - Value: []byte("some bytes"), - }, - }, - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: proto.Int32(6), - }, - RepBytes: [][]byte{[]byte("sham"), []byte("wow")}, -} - -func init() { - ext := &pb.Ext{ - Data: proto.String("extension"), - } - if err := proto.SetExtension(cloneTestMessage, pb.E_Ext_More, ext); err != nil { - panic("SetExtension: " + err.Error()) - } -} - -func TestClone(t *testing.T) { - m := proto.Clone(cloneTestMessage).(*pb.MyMessage) - if !proto.Equal(m, cloneTestMessage) { - t.Errorf("Clone(%v) = %v", cloneTestMessage, m) - } - - // Verify it was a deep copy. - *m.Inner.Port++ - if proto.Equal(m, cloneTestMessage) { - t.Error("Mutating clone changed the original") - } - // Byte fields and repeated fields should be copied. - if &m.Pet[0] == &cloneTestMessage.Pet[0] { - t.Error("Pet: repeated field not copied") - } - if &m.Others[0] == &cloneTestMessage.Others[0] { - t.Error("Others: repeated field not copied") - } - if &m.Others[0].Value[0] == &cloneTestMessage.Others[0].Value[0] { - t.Error("Others[0].Value: bytes field not copied") - } - if &m.RepBytes[0] == &cloneTestMessage.RepBytes[0] { - t.Error("RepBytes: repeated field not copied") - } - if &m.RepBytes[0][0] == &cloneTestMessage.RepBytes[0][0] { - t.Error("RepBytes[0]: bytes field not copied") - } -} - -func TestCloneNil(t *testing.T) { - var m *pb.MyMessage - if c := proto.Clone(m); !proto.Equal(m, c) { - t.Errorf("Clone(%v) = %v", m, c) - } -} - -var mergeTests = []struct { - src, dst, want proto.Message -}{ - { - src: &pb.MyMessage{ - Count: proto.Int32(42), - }, - dst: &pb.MyMessage{ - Name: proto.String("Dave"), - }, - want: &pb.MyMessage{ - Count: proto.Int32(42), - Name: proto.String("Dave"), - }, - }, - { - src: &pb.MyMessage{ - Inner: &pb.InnerMessage{ - Host: proto.String("hey"), - Connected: proto.Bool(true), - }, - Pet: []string{"horsey"}, - Others: []*pb.OtherMessage{ - { - Value: []byte("some bytes"), - }, - }, - }, - dst: &pb.MyMessage{ - Inner: &pb.InnerMessage{ - Host: proto.String("niles"), - Port: proto.Int32(9099), - }, - Pet: []string{"bunny", "kitty"}, - Others: []*pb.OtherMessage{ - { - Key: proto.Int64(31415926535), - }, - { - // Explicitly test a src=nil field - Inner: nil, - }, - }, - }, - want: &pb.MyMessage{ - Inner: &pb.InnerMessage{ - Host: proto.String("hey"), - Connected: proto.Bool(true), - Port: proto.Int32(9099), - }, - Pet: []string{"bunny", "kitty", "horsey"}, - Others: []*pb.OtherMessage{ - { - Key: proto.Int64(31415926535), - }, - {}, - { - Value: []byte("some bytes"), - }, - }, - }, - }, - { - src: &pb.MyMessage{ - RepBytes: [][]byte{[]byte("wow")}, - }, - dst: &pb.MyMessage{ - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: proto.Int32(6), - }, - RepBytes: [][]byte{[]byte("sham")}, - }, - want: &pb.MyMessage{ - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: proto.Int32(6), - }, - RepBytes: [][]byte{[]byte("sham"), []byte("wow")}, - }, - }, - // Check that a scalar bytes field replaces rather than appends. - { - src: &pb.OtherMessage{Value: []byte("foo")}, - dst: &pb.OtherMessage{Value: []byte("bar")}, - want: &pb.OtherMessage{Value: []byte("foo")}, - }, -} - -func TestMerge(t *testing.T) { - for _, m := range mergeTests { - got := proto.Clone(m.dst) - proto.Merge(got, m.src) - if !proto.Equal(got, m.want) { - t.Errorf("Merge(%v, %v)\n got %v\nwant %v\n", m.dst, m.src, got, m.want) - } - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/decode.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/decode.go deleted file mode 100644 index ac0ea333b84..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/decode.go +++ /dev/null @@ -1,726 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Routines for decoding protocol buffer data to construct in-memory representations. - */ - -import ( - "errors" - "fmt" - "io" - "os" - "reflect" -) - -// errOverflow is returned when an integer is too large to be represented. -var errOverflow = errors.New("proto: integer overflow") - -// The fundamental decoders that interpret bytes on the wire. -// Those that take integer types all return uint64 and are -// therefore of type valueDecoder. - -// DecodeVarint reads a varint-encoded integer from the slice. -// It returns the integer and the number of bytes consumed, or -// zero if there is not enough. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func DecodeVarint(buf []byte) (x uint64, n int) { - // x, n already 0 - for shift := uint(0); shift < 64; shift += 7 { - if n >= len(buf) { - return 0, 0 - } - b := uint64(buf[n]) - n++ - x |= (b & 0x7F) << shift - if (b & 0x80) == 0 { - return x, n - } - } - - // The number is too large to represent in a 64-bit value. - return 0, 0 -} - -// DecodeVarint reads a varint-encoded integer from the Buffer. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func (p *Buffer) DecodeVarint() (x uint64, err error) { - // x, err already 0 - - i := p.index - l := len(p.buf) - - for shift := uint(0); shift < 64; shift += 7 { - if i >= l { - err = io.ErrUnexpectedEOF - return - } - b := p.buf[i] - i++ - x |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - p.index = i - return - } - } - - // The number is too large to represent in a 64-bit value. - err = errOverflow - return -} - -// DecodeFixed64 reads a 64-bit integer from the Buffer. -// This is the format for the -// fixed64, sfixed64, and double protocol buffer types. -func (p *Buffer) DecodeFixed64() (x uint64, err error) { - // x, err already 0 - i := p.index + 8 - if i < 0 || i > len(p.buf) { - err = io.ErrUnexpectedEOF - return - } - p.index = i - - x = uint64(p.buf[i-8]) - x |= uint64(p.buf[i-7]) << 8 - x |= uint64(p.buf[i-6]) << 16 - x |= uint64(p.buf[i-5]) << 24 - x |= uint64(p.buf[i-4]) << 32 - x |= uint64(p.buf[i-3]) << 40 - x |= uint64(p.buf[i-2]) << 48 - x |= uint64(p.buf[i-1]) << 56 - return -} - -// DecodeFixed32 reads a 32-bit integer from the Buffer. -// This is the format for the -// fixed32, sfixed32, and float protocol buffer types. -func (p *Buffer) DecodeFixed32() (x uint64, err error) { - // x, err already 0 - i := p.index + 4 - if i < 0 || i > len(p.buf) { - err = io.ErrUnexpectedEOF - return - } - p.index = i - - x = uint64(p.buf[i-4]) - x |= uint64(p.buf[i-3]) << 8 - x |= uint64(p.buf[i-2]) << 16 - x |= uint64(p.buf[i-1]) << 24 - return -} - -// DecodeZigzag64 reads a zigzag-encoded 64-bit integer -// from the Buffer. -// This is the format used for the sint64 protocol buffer type. -func (p *Buffer) DecodeZigzag64() (x uint64, err error) { - x, err = p.DecodeVarint() - if err != nil { - return - } - x = (x >> 1) ^ uint64((int64(x&1)<<63)>>63) - return -} - -// DecodeZigzag32 reads a zigzag-encoded 32-bit integer -// from the Buffer. -// This is the format used for the sint32 protocol buffer type. -func (p *Buffer) DecodeZigzag32() (x uint64, err error) { - x, err = p.DecodeVarint() - if err != nil { - return - } - x = uint64((uint32(x) >> 1) ^ uint32((int32(x&1)<<31)>>31)) - return -} - -// These are not ValueDecoders: they produce an array of bytes or a string. -// bytes, embedded messages - -// DecodeRawBytes reads a count-delimited byte buffer from the Buffer. -// This is the format used for the bytes protocol buffer -// type and for embedded messages. -func (p *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) { - n, err := p.DecodeVarint() - if err != nil { - return - } - - nb := int(n) - if nb < 0 { - return nil, fmt.Errorf("proto: bad byte length %d", nb) - } - end := p.index + nb - if end < p.index || end > len(p.buf) { - return nil, io.ErrUnexpectedEOF - } - - if !alloc { - // todo: check if can get more uses of alloc=false - buf = p.buf[p.index:end] - p.index += nb - return - } - - buf = make([]byte, nb) - copy(buf, p.buf[p.index:]) - p.index += nb - return -} - -// DecodeStringBytes reads an encoded string from the Buffer. -// This is the format used for the proto2 string type. -func (p *Buffer) DecodeStringBytes() (s string, err error) { - buf, err := p.DecodeRawBytes(false) - if err != nil { - return - } - return string(buf), nil -} - -// Skip the next item in the buffer. Its wire type is decoded and presented as an argument. -// If the protocol buffer has extensions, and the field matches, add it as an extension. -// Otherwise, if the XXX_unrecognized field exists, append the skipped data there. -func (o *Buffer) skipAndSave(t reflect.Type, tag, wire int, base structPointer, unrecField field) error { - oi := o.index - - err := o.skip(t, tag, wire) - if err != nil { - return err - } - - if !unrecField.IsValid() { - return nil - } - - ptr := structPointer_Bytes(base, unrecField) - - // Add the skipped field to struct field - obuf := o.buf - - o.buf = *ptr - o.EncodeVarint(uint64(tag<<3 | wire)) - *ptr = append(o.buf, obuf[oi:o.index]...) - - o.buf = obuf - - return nil -} - -// Skip the next item in the buffer. Its wire type is decoded and presented as an argument. -func (o *Buffer) skip(t reflect.Type, tag, wire int) error { - - var u uint64 - var err error - - switch wire { - case WireVarint: - _, err = o.DecodeVarint() - case WireFixed64: - _, err = o.DecodeFixed64() - case WireBytes: - _, err = o.DecodeRawBytes(false) - case WireFixed32: - _, err = o.DecodeFixed32() - case WireStartGroup: - for { - u, err = o.DecodeVarint() - if err != nil { - break - } - fwire := int(u & 0x7) - if fwire == WireEndGroup { - break - } - ftag := int(u >> 3) - err = o.skip(t, ftag, fwire) - if err != nil { - break - } - } - default: - err = fmt.Errorf("proto: can't skip unknown wire type %d for %s", wire, t) - } - return err -} - -// Unmarshaler is the interface representing objects that can -// unmarshal themselves. The method should reset the receiver before -// decoding starts. The argument points to data that may be -// overwritten, so implementations should not keep references to the -// buffer. -type Unmarshaler interface { - Unmarshal([]byte) error -} - -// Unmarshal parses the protocol buffer representation in buf and places the -// decoded result in pb. If the struct underlying pb does not match -// the data in buf, the results can be unpredictable. -// -// Unmarshal resets pb before starting to unmarshal, so any -// existing data in pb is always removed. Use UnmarshalMerge -// to preserve and append to existing data. -func Unmarshal(buf []byte, pb Message) error { - pb.Reset() - return UnmarshalMerge(buf, pb) -} - -// UnmarshalMerge parses the protocol buffer representation in buf and -// writes the decoded result to pb. If the struct underlying pb does not match -// the data in buf, the results can be unpredictable. -// -// UnmarshalMerge merges into existing data in pb. -// Most code should use Unmarshal instead. -func UnmarshalMerge(buf []byte, pb Message) error { - // If the object can unmarshal itself, let it. - if u, ok := pb.(Unmarshaler); ok { - return u.Unmarshal(buf) - } - return NewBuffer(buf).Unmarshal(pb) -} - -// Unmarshal parses the protocol buffer representation in the -// Buffer and places the decoded result in pb. If the struct -// underlying pb does not match the data in the buffer, the results can be -// unpredictable. -func (p *Buffer) Unmarshal(pb Message) error { - // If the object can unmarshal itself, let it. - if u, ok := pb.(Unmarshaler); ok { - err := u.Unmarshal(p.buf[p.index:]) - p.index = len(p.buf) - return err - } - - typ, base, err := getbase(pb) - if err != nil { - return err - } - - err = p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), false, base) - - if collectStats { - stats.Decode++ - } - - return err -} - -// unmarshalType does the work of unmarshaling a structure. -func (o *Buffer) unmarshalType(st reflect.Type, prop *StructProperties, is_group bool, base structPointer) error { - var state errorState - required, reqFields := prop.reqCount, uint64(0) - - var err error - for err == nil && o.index < len(o.buf) { - oi := o.index - var u uint64 - u, err = o.DecodeVarint() - if err != nil { - break - } - wire := int(u & 0x7) - if wire == WireEndGroup { - if is_group { - return nil // input is satisfied - } - return fmt.Errorf("proto: %s: wiretype end group for non-group", st) - } - tag := int(u >> 3) - if tag <= 0 { - return fmt.Errorf("proto: %s: illegal tag %d (wire type %d)", st, tag, wire) - } - fieldnum, ok := prop.decoderTags.get(tag) - if !ok { - // Maybe it's an extension? - if prop.extendable { - if e := structPointer_Interface(base, st).(extendableProto); isExtensionField(e, int32(tag)) { - if err = o.skip(st, tag, wire); err == nil { - if ee, ok := e.(extensionsMap); ok { - ext := ee.ExtensionMap()[int32(tag)] // may be missing - ext.enc = append(ext.enc, o.buf[oi:o.index]...) - ee.ExtensionMap()[int32(tag)] = ext - } else if ee, ok := e.(extensionsBytes); ok { - ext := ee.GetExtensions() - *ext = append(*ext, o.buf[oi:o.index]...) - } - } - continue - } - } - err = o.skipAndSave(st, tag, wire, base, prop.unrecField) - continue - } - p := prop.Prop[fieldnum] - - if p.dec == nil { - fmt.Fprintf(os.Stderr, "proto: no protobuf decoder for %s.%s\n", st, st.Field(fieldnum).Name) - continue - } - dec := p.dec - if wire != WireStartGroup && wire != p.WireType { - if wire == WireBytes && p.packedDec != nil { - // a packable field - dec = p.packedDec - } else { - err = fmt.Errorf("proto: bad wiretype for field %s.%s: got wiretype %d, want %d", st, st.Field(fieldnum).Name, wire, p.WireType) - continue - } - } - decErr := dec(o, p, base) - if decErr != nil && !state.shouldContinue(decErr, p) { - err = decErr - } - if err == nil && p.Required { - // Successfully decoded a required field. - if tag <= 64 { - // use bitmap for fields 1-64 to catch field reuse. - var mask uint64 = 1 << uint64(tag-1) - if reqFields&mask == 0 { - // new required field - reqFields |= mask - required-- - } - } else { - // This is imprecise. It can be fooled by a required field - // with a tag > 64 that is encoded twice; that's very rare. - // A fully correct implementation would require allocating - // a data structure, which we would like to avoid. - required-- - } - } - } - if err == nil { - if is_group { - return io.ErrUnexpectedEOF - } - if state.err != nil { - return state.err - } - if required > 0 { - // Not enough information to determine the exact field. If we use extra - // CPU, we could determine the field only if the missing required field - // has a tag <= 64 and we check reqFields. - return &RequiredNotSetError{"{Unknown}"} - } - } - return err -} - -// Individual type decoders -// For each, -// u is the decoded value, -// v is a pointer to the field (pointer) in the struct - -// Sizes of the pools to allocate inside the Buffer. -// The goal is modest amortization and allocation -// on at least 16-byte boundaries. -const ( - boolPoolSize = 16 - uint32PoolSize = 8 - uint64PoolSize = 4 -) - -// Decode a bool. -func (o *Buffer) dec_bool(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - if len(o.bools) == 0 { - o.bools = make([]bool, boolPoolSize) - } - o.bools[0] = u != 0 - *structPointer_Bool(base, p.field) = &o.bools[0] - o.bools = o.bools[1:] - return nil -} - -// Decode an int32. -func (o *Buffer) dec_int32(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word32_Set(structPointer_Word32(base, p.field), o, uint32(u)) - return nil -} - -// Decode an int64. -func (o *Buffer) dec_int64(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word64_Set(structPointer_Word64(base, p.field), o, u) - return nil -} - -// Decode a string. -func (o *Buffer) dec_string(p *Properties, base structPointer) error { - s, err := o.DecodeStringBytes() - if err != nil { - return err - } - sp := new(string) - *sp = s - *structPointer_String(base, p.field) = sp - return nil -} - -// Decode a slice of bytes ([]byte). -func (o *Buffer) dec_slice_byte(p *Properties, base structPointer) error { - b, err := o.DecodeRawBytes(true) - if err != nil { - return err - } - *structPointer_Bytes(base, p.field) = b - return nil -} - -// Decode a slice of bools ([]bool). -func (o *Buffer) dec_slice_bool(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - v := structPointer_BoolSlice(base, p.field) - *v = append(*v, u != 0) - return nil -} - -// Decode a slice of bools ([]bool) in packed format. -func (o *Buffer) dec_slice_packed_bool(p *Properties, base structPointer) error { - v := structPointer_BoolSlice(base, p.field) - - nn, err := o.DecodeVarint() - if err != nil { - return err - } - nb := int(nn) // number of bytes of encoded bools - - y := *v - for i := 0; i < nb; i++ { - u, err := p.valDec(o) - if err != nil { - return err - } - y = append(y, u != 0) - } - - *v = y - return nil -} - -// Decode a slice of int32s ([]int32). -func (o *Buffer) dec_slice_int32(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - structPointer_Word32Slice(base, p.field).Append(uint32(u)) - return nil -} - -// Decode a slice of int32s ([]int32) in packed format. -func (o *Buffer) dec_slice_packed_int32(p *Properties, base structPointer) error { - v := structPointer_Word32Slice(base, p.field) - - nn, err := o.DecodeVarint() - if err != nil { - return err - } - nb := int(nn) // number of bytes of encoded int32s - - fin := o.index + nb - if fin < o.index { - return errOverflow - } - for o.index < fin { - u, err := p.valDec(o) - if err != nil { - return err - } - v.Append(uint32(u)) - } - return nil -} - -// Decode a slice of int64s ([]int64). -func (o *Buffer) dec_slice_int64(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - - structPointer_Word64Slice(base, p.field).Append(u) - return nil -} - -// Decode a slice of int64s ([]int64) in packed format. -func (o *Buffer) dec_slice_packed_int64(p *Properties, base structPointer) error { - v := structPointer_Word64Slice(base, p.field) - - nn, err := o.DecodeVarint() - if err != nil { - return err - } - nb := int(nn) // number of bytes of encoded int64s - - fin := o.index + nb - if fin < o.index { - return errOverflow - } - for o.index < fin { - u, err := p.valDec(o) - if err != nil { - return err - } - v.Append(u) - } - return nil -} - -// Decode a slice of strings ([]string). -func (o *Buffer) dec_slice_string(p *Properties, base structPointer) error { - s, err := o.DecodeStringBytes() - if err != nil { - return err - } - v := structPointer_StringSlice(base, p.field) - *v = append(*v, s) - return nil -} - -// Decode a slice of slice of bytes ([][]byte). -func (o *Buffer) dec_slice_slice_byte(p *Properties, base structPointer) error { - b, err := o.DecodeRawBytes(true) - if err != nil { - return err - } - v := structPointer_BytesSlice(base, p.field) - *v = append(*v, b) - return nil -} - -// Decode a group. -func (o *Buffer) dec_struct_group(p *Properties, base structPointer) error { - bas := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(bas) { - // allocate new nested message - bas = toStructPointer(reflect.New(p.stype)) - structPointer_SetStructPointer(base, p.field, bas) - } - return o.unmarshalType(p.stype, p.sprop, true, bas) -} - -// Decode an embedded message. -func (o *Buffer) dec_struct_message(p *Properties, base structPointer) (err error) { - raw, e := o.DecodeRawBytes(false) - if e != nil { - return e - } - - bas := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(bas) { - // allocate new nested message - bas = toStructPointer(reflect.New(p.stype)) - structPointer_SetStructPointer(base, p.field, bas) - } - - // If the object can unmarshal itself, let it. - if p.isUnmarshaler { - iv := structPointer_Interface(bas, p.stype) - return iv.(Unmarshaler).Unmarshal(raw) - } - - obuf := o.buf - oi := o.index - o.buf = raw - o.index = 0 - - err = o.unmarshalType(p.stype, p.sprop, false, bas) - o.buf = obuf - o.index = oi - - return err -} - -// Decode a slice of embedded messages. -func (o *Buffer) dec_slice_struct_message(p *Properties, base structPointer) error { - return o.dec_slice_struct(p, false, base) -} - -// Decode a slice of embedded groups. -func (o *Buffer) dec_slice_struct_group(p *Properties, base structPointer) error { - return o.dec_slice_struct(p, true, base) -} - -// Decode a slice of structs ([]*struct). -func (o *Buffer) dec_slice_struct(p *Properties, is_group bool, base structPointer) error { - v := reflect.New(p.stype) - bas := toStructPointer(v) - structPointer_StructPointerSlice(base, p.field).Append(bas) - - if is_group { - err := o.unmarshalType(p.stype, p.sprop, is_group, bas) - return err - } - - raw, err := o.DecodeRawBytes(false) - if err != nil { - return err - } - - // If the object can unmarshal itself, let it. - if p.isUnmarshaler { - iv := v.Interface() - return iv.(Unmarshaler).Unmarshal(raw) - } - - obuf := o.buf - oi := o.index - o.buf = raw - o.index = 0 - - err = o.unmarshalType(p.stype, p.sprop, is_group, bas) - - o.buf = obuf - o.index = oi - - return err -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/decode_gogo.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/decode_gogo.go deleted file mode 100644 index 96161adbe89..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/decode_gogo.go +++ /dev/null @@ -1,220 +0,0 @@ -// Copyright (c) 2013, Vastech SA (PTY) LTD. All rights reserved. -// http://github.com/gogo/protobuf/gogoproto -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "reflect" -) - -// Decode a reference to a bool pointer. -func (o *Buffer) dec_ref_bool(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - if len(o.bools) == 0 { - o.bools = make([]bool, boolPoolSize) - } - o.bools[0] = u != 0 - *structPointer_RefBool(base, p.field) = o.bools[0] - o.bools = o.bools[1:] - return nil -} - -// Decode a reference to an int32 pointer. -func (o *Buffer) dec_ref_int32(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - refWord32_Set(structPointer_RefWord32(base, p.field), o, uint32(u)) - return nil -} - -// Decode a reference to an int64 pointer. -func (o *Buffer) dec_ref_int64(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - refWord64_Set(structPointer_RefWord64(base, p.field), o, u) - return nil -} - -// Decode a reference to a string pointer. -func (o *Buffer) dec_ref_string(p *Properties, base structPointer) error { - s, err := o.DecodeStringBytes() - if err != nil { - return err - } - *structPointer_RefString(base, p.field) = s - return nil -} - -// Decode a reference to a struct pointer. -func (o *Buffer) dec_ref_struct_message(p *Properties, base structPointer) (err error) { - raw, e := o.DecodeRawBytes(false) - if e != nil { - return e - } - - // If the object can unmarshal itself, let it. - if p.isUnmarshaler { - panic("not supported, since this is a pointer receiver") - } - - obuf := o.buf - oi := o.index - o.buf = raw - o.index = 0 - - bas := structPointer_FieldPointer(base, p.field) - - err = o.unmarshalType(p.stype, p.sprop, false, bas) - o.buf = obuf - o.index = oi - - return err -} - -// Decode a slice of references to struct pointers ([]struct). -func (o *Buffer) dec_slice_ref_struct(p *Properties, is_group bool, base structPointer) error { - newBas := appendStructPointer(base, p.field, p.sstype) - - if is_group { - panic("not supported, maybe in future, if requested.") - } - - raw, err := o.DecodeRawBytes(false) - if err != nil { - return err - } - - // If the object can unmarshal itself, let it. - if p.isUnmarshaler { - panic("not supported, since this is not a pointer receiver.") - } - - obuf := o.buf - oi := o.index - o.buf = raw - o.index = 0 - - err = o.unmarshalType(p.stype, p.sprop, is_group, newBas) - - o.buf = obuf - o.index = oi - - return err -} - -// Decode a slice of references to struct pointers. -func (o *Buffer) dec_slice_ref_struct_message(p *Properties, base structPointer) error { - return o.dec_slice_ref_struct(p, false, base) -} - -func setPtrCustomType(base structPointer, f field, v interface{}) { - if v == nil { - return - } - structPointer_SetStructPointer(base, f, structPointer(reflect.ValueOf(v).Pointer())) -} - -func setCustomType(base structPointer, f field, value interface{}) { - if value == nil { - return - } - v := reflect.ValueOf(value).Elem() - t := reflect.TypeOf(value).Elem() - kind := t.Kind() - switch kind { - case reflect.Slice: - slice := reflect.MakeSlice(t, v.Len(), v.Cap()) - reflect.Copy(slice, v) - oldHeader := structPointer_GetSliceHeader(base, f) - oldHeader.Data = slice.Pointer() - oldHeader.Len = v.Len() - oldHeader.Cap = v.Cap() - default: - l := 1 - size := reflect.TypeOf(value).Elem().Size() - if kind == reflect.Array { - l = reflect.TypeOf(value).Elem().Len() - size = reflect.TypeOf(value).Size() - } - total := int(size) * l - structPointer_Copy(toStructPointer(reflect.ValueOf(value)), structPointer_Add(base, f), total) - } -} - -func (o *Buffer) dec_custom_bytes(p *Properties, base structPointer) error { - b, err := o.DecodeRawBytes(true) - if err != nil { - return err - } - i := reflect.New(p.ctype.Elem()).Interface() - custom := (i).(Unmarshaler) - if err := custom.Unmarshal(b); err != nil { - return err - } - setPtrCustomType(base, p.field, custom) - return nil -} - -func (o *Buffer) dec_custom_ref_bytes(p *Properties, base structPointer) error { - b, err := o.DecodeRawBytes(true) - if err != nil { - return err - } - i := reflect.New(p.ctype).Interface() - custom := (i).(Unmarshaler) - if err := custom.Unmarshal(b); err != nil { - return err - } - if custom != nil { - setCustomType(base, p.field, custom) - } - return nil -} - -// Decode a slice of bytes ([]byte) into a slice of custom types. -func (o *Buffer) dec_custom_slice_bytes(p *Properties, base structPointer) error { - b, err := o.DecodeRawBytes(true) - if err != nil { - return err - } - i := reflect.New(p.ctype.Elem()).Interface() - custom := (i).(Unmarshaler) - if err := custom.Unmarshal(b); err != nil { - return err - } - newBas := appendStructPointer(base, p.field, p.ctype) - - setCustomType(newBas, 0, custom) - - return nil -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/encode.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/encode.go deleted file mode 100644 index cbe4242e007..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/encode.go +++ /dev/null @@ -1,1054 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Routines for encoding data into the wire format for protocol buffers. - */ - -import ( - "errors" - "fmt" - "reflect" - "sort" -) - -// RequiredNotSetError is the error returned if Marshal is called with -// a protocol buffer struct whose required fields have not -// all been initialized. It is also the error returned if Unmarshal is -// called with an encoded protocol buffer that does not include all the -// required fields. -// -// When printed, RequiredNotSetError reports the first unset required field in a -// message. If the field cannot be precisely determined, it is reported as -// "{Unknown}". -type RequiredNotSetError struct { - field string -} - -func (e *RequiredNotSetError) Error() string { - return fmt.Sprintf("proto: required field %q not set", e.field) -} - -var ( - // ErrRepeatedHasNil is the error returned if Marshal is called with - // a struct with a repeated field containing a nil element. - ErrRepeatedHasNil = errors.New("proto: repeated field has nil element") - - // ErrNil is the error returned if Marshal is called with nil. - ErrNil = errors.New("proto: Marshal called with nil") -) - -// The fundamental encoders that put bytes on the wire. -// Those that take integer types all accept uint64 and are -// therefore of type valueEncoder. - -const maxVarintBytes = 10 // maximum length of a varint - -// EncodeVarint returns the varint encoding of x. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -// Not used by the package itself, but helpful to clients -// wishing to use the same encoding. -func EncodeVarint(x uint64) []byte { - var buf [maxVarintBytes]byte - var n int - for n = 0; x > 127; n++ { - buf[n] = 0x80 | uint8(x&0x7F) - x >>= 7 - } - buf[n] = uint8(x) - n++ - return buf[0:n] -} - -// EncodeVarint writes a varint-encoded integer to the Buffer. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func (p *Buffer) EncodeVarint(x uint64) error { - for x >= 1<<7 { - p.buf = append(p.buf, uint8(x&0x7f|0x80)) - x >>= 7 - } - p.buf = append(p.buf, uint8(x)) - return nil -} - -func sizeVarint(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n -} - -// EncodeFixed64 writes a 64-bit integer to the Buffer. -// This is the format for the -// fixed64, sfixed64, and double protocol buffer types. -func (p *Buffer) EncodeFixed64(x uint64) error { - p.buf = append(p.buf, - uint8(x), - uint8(x>>8), - uint8(x>>16), - uint8(x>>24), - uint8(x>>32), - uint8(x>>40), - uint8(x>>48), - uint8(x>>56)) - return nil -} - -func sizeFixed64(x uint64) int { - return 8 -} - -// EncodeFixed32 writes a 32-bit integer to the Buffer. -// This is the format for the -// fixed32, sfixed32, and float protocol buffer types. -func (p *Buffer) EncodeFixed32(x uint64) error { - p.buf = append(p.buf, - uint8(x), - uint8(x>>8), - uint8(x>>16), - uint8(x>>24)) - return nil -} - -func sizeFixed32(x uint64) int { - return 4 -} - -// EncodeZigzag64 writes a zigzag-encoded 64-bit integer -// to the Buffer. -// This is the format used for the sint64 protocol buffer type. -func (p *Buffer) EncodeZigzag64(x uint64) error { - // use signed number to get arithmetic right shift. - return p.EncodeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func sizeZigzag64(x uint64) int { - return sizeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -// EncodeZigzag32 writes a zigzag-encoded 32-bit integer -// to the Buffer. -// This is the format used for the sint32 protocol buffer type. -func (p *Buffer) EncodeZigzag32(x uint64) error { - // use signed number to get arithmetic right shift. - return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) -} - -func sizeZigzag32(x uint64) int { - return sizeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) -} - -// EncodeRawBytes writes a count-delimited byte buffer to the Buffer. -// This is the format used for the bytes protocol buffer -// type and for embedded messages. -func (p *Buffer) EncodeRawBytes(b []byte) error { - p.EncodeVarint(uint64(len(b))) - p.buf = append(p.buf, b...) - return nil -} - -func sizeRawBytes(b []byte) int { - return sizeVarint(uint64(len(b))) + - len(b) -} - -// EncodeStringBytes writes an encoded string to the Buffer. -// This is the format used for the proto2 string type. -func (p *Buffer) EncodeStringBytes(s string) error { - p.EncodeVarint(uint64(len(s))) - p.buf = append(p.buf, s...) - return nil -} - -func sizeStringBytes(s string) int { - return sizeVarint(uint64(len(s))) + - len(s) -} - -// Marshaler is the interface representing objects that can marshal themselves. -type Marshaler interface { - Marshal() ([]byte, error) -} - -// Marshal takes the protocol buffer -// and encodes it into the wire format, returning the data. -func Marshal(pb Message) ([]byte, error) { - // Can the object marshal itself? - if m, ok := pb.(Marshaler); ok { - return m.Marshal() - } - p := NewBuffer(nil) - err := p.Marshal(pb) - var state errorState - if err != nil && !state.shouldContinue(err, nil) { - return nil, err - } - if p.buf == nil && err == nil { - // Return a non-nil slice on success. - return []byte{}, nil - } - return p.buf, err -} - -// Marshal takes the protocol buffer -// and encodes it into the wire format, writing the result to the -// Buffer. -func (p *Buffer) Marshal(pb Message) error { - // Can the object marshal itself? - if m, ok := pb.(Marshaler); ok { - data, err := m.Marshal() - if err != nil { - return err - } - p.buf = append(p.buf, data...) - return nil - } - - t, base, err := getbase(pb) - if structPointer_IsNil(base) { - return ErrNil - } - if err == nil { - err = p.enc_struct(GetProperties(t.Elem()), base) - } - - if collectStats { - stats.Encode++ - } - - return err -} - -// Size returns the encoded size of a protocol buffer. -func Size(pb Message) (n int) { - // Can the object marshal itself? If so, Size is slow. - // TODO: add Size to Marshaler, or add a Sizer interface. - if m, ok := pb.(Marshaler); ok { - b, _ := m.Marshal() - return len(b) - } - - t, base, err := getbase(pb) - if structPointer_IsNil(base) { - return 0 - } - if err == nil { - n = size_struct(GetProperties(t.Elem()), base) - } - - if collectStats { - stats.Size++ - } - - return -} - -// Individual type encoders. - -// Encode a bool. -func (o *Buffer) enc_bool(p *Properties, base structPointer) error { - v := *structPointer_Bool(base, p.field) - if v == nil { - return ErrNil - } - x := 0 - if *v { - x = 1 - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func size_bool(p *Properties, base structPointer) int { - v := *structPointer_Bool(base, p.field) - if v == nil { - return 0 - } - return len(p.tagcode) + 1 // each bool takes exactly one byte -} - -// Encode an int32. -func (o *Buffer) enc_int32(p *Properties, base structPointer) error { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return ErrNil - } - x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func size_int32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return 0 - } - x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -// Encode a uint32. -// Exactly the same as int32, except for no sign extension. -func (o *Buffer) enc_uint32(p *Properties, base structPointer) error { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return ErrNil - } - x := word32_Get(v) - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func size_uint32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return 0 - } - x := word32_Get(v) - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -// Encode an int64. -func (o *Buffer) enc_int64(p *Properties, base structPointer) error { - v := structPointer_Word64(base, p.field) - if word64_IsNil(v) { - return ErrNil - } - x := word64_Get(v) - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, x) - return nil -} - -func size_int64(p *Properties, base structPointer) (n int) { - v := structPointer_Word64(base, p.field) - if word64_IsNil(v) { - return 0 - } - x := word64_Get(v) - n += len(p.tagcode) - n += p.valSize(x) - return -} - -// Encode a string. -func (o *Buffer) enc_string(p *Properties, base structPointer) error { - v := *structPointer_String(base, p.field) - if v == nil { - return ErrNil - } - x := *v - o.buf = append(o.buf, p.tagcode...) - o.EncodeStringBytes(x) - return nil -} - -func size_string(p *Properties, base structPointer) (n int) { - v := *structPointer_String(base, p.field) - if v == nil { - return 0 - } - x := *v - n += len(p.tagcode) - n += sizeStringBytes(x) - return -} - -// All protocol buffer fields are nillable, but be careful. -func isNil(v reflect.Value) bool { - switch v.Kind() { - case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: - return v.IsNil() - } - return false -} - -// Encode a message struct. -func (o *Buffer) enc_struct_message(p *Properties, base structPointer) error { - var state errorState - structp := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(structp) { - return ErrNil - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, err := m.Marshal() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - return nil - } - - o.buf = append(o.buf, p.tagcode...) - return o.enc_len_struct(p.sprop, structp, &state) -} - -func size_struct_message(p *Properties, base structPointer) int { - structp := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(structp) { - return 0 - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, _ := m.Marshal() - n0 := len(p.tagcode) - n1 := sizeRawBytes(data) - return n0 + n1 - } - - n0 := len(p.tagcode) - n1 := size_struct(p.sprop, structp) - n2 := sizeVarint(uint64(n1)) // size of encoded length - return n0 + n1 + n2 -} - -// Encode a group struct. -func (o *Buffer) enc_struct_group(p *Properties, base structPointer) error { - var state errorState - b := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(b) { - return ErrNil - } - - o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) - err := o.enc_struct(p.sprop, b) - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) - return state.err -} - -func size_struct_group(p *Properties, base structPointer) (n int) { - b := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(b) { - return 0 - } - - n += sizeVarint(uint64((p.Tag << 3) | WireStartGroup)) - n += size_struct(p.sprop, b) - n += sizeVarint(uint64((p.Tag << 3) | WireEndGroup)) - return -} - -// Encode a slice of bools ([]bool). -func (o *Buffer) enc_slice_bool(p *Properties, base structPointer) error { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return ErrNil - } - for _, x := range s { - o.buf = append(o.buf, p.tagcode...) - v := uint64(0) - if x { - v = 1 - } - p.valEnc(o, v) - } - return nil -} - -func size_slice_bool(p *Properties, base structPointer) int { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return 0 - } - return l * (len(p.tagcode) + 1) // each bool takes exactly one byte -} - -// Encode a slice of bools ([]bool) in packed format. -func (o *Buffer) enc_slice_packed_bool(p *Properties, base structPointer) error { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(l)) // each bool takes exactly one byte - for _, x := range s { - v := uint64(0) - if x { - v = 1 - } - p.valEnc(o, v) - } - return nil -} - -func size_slice_packed_bool(p *Properties, base structPointer) (n int) { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return 0 - } - n += len(p.tagcode) - n += sizeVarint(uint64(l)) - n += l // each bool takes exactly one byte - return -} - -// Encode a slice of bytes ([]byte). -func (o *Buffer) enc_slice_byte(p *Properties, base structPointer) error { - s := *structPointer_Bytes(base, p.field) - if s == nil { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(s) - return nil -} - -func size_slice_byte(p *Properties, base structPointer) (n int) { - s := *structPointer_Bytes(base, p.field) - if s == nil { - return 0 - } - n += len(p.tagcode) - n += sizeRawBytes(s) - return -} - -// Encode a slice of int32s ([]int32). -func (o *Buffer) enc_slice_int32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - p.valEnc(o, uint64(x)) - } - return nil -} - -func size_slice_int32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - for i := 0; i < l; i++ { - n += len(p.tagcode) - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - n += p.valSize(uint64(x)) - } - return -} - -// Encode a slice of int32s ([]int32) in packed format. -func (o *Buffer) enc_slice_packed_int32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - // TODO: Reuse a Buffer. - buf := NewBuffer(nil) - for i := 0; i < l; i++ { - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - p.valEnc(buf, uint64(x)) - } - - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(len(buf.buf))) - o.buf = append(o.buf, buf.buf...) - return nil -} - -func size_slice_packed_int32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - var bufSize int - for i := 0; i < l; i++ { - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - bufSize += p.valSize(uint64(x)) - } - - n += len(p.tagcode) - n += sizeVarint(uint64(bufSize)) - n += bufSize - return -} - -// Encode a slice of uint32s ([]uint32). -// Exactly the same as int32, except for no sign extension. -func (o *Buffer) enc_slice_uint32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - x := s.Index(i) - p.valEnc(o, uint64(x)) - } - return nil -} - -func size_slice_uint32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - for i := 0; i < l; i++ { - n += len(p.tagcode) - x := s.Index(i) - n += p.valSize(uint64(x)) - } - return -} - -// Encode a slice of uint32s ([]uint32) in packed format. -// Exactly the same as int32, except for no sign extension. -func (o *Buffer) enc_slice_packed_uint32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - // TODO: Reuse a Buffer. - buf := NewBuffer(nil) - for i := 0; i < l; i++ { - p.valEnc(buf, uint64(s.Index(i))) - } - - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(len(buf.buf))) - o.buf = append(o.buf, buf.buf...) - return nil -} - -func size_slice_packed_uint32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - var bufSize int - for i := 0; i < l; i++ { - bufSize += p.valSize(uint64(s.Index(i))) - } - - n += len(p.tagcode) - n += sizeVarint(uint64(bufSize)) - n += bufSize - return -} - -// Encode a slice of int64s ([]int64). -func (o *Buffer) enc_slice_int64(p *Properties, base structPointer) error { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, s.Index(i)) - } - return nil -} - -func size_slice_int64(p *Properties, base structPointer) (n int) { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - for i := 0; i < l; i++ { - n += len(p.tagcode) - n += p.valSize(s.Index(i)) - } - return -} - -// Encode a slice of int64s ([]int64) in packed format. -func (o *Buffer) enc_slice_packed_int64(p *Properties, base structPointer) error { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - // TODO: Reuse a Buffer. - buf := NewBuffer(nil) - for i := 0; i < l; i++ { - p.valEnc(buf, s.Index(i)) - } - - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(len(buf.buf))) - o.buf = append(o.buf, buf.buf...) - return nil -} - -func size_slice_packed_int64(p *Properties, base structPointer) (n int) { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - var bufSize int - for i := 0; i < l; i++ { - bufSize += p.valSize(s.Index(i)) - } - - n += len(p.tagcode) - n += sizeVarint(uint64(bufSize)) - n += bufSize - return -} - -// Encode a slice of slice of bytes ([][]byte). -func (o *Buffer) enc_slice_slice_byte(p *Properties, base structPointer) error { - ss := *structPointer_BytesSlice(base, p.field) - l := len(ss) - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(ss[i]) - } - return nil -} - -func size_slice_slice_byte(p *Properties, base structPointer) (n int) { - ss := *structPointer_BytesSlice(base, p.field) - l := len(ss) - if l == 0 { - return 0 - } - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - n += sizeRawBytes(ss[i]) - } - return -} - -// Encode a slice of strings ([]string). -func (o *Buffer) enc_slice_string(p *Properties, base structPointer) error { - ss := *structPointer_StringSlice(base, p.field) - l := len(ss) - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - o.EncodeStringBytes(ss[i]) - } - return nil -} - -func size_slice_string(p *Properties, base structPointer) (n int) { - ss := *structPointer_StringSlice(base, p.field) - l := len(ss) - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - n += sizeStringBytes(ss[i]) - } - return -} - -// Encode a slice of message structs ([]*struct). -func (o *Buffer) enc_slice_struct_message(p *Properties, base structPointer) error { - var state errorState - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - - for i := 0; i < l; i++ { - structp := s.Index(i) - if structPointer_IsNil(structp) { - return ErrRepeatedHasNil - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, err := m.Marshal() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - continue - } - - o.buf = append(o.buf, p.tagcode...) - err := o.enc_len_struct(p.sprop, structp, &state) - if err != nil && !state.shouldContinue(err, nil) { - if err == ErrNil { - return ErrRepeatedHasNil - } - return err - } - } - return state.err -} - -func size_slice_struct_message(p *Properties, base structPointer) (n int) { - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - structp := s.Index(i) - if structPointer_IsNil(structp) { - return // return the size up to this point - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, _ := m.Marshal() - n += len(p.tagcode) - n += sizeRawBytes(data) - continue - } - - n0 := size_struct(p.sprop, structp) - n1 := sizeVarint(uint64(n0)) // size of encoded length - n += n0 + n1 - } - return -} - -// Encode a slice of group structs ([]*struct). -func (o *Buffer) enc_slice_struct_group(p *Properties, base structPointer) error { - var state errorState - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - - for i := 0; i < l; i++ { - b := s.Index(i) - if structPointer_IsNil(b) { - return ErrRepeatedHasNil - } - - o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) - - err := o.enc_struct(p.sprop, b) - - if err != nil && !state.shouldContinue(err, nil) { - if err == ErrNil { - return ErrRepeatedHasNil - } - return err - } - - o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) - } - return state.err -} - -func size_slice_struct_group(p *Properties, base structPointer) (n int) { - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - - n += l * sizeVarint(uint64((p.Tag<<3)|WireStartGroup)) - n += l * sizeVarint(uint64((p.Tag<<3)|WireEndGroup)) - for i := 0; i < l; i++ { - b := s.Index(i) - if structPointer_IsNil(b) { - return // return size up to this point - } - - n += size_struct(p.sprop, b) - } - return -} - -// Encode an extension map. -func (o *Buffer) enc_map(p *Properties, base structPointer) error { - v := *structPointer_ExtMap(base, p.field) - if err := encodeExtensionMap(v); err != nil { - return err - } - // Fast-path for common cases: zero or one extensions. - if len(v) <= 1 { - for _, e := range v { - o.buf = append(o.buf, e.enc...) - } - return nil - } - - // Sort keys to provide a deterministic encoding. - keys := make([]int, 0, len(v)) - for k := range v { - keys = append(keys, int(k)) - } - sort.Ints(keys) - - for _, k := range keys { - o.buf = append(o.buf, v[int32(k)].enc...) - } - return nil -} - -func size_map(p *Properties, base structPointer) int { - v := *structPointer_ExtMap(base, p.field) - return sizeExtensionMap(v) -} - -// Encode a struct. -func (o *Buffer) enc_struct(prop *StructProperties, base structPointer) error { - var state errorState - // Encode fields in tag order so that decoders may use optimizations - // that depend on the ordering. - // https://developers.google.com/protocol-buffers/docs/encoding#order - for _, i := range prop.order { - p := prop.Prop[i] - if p.enc != nil { - err := p.enc(o, p, base) - if err != nil { - if err == ErrNil { - if p.Required && state.err == nil { - state.err = &RequiredNotSetError{p.Name} - } - } else if !state.shouldContinue(err, p) { - return err - } - } - } - } - - // Add unrecognized fields at the end. - if prop.unrecField.IsValid() { - v := *structPointer_Bytes(base, prop.unrecField) - if len(v) > 0 { - o.buf = append(o.buf, v...) - } - } - - return state.err -} - -func size_struct(prop *StructProperties, base structPointer) (n int) { - for _, i := range prop.order { - p := prop.Prop[i] - if p.size != nil { - n += p.size(p, base) - } - } - - // Add unrecognized fields at the end. - if prop.unrecField.IsValid() { - v := *structPointer_Bytes(base, prop.unrecField) - n += len(v) - } - - return -} - -var zeroes [20]byte // longer than any conceivable sizeVarint - -// Encode a struct, preceded by its encoded length (as a varint). -func (o *Buffer) enc_len_struct(prop *StructProperties, base structPointer, state *errorState) error { - iLen := len(o.buf) - o.buf = append(o.buf, 0, 0, 0, 0) // reserve four bytes for length - iMsg := len(o.buf) - err := o.enc_struct(prop, base) - if err != nil && !state.shouldContinue(err, nil) { - return err - } - lMsg := len(o.buf) - iMsg - lLen := sizeVarint(uint64(lMsg)) - switch x := lLen - (iMsg - iLen); { - case x > 0: // actual length is x bytes larger than the space we reserved - // Move msg x bytes right. - o.buf = append(o.buf, zeroes[:x]...) - copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) - case x < 0: // actual length is x bytes smaller than the space we reserved - // Move msg x bytes left. - copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) - o.buf = o.buf[:len(o.buf)+x] // x is negative - } - // Encode the length in the reserved space. - o.buf = o.buf[:iLen] - o.EncodeVarint(uint64(lMsg)) - o.buf = o.buf[:len(o.buf)+lMsg] - return state.err -} - -// errorState maintains the first error that occurs and updates that error -// with additional context. -type errorState struct { - err error -} - -// shouldContinue reports whether encoding should continue upon encountering the -// given error. If the error is RequiredNotSetError, shouldContinue returns true -// and, if this is the first appearance of that error, remembers it for future -// reporting. -// -// If prop is not nil, it may update any error with additional context about the -// field with the error. -func (s *errorState) shouldContinue(err error, prop *Properties) bool { - // Ignore unset required fields. - reqNotSet, ok := err.(*RequiredNotSetError) - if !ok { - return false - } - if s.err == nil { - if prop != nil { - err = &RequiredNotSetError{prop.Name + "." + reqNotSet.field} - } - s.err = err - } - return true -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/encode_gogo.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/encode_gogo.go deleted file mode 100644 index 66bc0bd535e..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/encode_gogo.go +++ /dev/null @@ -1,383 +0,0 @@ -// Extensions for Protocol Buffers to create more go like structures. -// -// Copyright (c) 2013, Vastech SA (PTY) LTD. All rights reserved. -// http://github.com/gogo/protobuf/gogoproto -// -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// http://github.com/golang/protobuf/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "reflect" -) - -type Sizer interface { - Size() int -} - -func (o *Buffer) enc_ext_slice_byte(p *Properties, base structPointer) error { - s := *structPointer_Bytes(base, p.field) - if s == nil { - return ErrNil - } - o.buf = append(o.buf, s...) - return nil -} - -func size_ext_slice_byte(p *Properties, base structPointer) (n int) { - s := *structPointer_Bytes(base, p.field) - if s == nil { - return 0 - } - n += len(s) - return -} - -// Encode a reference to bool pointer. -func (o *Buffer) enc_ref_bool(p *Properties, base structPointer) error { - v := structPointer_RefBool(base, p.field) - if v == nil { - return ErrNil - } - x := 0 - if *v { - x = 1 - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func size_ref_bool(p *Properties, base structPointer) int { - v := structPointer_RefBool(base, p.field) - if v == nil { - return 0 - } - return len(p.tagcode) + 1 // each bool takes exactly one byte -} - -// Encode a reference to int32 pointer. -func (o *Buffer) enc_ref_int32(p *Properties, base structPointer) error { - v := structPointer_RefWord32(base, p.field) - if refWord32_IsNil(v) { - return ErrNil - } - x := int32(refWord32_Get(v)) - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func size_ref_int32(p *Properties, base structPointer) (n int) { - v := structPointer_RefWord32(base, p.field) - if refWord32_IsNil(v) { - return 0 - } - x := int32(refWord32_Get(v)) - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -func (o *Buffer) enc_ref_uint32(p *Properties, base structPointer) error { - v := structPointer_RefWord32(base, p.field) - if refWord32_IsNil(v) { - return ErrNil - } - x := refWord32_Get(v) - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func size_ref_uint32(p *Properties, base structPointer) (n int) { - v := structPointer_RefWord32(base, p.field) - if refWord32_IsNil(v) { - return 0 - } - x := refWord32_Get(v) - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -// Encode a reference to an int64 pointer. -func (o *Buffer) enc_ref_int64(p *Properties, base structPointer) error { - v := structPointer_RefWord64(base, p.field) - if refWord64_IsNil(v) { - return ErrNil - } - x := refWord64_Get(v) - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, x) - return nil -} - -func size_ref_int64(p *Properties, base structPointer) (n int) { - v := structPointer_RefWord64(base, p.field) - if refWord64_IsNil(v) { - return 0 - } - x := refWord64_Get(v) - n += len(p.tagcode) - n += p.valSize(x) - return -} - -// Encode a reference to a string pointer. -func (o *Buffer) enc_ref_string(p *Properties, base structPointer) error { - v := structPointer_RefString(base, p.field) - if v == nil { - return ErrNil - } - x := *v - o.buf = append(o.buf, p.tagcode...) - o.EncodeStringBytes(x) - return nil -} - -func size_ref_string(p *Properties, base structPointer) (n int) { - v := structPointer_RefString(base, p.field) - if v == nil { - return 0 - } - x := *v - n += len(p.tagcode) - n += sizeStringBytes(x) - return -} - -// Encode a reference to a message struct. -func (o *Buffer) enc_ref_struct_message(p *Properties, base structPointer) error { - var state errorState - structp := structPointer_GetRefStructPointer(base, p.field) - if structPointer_IsNil(structp) { - return ErrNil - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, err := m.Marshal() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - return nil - } - - o.buf = append(o.buf, p.tagcode...) - return o.enc_len_struct(p.sprop, structp, &state) -} - -//TODO this is only copied, please fix this -func size_ref_struct_message(p *Properties, base structPointer) int { - structp := structPointer_GetRefStructPointer(base, p.field) - if structPointer_IsNil(structp) { - return 0 - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, _ := m.Marshal() - n0 := len(p.tagcode) - n1 := sizeRawBytes(data) - return n0 + n1 - } - - n0 := len(p.tagcode) - n1 := size_struct(p.sprop, structp) - n2 := sizeVarint(uint64(n1)) // size of encoded length - return n0 + n1 + n2 -} - -// Encode a slice of references to message struct pointers ([]struct). -func (o *Buffer) enc_slice_ref_struct_message(p *Properties, base structPointer) error { - var state errorState - ss := structPointer_GetStructPointer(base, p.field) - ss1 := structPointer_GetRefStructPointer(ss, field(0)) - size := p.stype.Size() - l := structPointer_Len(base, p.field) - for i := 0; i < l; i++ { - structp := structPointer_Add(ss1, field(uintptr(i)*size)) - if structPointer_IsNil(structp) { - return ErrRepeatedHasNil - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, err := m.Marshal() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - continue - } - - o.buf = append(o.buf, p.tagcode...) - err := o.enc_len_struct(p.sprop, structp, &state) - if err != nil && !state.shouldContinue(err, nil) { - if err == ErrNil { - return ErrRepeatedHasNil - } - return err - } - - } - return state.err -} - -//TODO this is only copied, please fix this -func size_slice_ref_struct_message(p *Properties, base structPointer) (n int) { - ss := structPointer_GetStructPointer(base, p.field) - ss1 := structPointer_GetRefStructPointer(ss, field(0)) - size := p.stype.Size() - l := structPointer_Len(base, p.field) - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - structp := structPointer_Add(ss1, field(uintptr(i)*size)) - if structPointer_IsNil(structp) { - return // return the size up to this point - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, _ := m.Marshal() - n += len(p.tagcode) - n += sizeRawBytes(data) - continue - } - - n0 := size_struct(p.sprop, structp) - n1 := sizeVarint(uint64(n0)) // size of encoded length - n += n0 + n1 - } - return -} - -func (o *Buffer) enc_custom_bytes(p *Properties, base structPointer) error { - i := structPointer_InterfaceRef(base, p.field, p.ctype) - if i == nil { - return ErrNil - } - custom := i.(Marshaler) - data, err := custom.Marshal() - if err != nil { - return err - } - if data == nil { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - return nil -} - -func size_custom_bytes(p *Properties, base structPointer) (n int) { - n += len(p.tagcode) - i := structPointer_InterfaceRef(base, p.field, p.ctype) - if i == nil { - return 0 - } - custom := i.(Marshaler) - data, _ := custom.Marshal() - n += sizeRawBytes(data) - return -} - -func (o *Buffer) enc_custom_ref_bytes(p *Properties, base structPointer) error { - custom := structPointer_InterfaceAt(base, p.field, p.ctype).(Marshaler) - data, err := custom.Marshal() - if err != nil { - return err - } - if data == nil { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - return nil -} - -func size_custom_ref_bytes(p *Properties, base structPointer) (n int) { - n += len(p.tagcode) - i := structPointer_InterfaceAt(base, p.field, p.ctype) - if i == nil { - return 0 - } - custom := i.(Marshaler) - data, _ := custom.Marshal() - n += sizeRawBytes(data) - return -} - -func (o *Buffer) enc_custom_slice_bytes(p *Properties, base structPointer) error { - inter := structPointer_InterfaceRef(base, p.field, p.ctype) - if inter == nil { - return ErrNil - } - slice := reflect.ValueOf(inter) - l := slice.Len() - for i := 0; i < l; i++ { - v := slice.Index(i) - custom := v.Interface().(Marshaler) - data, err := custom.Marshal() - if err != nil { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - } - return nil -} - -func size_custom_slice_bytes(p *Properties, base structPointer) (n int) { - inter := structPointer_InterfaceRef(base, p.field, p.ctype) - if inter == nil { - return 0 - } - slice := reflect.ValueOf(inter) - l := slice.Len() - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - v := slice.Index(i) - custom := v.Interface().(Marshaler) - data, _ := custom.Marshal() - n += sizeRawBytes(data) - } - return -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/equal.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/equal.go deleted file mode 100644 index ebdfdcaf743..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/equal.go +++ /dev/null @@ -1,241 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Protocol buffer comparison. -// TODO: MessageSet. - -package proto - -import ( - "bytes" - "log" - "reflect" - "strings" -) - -/* -Equal returns true iff protocol buffers a and b are equal. -The arguments must both be pointers to protocol buffer structs. - -Equality is defined in this way: - - Two messages are equal iff they are the same type, - corresponding fields are equal, unknown field sets - are equal, and extensions sets are equal. - - Two set scalar fields are equal iff their values are equal. - If the fields are of a floating-point type, remember that - NaN != x for all x, including NaN. - - Two repeated fields are equal iff their lengths are the same, - and their corresponding elements are equal (a "bytes" field, - although represented by []byte, is not a repeated field) - - Two unset fields are equal. - - Two unknown field sets are equal if their current - encoded state is equal. - - Two extension sets are equal iff they have corresponding - elements that are pairwise equal. - - Every other combination of things are not equal. - -The return value is undefined if a and b are not protocol buffers. -*/ -func Equal(a, b Message) bool { - if a == nil || b == nil { - return a == b - } - v1, v2 := reflect.ValueOf(a), reflect.ValueOf(b) - if v1.Type() != v2.Type() { - return false - } - if v1.Kind() == reflect.Ptr { - if v1.IsNil() { - return v2.IsNil() - } - if v2.IsNil() { - return false - } - v1, v2 = v1.Elem(), v2.Elem() - } - if v1.Kind() != reflect.Struct { - return false - } - return equalStruct(v1, v2) -} - -// v1 and v2 are known to have the same type. -func equalStruct(v1, v2 reflect.Value) bool { - for i := 0; i < v1.NumField(); i++ { - f := v1.Type().Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - f1, f2 := v1.Field(i), v2.Field(i) - if f.Type.Kind() == reflect.Ptr { - if n1, n2 := f1.IsNil(), f2.IsNil(); n1 && n2 { - // both unset - continue - } else if n1 != n2 { - // set/unset mismatch - return false - } - b1, ok := f1.Interface().(raw) - if ok { - b2 := f2.Interface().(raw) - // RawMessage - if !bytes.Equal(b1.Bytes(), b2.Bytes()) { - return false - } - continue - } - f1, f2 = f1.Elem(), f2.Elem() - } - if !equalAny(f1, f2) { - return false - } - } - - if em1 := v1.FieldByName("XXX_extensions"); em1.IsValid() { - em2 := v2.FieldByName("XXX_extensions") - if !equalExtensions(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) { - return false - } - } - - uf := v1.FieldByName("XXX_unrecognized") - if !uf.IsValid() { - return true - } - - u1 := uf.Bytes() - u2 := v2.FieldByName("XXX_unrecognized").Bytes() - if !bytes.Equal(u1, u2) { - return false - } - - return true -} - -// v1 and v2 are known to have the same type. -func equalAny(v1, v2 reflect.Value) bool { - if v1.Type() == protoMessageType { - m1, _ := v1.Interface().(Message) - m2, _ := v2.Interface().(Message) - return Equal(m1, m2) - } - switch v1.Kind() { - case reflect.Bool: - return v1.Bool() == v2.Bool() - case reflect.Float32, reflect.Float64: - return v1.Float() == v2.Float() - case reflect.Int32, reflect.Int64: - return v1.Int() == v2.Int() - case reflect.Ptr: - return equalAny(v1.Elem(), v2.Elem()) - case reflect.Slice: - if v1.Type().Elem().Kind() == reflect.Uint8 { - // short circuit: []byte - if v1.IsNil() != v2.IsNil() { - return false - } - return bytes.Equal(v1.Interface().([]byte), v2.Interface().([]byte)) - } - - if v1.Len() != v2.Len() { - return false - } - for i := 0; i < v1.Len(); i++ { - if !equalAny(v1.Index(i), v2.Index(i)) { - return false - } - } - return true - case reflect.String: - return v1.Interface().(string) == v2.Interface().(string) - case reflect.Struct: - return equalStruct(v1, v2) - case reflect.Uint32, reflect.Uint64: - return v1.Uint() == v2.Uint() - } - - // unknown type, so not a protocol buffer - log.Printf("proto: don't know how to compare %v", v1) - return false -} - -// base is the struct type that the extensions are based on. -// em1 and em2 are extension maps. -func equalExtensions(base reflect.Type, em1, em2 map[int32]Extension) bool { - if len(em1) != len(em2) { - return false - } - - for extNum, e1 := range em1 { - e2, ok := em2[extNum] - if !ok { - return false - } - - m1, m2 := e1.value, e2.value - - if m1 != nil && m2 != nil { - // Both are unencoded. - if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2)) { - return false - } - continue - } - - // At least one is encoded. To do a semantically correct comparison - // we need to unmarshal them first. - var desc *ExtensionDesc - if m := extensionMaps[base]; m != nil { - desc = m[extNum] - } - if desc == nil { - log.Printf("proto: don't know how to compare extension %d of %v", extNum, base) - continue - } - var err error - if m1 == nil { - m1, err = decodeExtension(e1.enc, desc) - } - if m2 == nil && err == nil { - m2, err = decodeExtension(e2.enc, desc) - } - if err != nil { - // The encoded form is invalid. - log.Printf("proto: badly encoded extension %d of %v: %v", extNum, base, err) - return false - } - if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2)) { - return false - } - } - - return true -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/equal_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/equal_test.go deleted file mode 100644 index bb5bd38df73..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/equal_test.go +++ /dev/null @@ -1,166 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto_test - -import ( - "testing" - - pb "./testdata" - . "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" -) - -// Four identical base messages. -// The init function adds extensions to some of them. -var messageWithoutExtension = &pb.MyMessage{Count: Int32(7)} -var messageWithExtension1a = &pb.MyMessage{Count: Int32(7)} -var messageWithExtension1b = &pb.MyMessage{Count: Int32(7)} -var messageWithExtension2 = &pb.MyMessage{Count: Int32(7)} - -// Two messages with non-message extensions. -var messageWithInt32Extension1 = &pb.MyMessage{Count: Int32(8)} -var messageWithInt32Extension2 = &pb.MyMessage{Count: Int32(8)} - -func init() { - ext1 := &pb.Ext{Data: String("Kirk")} - ext2 := &pb.Ext{Data: String("Picard")} - - // messageWithExtension1a has ext1, but never marshals it. - if err := SetExtension(messageWithExtension1a, pb.E_Ext_More, ext1); err != nil { - panic("SetExtension on 1a failed: " + err.Error()) - } - - // messageWithExtension1b is the unmarshaled form of messageWithExtension1a. - if err := SetExtension(messageWithExtension1b, pb.E_Ext_More, ext1); err != nil { - panic("SetExtension on 1b failed: " + err.Error()) - } - buf, err := Marshal(messageWithExtension1b) - if err != nil { - panic("Marshal of 1b failed: " + err.Error()) - } - messageWithExtension1b.Reset() - if err := Unmarshal(buf, messageWithExtension1b); err != nil { - panic("Unmarshal of 1b failed: " + err.Error()) - } - - // messageWithExtension2 has ext2. - if err := SetExtension(messageWithExtension2, pb.E_Ext_More, ext2); err != nil { - panic("SetExtension on 2 failed: " + err.Error()) - } - - if err := SetExtension(messageWithInt32Extension1, pb.E_Ext_Number, Int32(23)); err != nil { - panic("SetExtension on Int32-1 failed: " + err.Error()) - } - if err := SetExtension(messageWithInt32Extension1, pb.E_Ext_Number, Int32(24)); err != nil { - panic("SetExtension on Int32-2 failed: " + err.Error()) - } -} - -var EqualTests = []struct { - desc string - a, b Message - exp bool -}{ - {"different types", &pb.GoEnum{}, &pb.GoTestField{}, false}, - {"equal empty", &pb.GoEnum{}, &pb.GoEnum{}, true}, - {"nil vs nil", nil, nil, true}, - {"typed nil vs typed nil", (*pb.GoEnum)(nil), (*pb.GoEnum)(nil), true}, - {"typed nil vs empty", (*pb.GoEnum)(nil), &pb.GoEnum{}, false}, - {"different typed nil", (*pb.GoEnum)(nil), (*pb.GoTestField)(nil), false}, - - {"one set field, one unset field", &pb.GoTestField{Label: String("foo")}, &pb.GoTestField{}, false}, - {"one set field zero, one unset field", &pb.GoTest{Param: Int32(0)}, &pb.GoTest{}, false}, - {"different set fields", &pb.GoTestField{Label: String("foo")}, &pb.GoTestField{Label: String("bar")}, false}, - {"equal set", &pb.GoTestField{Label: String("foo")}, &pb.GoTestField{Label: String("foo")}, true}, - - {"repeated, one set", &pb.GoTest{F_Int32Repeated: []int32{2, 3}}, &pb.GoTest{}, false}, - {"repeated, different length", &pb.GoTest{F_Int32Repeated: []int32{2, 3}}, &pb.GoTest{F_Int32Repeated: []int32{2}}, false}, - {"repeated, different value", &pb.GoTest{F_Int32Repeated: []int32{2}}, &pb.GoTest{F_Int32Repeated: []int32{3}}, false}, - {"repeated, equal", &pb.GoTest{F_Int32Repeated: []int32{2, 4}}, &pb.GoTest{F_Int32Repeated: []int32{2, 4}}, true}, - {"repeated, nil equal nil", &pb.GoTest{F_Int32Repeated: nil}, &pb.GoTest{F_Int32Repeated: nil}, true}, - {"repeated, nil equal empty", &pb.GoTest{F_Int32Repeated: nil}, &pb.GoTest{F_Int32Repeated: []int32{}}, true}, - {"repeated, empty equal nil", &pb.GoTest{F_Int32Repeated: []int32{}}, &pb.GoTest{F_Int32Repeated: nil}, true}, - - { - "nested, different", - &pb.GoTest{RequiredField: &pb.GoTestField{Label: String("foo")}}, - &pb.GoTest{RequiredField: &pb.GoTestField{Label: String("bar")}}, - false, - }, - { - "nested, equal", - &pb.GoTest{RequiredField: &pb.GoTestField{Label: String("wow")}}, - &pb.GoTest{RequiredField: &pb.GoTestField{Label: String("wow")}}, - true, - }, - - {"bytes", &pb.OtherMessage{Value: []byte("foo")}, &pb.OtherMessage{Value: []byte("foo")}, true}, - {"bytes, empty", &pb.OtherMessage{Value: []byte{}}, &pb.OtherMessage{Value: []byte{}}, true}, - {"bytes, empty vs nil", &pb.OtherMessage{Value: []byte{}}, &pb.OtherMessage{Value: nil}, false}, - { - "repeated bytes", - &pb.MyMessage{RepBytes: [][]byte{[]byte("sham"), []byte("wow")}}, - &pb.MyMessage{RepBytes: [][]byte{[]byte("sham"), []byte("wow")}}, - true, - }, - - {"extension vs. no extension", messageWithoutExtension, messageWithExtension1a, false}, - {"extension vs. same extension", messageWithExtension1a, messageWithExtension1b, true}, - {"extension vs. different extension", messageWithExtension1a, messageWithExtension2, false}, - - {"int32 extension vs. itself", messageWithInt32Extension1, messageWithInt32Extension1, true}, - {"int32 extension vs. a different int32", messageWithInt32Extension1, messageWithInt32Extension2, false}, - - { - "message with group", - &pb.MyMessage{ - Count: Int32(1), - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: Int32(5), - }, - }, - &pb.MyMessage{ - Count: Int32(1), - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: Int32(5), - }, - }, - true, - }, -} - -func TestEqual(t *testing.T) { - for _, tc := range EqualTests { - if res := Equal(tc.a, tc.b); res != tc.exp { - t.Errorf("%v: Equal(%v, %v) = %v, want %v", tc.desc, tc.a, tc.b, res, tc.exp) - } - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/extensions.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/extensions.go deleted file mode 100644 index fa1b98450e6..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/extensions.go +++ /dev/null @@ -1,472 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Types and routines for supporting protocol buffer extensions. - */ - -import ( - "errors" - "reflect" - "strconv" - "sync" -) - -// ErrMissingExtension is the error returned by GetExtension if the named extension is not in the message. -var ErrMissingExtension = errors.New("proto: missing extension") - -// ExtensionRange represents a range of message extensions for a protocol buffer. -// Used in code generated by the protocol compiler. -type ExtensionRange struct { - Start, End int32 // both inclusive -} - -// extendableProto is an interface implemented by any protocol buffer that may be extended. -type extendableProto interface { - Message - ExtensionRangeArray() []ExtensionRange -} - -type extensionsMap interface { - extendableProto - ExtensionMap() map[int32]Extension -} - -type extensionsBytes interface { - extendableProto - GetExtensions() *[]byte -} - -var extendableProtoType = reflect.TypeOf((*extendableProto)(nil)).Elem() - -// ExtensionDesc represents an extension specification. -// Used in generated code from the protocol compiler. -type ExtensionDesc struct { - ExtendedType Message // nil pointer to the type that is being extended - ExtensionType interface{} // nil pointer to the extension type - Field int32 // field number - Name string // fully-qualified name of extension, for text formatting - Tag string // protobuf tag style -} - -func (ed *ExtensionDesc) repeated() bool { - t := reflect.TypeOf(ed.ExtensionType) - return t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 -} - -// Extension represents an extension in a message. -type Extension struct { - // When an extension is stored in a message using SetExtension - // only desc and value are set. When the message is marshaled - // enc will be set to the encoded form of the message. - // - // When a message is unmarshaled and contains extensions, each - // extension will have only enc set. When such an extension is - // accessed using GetExtension (or GetExtensions) desc and value - // will be set. - desc *ExtensionDesc - value interface{} - enc []byte -} - -// SetRawExtension is for testing only. -func SetRawExtension(base extendableProto, id int32, b []byte) { - if ebase, ok := base.(extensionsMap); ok { - ebase.ExtensionMap()[id] = Extension{enc: b} - } else if ebase, ok := base.(extensionsBytes); ok { - clearExtension(base, id) - ext := ebase.GetExtensions() - *ext = append(*ext, b...) - } else { - panic("unreachable") - } -} - -// isExtensionField returns true iff the given field number is in an extension range. -func isExtensionField(pb extendableProto, field int32) bool { - for _, er := range pb.ExtensionRangeArray() { - if er.Start <= field && field <= er.End { - return true - } - } - return false -} - -// checkExtensionTypes checks that the given extension is valid for pb. -func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error { - // Check the extended type. - if a, b := reflect.TypeOf(pb), reflect.TypeOf(extension.ExtendedType); a != b { - return errors.New("proto: bad extended type; " + b.String() + " does not extend " + a.String()) - } - // Check the range. - if !isExtensionField(pb, extension.Field) { - return errors.New("proto: bad extension number; not in declared ranges") - } - return nil -} - -// extPropKey is sufficient to uniquely identify an extension. -type extPropKey struct { - base reflect.Type - field int32 -} - -var extProp = struct { - sync.RWMutex - m map[extPropKey]*Properties -}{ - m: make(map[extPropKey]*Properties), -} - -func extensionProperties(ed *ExtensionDesc) *Properties { - key := extPropKey{base: reflect.TypeOf(ed.ExtendedType), field: ed.Field} - - extProp.RLock() - if prop, ok := extProp.m[key]; ok { - extProp.RUnlock() - return prop - } - extProp.RUnlock() - - extProp.Lock() - defer extProp.Unlock() - // Check again. - if prop, ok := extProp.m[key]; ok { - return prop - } - - prop := new(Properties) - prop.Init(reflect.TypeOf(ed.ExtensionType), "unknown_name", ed.Tag, nil) - extProp.m[key] = prop - return prop -} - -// encodeExtensionMap encodes any unmarshaled (unencoded) extensions in m. -func encodeExtensionMap(m map[int32]Extension) error { - for k, e := range m { - err := encodeExtension(&e) - if err != nil { - return err - } - m[k] = e - } - return nil -} - -func encodeExtension(e *Extension) error { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - return nil - } - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - et := reflect.TypeOf(e.desc.ExtensionType) - props := extensionProperties(e.desc) - - p := NewBuffer(nil) - // If e.value has type T, the encoder expects a *struct{ X T }. - // Pass a *T with a zero field and hope it all works out. - x := reflect.New(et) - x.Elem().Set(reflect.ValueOf(e.value)) - if err := props.enc(p, props, toStructPointer(x)); err != nil { - return err - } - e.enc = p.buf - return nil -} - -func sizeExtensionMap(m map[int32]Extension) (n int) { - for _, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - n += len(e.enc) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - et := reflect.TypeOf(e.desc.ExtensionType) - props := extensionProperties(e.desc) - - // If e.value has type T, the encoder expects a *struct{ X T }. - // Pass a *T with a zero field and hope it all works out. - x := reflect.New(et) - x.Elem().Set(reflect.ValueOf(e.value)) - n += props.size(props, toStructPointer(x)) - } - return -} - -// HasExtension returns whether the given extension is present in pb. -func HasExtension(pb extendableProto, extension *ExtensionDesc) bool { - // TODO: Check types, field numbers, etc.? - if epb, doki := pb.(extensionsMap); doki { - _, ok := epb.ExtensionMap()[extension.Field] - return ok - } else if epb, doki := pb.(extensionsBytes); doki { - ext := epb.GetExtensions() - buf := *ext - o := 0 - for o < len(buf) { - tag, n := DecodeVarint(buf[o:]) - fieldNum := int32(tag >> 3) - if int32(fieldNum) == extension.Field { - return true - } - wireType := int(tag & 0x7) - o += n - l, err := size(buf[o:], wireType) - if err != nil { - return false - } - o += l - } - return false - } - panic("unreachable") -} - -func deleteExtension(pb extensionsBytes, theFieldNum int32, offset int) int { - ext := pb.GetExtensions() - for offset < len(*ext) { - tag, n1 := DecodeVarint((*ext)[offset:]) - fieldNum := int32(tag >> 3) - wireType := int(tag & 0x7) - n2, err := size((*ext)[offset+n1:], wireType) - if err != nil { - panic(err) - } - newOffset := offset + n1 + n2 - if fieldNum == theFieldNum { - *ext = append((*ext)[:offset], (*ext)[newOffset:]...) - return offset - } - offset = newOffset - } - return -1 -} - -func clearExtension(pb extendableProto, fieldNum int32) { - if epb, doki := pb.(extensionsMap); doki { - delete(epb.ExtensionMap(), fieldNum) - } else if epb, doki := pb.(extensionsBytes); doki { - offset := 0 - for offset != -1 { - offset = deleteExtension(epb, fieldNum, offset) - } - } else { - panic("unreachable") - } -} - -// ClearExtension removes the given extension from pb. -func ClearExtension(pb extendableProto, extension *ExtensionDesc) { - // TODO: Check types, field numbers, etc.? - clearExtension(pb, extension.Field) -} - -// GetExtension parses and returns the given extension of pb. -// If the extension is not present it returns ErrMissingExtension. -func GetExtension(pb extendableProto, extension *ExtensionDesc) (interface{}, error) { - if err := checkExtensionTypes(pb, extension); err != nil { - return nil, err - } - - if epb, doki := pb.(extensionsMap); doki { - emap := epb.ExtensionMap() - e, ok := emap[extension.Field] - if !ok { - return nil, ErrMissingExtension - } - if e.value != nil { - // Already decoded. Check the descriptor, though. - if e.desc != extension { - // This shouldn't happen. If it does, it means that - // GetExtension was called twice with two different - // descriptors with the same field number. - return nil, errors.New("proto: descriptor conflict") - } - return e.value, nil - } - - v, err := decodeExtension(e.enc, extension) - if err != nil { - return nil, err - } - - // Remember the decoded version and drop the encoded version. - // That way it is safe to mutate what we return. - e.value = v - e.desc = extension - e.enc = nil - emap[extension.Field] = e - return e.value, nil - } else if epb, doki := pb.(extensionsBytes); doki { - ext := epb.GetExtensions() - o := 0 - for o < len(*ext) { - tag, n := DecodeVarint((*ext)[o:]) - fieldNum := int32(tag >> 3) - wireType := int(tag & 0x7) - l, err := size((*ext)[o+n:], wireType) - if err != nil { - return nil, err - } - if int32(fieldNum) == extension.Field { - v, err := decodeExtension((*ext)[o:o+n+l], extension) - if err != nil { - return nil, err - } - return v, nil - } - o += n + l - } - } - panic("unreachable") -} - -// decodeExtension decodes an extension encoded in b. -func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { - o := NewBuffer(b) - - t := reflect.TypeOf(extension.ExtensionType) - rep := extension.repeated() - - props := extensionProperties(extension) - - // t is a pointer to a struct, pointer to basic type or a slice. - // Allocate a "field" to store the pointer/slice itself; the - // pointer/slice will be stored here. We pass - // the address of this field to props.dec. - // This passes a zero field and a *t and lets props.dec - // interpret it as a *struct{ x t }. - value := reflect.New(t).Elem() - - for { - // Discard wire type and field number varint. It isn't needed. - if _, err := o.DecodeVarint(); err != nil { - return nil, err - } - - if err := props.dec(o, props, toStructPointer(value.Addr())); err != nil { - return nil, err - } - - if !rep || o.index >= len(o.buf) { - break - } - } - return value.Interface(), nil -} - -// GetExtensions returns a slice of the extensions present in pb that are also listed in es. -// The returned slice has the same length as es; missing extensions will appear as nil elements. -func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { - epb, ok := pb.(extendableProto) - if !ok { - err = errors.New("proto: not an extendable proto") - return - } - extensions = make([]interface{}, len(es)) - for i, e := range es { - extensions[i], err = GetExtension(epb, e) - if err == ErrMissingExtension { - err = nil - } - if err != nil { - return - } - } - return -} - -// SetExtension sets the specified extension of pb to the specified value. -func SetExtension(pb extendableProto, extension *ExtensionDesc, value interface{}) error { - if err := checkExtensionTypes(pb, extension); err != nil { - return err - } - typ := reflect.TypeOf(extension.ExtensionType) - if typ != reflect.TypeOf(value) { - return errors.New("proto: bad extension value type") - } - return setExtension(pb, extension, value) -} - -func setExtension(pb extendableProto, extension *ExtensionDesc, value interface{}) error { - if epb, doki := pb.(extensionsMap); doki { - epb.ExtensionMap()[extension.Field] = Extension{desc: extension, value: value} - } else if epb, doki := pb.(extensionsBytes); doki { - ClearExtension(pb, extension) - ext := epb.GetExtensions() - et := reflect.TypeOf(extension.ExtensionType) - props := extensionProperties(extension) - p := NewBuffer(nil) - x := reflect.New(et) - x.Elem().Set(reflect.ValueOf(value)) - if err := props.enc(p, props, toStructPointer(x)); err != nil { - return err - } - *ext = append(*ext, p.buf...) - } - return nil -} - -// A global registry of extensions. -// The generated code will register the generated descriptors by calling RegisterExtension. - -var extensionMaps = make(map[reflect.Type]map[int32]*ExtensionDesc) - -// RegisterExtension is called from the generated code. -func RegisterExtension(desc *ExtensionDesc) { - st := reflect.TypeOf(desc.ExtendedType).Elem() - m := extensionMaps[st] - if m == nil { - m = make(map[int32]*ExtensionDesc) - extensionMaps[st] = m - } - if _, ok := m[desc.Field]; ok { - panic("proto: duplicate extension registered: " + st.String() + " " + strconv.Itoa(int(desc.Field))) - } - m[desc.Field] = desc -} - -// RegisteredExtensions returns a map of the registered extensions of a -// protocol buffer struct, indexed by the extension number. -// The argument pb should be a nil pointer to the struct type. -func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc { - return extensionMaps[reflect.TypeOf(pb).Elem()] -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/extensions_gogo.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/extensions_gogo.go deleted file mode 100644 index bd55fb68b61..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/extensions_gogo.go +++ /dev/null @@ -1,221 +0,0 @@ -// Copyright (c) 2013, Vastech SA (PTY) LTD. All rights reserved. -// http://github.com/gogo/protobuf/gogoproto -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "bytes" - "errors" - "fmt" - "reflect" - "sort" - "strings" -) - -func GetBoolExtension(pb extendableProto, extension *ExtensionDesc, ifnotset bool) bool { - if reflect.ValueOf(pb).IsNil() { - return ifnotset - } - value, err := GetExtension(pb, extension) - if err != nil { - return ifnotset - } - if value == nil { - return ifnotset - } - if value.(*bool) == nil { - return ifnotset - } - return *(value.(*bool)) -} - -func (this *Extension) Equal(that *Extension) bool { - return bytes.Equal(this.enc, that.enc) -} - -func SizeOfExtensionMap(m map[int32]Extension) (n int) { - return sizeExtensionMap(m) -} - -type sortableMapElem struct { - field int32 - ext Extension -} - -func newSortableExtensionsFromMap(m map[int32]Extension) sortableExtensions { - s := make(sortableExtensions, 0, len(m)) - for k, v := range m { - s = append(s, &sortableMapElem{field: k, ext: v}) - } - return s -} - -type sortableExtensions []*sortableMapElem - -func (this sortableExtensions) Len() int { return len(this) } - -func (this sortableExtensions) Swap(i, j int) { this[i], this[j] = this[j], this[i] } - -func (this sortableExtensions) Less(i, j int) bool { return this[i].field < this[j].field } - -func (this sortableExtensions) String() string { - sort.Sort(this) - ss := make([]string, len(this)) - for i := range this { - ss[i] = fmt.Sprintf("%d: %v", this[i].field, this[i].ext) - } - return "map[" + strings.Join(ss, ",") + "]" -} - -func StringFromExtensionsMap(m map[int32]Extension) string { - return newSortableExtensionsFromMap(m).String() -} - -func StringFromExtensionsBytes(ext []byte) string { - m, err := BytesToExtensionsMap(ext) - if err != nil { - panic(err) - } - return StringFromExtensionsMap(m) -} - -func EncodeExtensionMap(m map[int32]Extension, data []byte) (n int, err error) { - if err := encodeExtensionMap(m); err != nil { - return 0, err - } - keys := make([]int, 0, len(m)) - for k := range m { - keys = append(keys, int(k)) - } - sort.Ints(keys) - for _, k := range keys { - n += copy(data[n:], m[int32(k)].enc) - } - return n, nil -} - -func GetRawExtension(m map[int32]Extension, id int32) ([]byte, error) { - if m[id].value == nil || m[id].desc == nil { - return m[id].enc, nil - } - if err := encodeExtensionMap(m); err != nil { - return nil, err - } - return m[id].enc, nil -} - -func size(buf []byte, wire int) (int, error) { - switch wire { - case WireVarint: - _, n := DecodeVarint(buf) - return n, nil - case WireFixed64: - return 8, nil - case WireBytes: - v, n := DecodeVarint(buf) - return int(v) + n, nil - case WireFixed32: - return 4, nil - case WireStartGroup: - offset := 0 - for { - u, n := DecodeVarint(buf[offset:]) - fwire := int(u & 0x7) - offset += n - if fwire == WireEndGroup { - return offset, nil - } - s, err := size(buf[offset:], wire) - if err != nil { - return 0, err - } - offset += s - } - } - return 0, fmt.Errorf("proto: can't get size for unknown wire type %d", wire) -} - -func BytesToExtensionsMap(buf []byte) (map[int32]Extension, error) { - m := make(map[int32]Extension) - i := 0 - for i < len(buf) { - tag, n := DecodeVarint(buf[i:]) - if n <= 0 { - return nil, fmt.Errorf("unable to decode varint") - } - fieldNum := int32(tag >> 3) - wireType := int(tag & 0x7) - l, err := size(buf[i+n:], wireType) - if err != nil { - return nil, err - } - end := i + int(l) + n - m[int32(fieldNum)] = Extension{enc: buf[i:end]} - i = end - } - return m, nil -} - -func NewExtension(e []byte) Extension { - ee := Extension{enc: make([]byte, len(e))} - copy(ee.enc, e) - return ee -} - -func (this Extension) GoString() string { - if this.enc == nil { - if err := encodeExtension(&this); err != nil { - panic(err) - } - } - return fmt.Sprintf("proto.NewExtension(%#v)", this.enc) -} - -func SetUnsafeExtension(pb extendableProto, fieldNum int32, value interface{}) error { - typ := reflect.TypeOf(pb).Elem() - ext, ok := extensionMaps[typ] - if !ok { - return fmt.Errorf("proto: bad extended type; %s is not extendable", typ.String()) - } - desc, ok := ext[fieldNum] - if !ok { - return errors.New("proto: bad extension number; not in declared ranges") - } - return setExtension(pb, desc, value) -} - -func GetUnsafeExtension(pb extendableProto, fieldNum int32) (interface{}, error) { - typ := reflect.TypeOf(pb).Elem() - ext, ok := extensionMaps[typ] - if !ok { - return nil, fmt.Errorf("proto: bad extended type; %s is not extendable", typ.String()) - } - desc, ok := ext[fieldNum] - if !ok { - return nil, fmt.Errorf("unregistered field number %d", fieldNum) - } - return GetExtension(pb, desc) -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/extensions_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/extensions_test.go deleted file mode 100644 index dbab85cc06c..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/extensions_test.go +++ /dev/null @@ -1,94 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2014 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto_test - -import ( - "testing" - - pb "./testdata" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" -) - -func TestGetExtensionsWithMissingExtensions(t *testing.T) { - msg := &pb.MyMessage{} - ext1 := &pb.Ext{} - if err := proto.SetExtension(msg, pb.E_Ext_More, ext1); err != nil { - t.Fatalf("Could not set ext1: %s", ext1) - } - exts, err := proto.GetExtensions(msg, []*proto.ExtensionDesc{ - pb.E_Ext_More, - pb.E_Ext_Text, - }) - if err != nil { - t.Fatalf("GetExtensions() failed: %s", err) - } - if exts[0] != ext1 { - t.Errorf("ext1 not in returned extensions: %T %v", exts[0], exts[0]) - } - if exts[1] != nil { - t.Errorf("ext2 in returned extensions: %T %v", exts[1], exts[1]) - } -} - -func TestGetExtensionStability(t *testing.T) { - check := func(m *pb.MyMessage) bool { - ext1, err := proto.GetExtension(m, pb.E_Ext_More) - if err != nil { - t.Fatalf("GetExtension() failed: %s", err) - } - ext2, err := proto.GetExtension(m, pb.E_Ext_More) - if err != nil { - t.Fatalf("GetExtension() failed: %s", err) - } - return ext1 == ext2 - } - msg := &pb.MyMessage{Count: proto.Int32(4)} - ext0 := &pb.Ext{} - if err := proto.SetExtension(msg, pb.E_Ext_More, ext0); err != nil { - t.Fatalf("Could not set ext1: %s", ext0) - } - if !check(msg) { - t.Errorf("GetExtension() not stable before marshaling") - } - bb, err := proto.Marshal(msg) - if err != nil { - t.Fatalf("Marshal() failed: %s", err) - } - msg1 := &pb.MyMessage{} - err = proto.Unmarshal(bb, msg1) - if err != nil { - t.Fatalf("Unmarshal() failed: %s", err) - } - if !check(msg1) { - t.Errorf("GetExtension() not stable after unmarshaling") - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/lib.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/lib.go deleted file mode 100644 index 11dfccf6ec7..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/lib.go +++ /dev/null @@ -1,740 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/* - Package proto converts data structures to and from the wire format of - protocol buffers. It works in concert with the Go source code generated - for .proto files by the protocol compiler. - - A summary of the properties of the protocol buffer interface - for a protocol buffer variable v: - - - Names are turned from camel_case to CamelCase for export. - - There are no methods on v to set fields; just treat - them as structure fields. - - There are getters that return a field's value if set, - and return the field's default value if unset. - The getters work even if the receiver is a nil message. - - The zero value for a struct is its correct initialization state. - All desired fields must be set before marshaling. - - A Reset() method will restore a protobuf struct to its zero state. - - Non-repeated fields are pointers to the values; nil means unset. - That is, optional or required field int32 f becomes F *int32. - - Repeated fields are slices. - - Helper functions are available to aid the setting of fields. - Helpers for getting values are superseded by the - GetFoo methods and their use is deprecated. - msg.Foo = proto.String("hello") // set field - - Constants are defined to hold the default values of all fields that - have them. They have the form Default_StructName_FieldName. - Because the getter methods handle defaulted values, - direct use of these constants should be rare. - - Enums are given type names and maps from names to values. - Enum values are prefixed with the enum's type name. Enum types have - a String method, and a Enum method to assist in message construction. - - Nested groups and enums have type names prefixed with the name of - the surrounding message type. - - Extensions are given descriptor names that start with E_, - followed by an underscore-delimited list of the nested messages - that contain it (if any) followed by the CamelCased name of the - extension field itself. HasExtension, ClearExtension, GetExtension - and SetExtension are functions for manipulating extensions. - - Marshal and Unmarshal are functions to encode and decode the wire format. - - The simplest way to describe this is to see an example. - Given file test.proto, containing - - package example; - - enum FOO { X = 17; }; - - message Test { - required string label = 1; - optional int32 type = 2 [default=77]; - repeated int64 reps = 3; - optional group OptionalGroup = 4 { - required string RequiredField = 5; - } - } - - The resulting file, test.pb.go, is: - - package example - - import "github.com/gogo/protobuf/proto" - - type FOO int32 - const ( - FOO_X FOO = 17 - ) - var FOO_name = map[int32]string{ - 17: "X", - } - var FOO_value = map[string]int32{ - "X": 17, - } - - func (x FOO) Enum() *FOO { - p := new(FOO) - *p = x - return p - } - func (x FOO) String() string { - return proto.EnumName(FOO_name, int32(x)) - } - - type Test struct { - Label *string `protobuf:"bytes,1,req,name=label" json:"label,omitempty"` - Type *int32 `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"` - Reps []int64 `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"` - Optionalgroup *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` - XXX_unrecognized []byte `json:"-"` - } - func (this *Test) Reset() { *this = Test{} } - func (this *Test) String() string { return proto.CompactTextString(this) } - const Default_Test_Type int32 = 77 - - func (this *Test) GetLabel() string { - if this != nil && this.Label != nil { - return *this.Label - } - return "" - } - - func (this *Test) GetType() int32 { - if this != nil && this.Type != nil { - return *this.Type - } - return Default_Test_Type - } - - func (this *Test) GetOptionalgroup() *Test_OptionalGroup { - if this != nil { - return this.Optionalgroup - } - return nil - } - - type Test_OptionalGroup struct { - RequiredField *string `protobuf:"bytes,5,req" json:"RequiredField,omitempty"` - XXX_unrecognized []byte `json:"-"` - } - func (this *Test_OptionalGroup) Reset() { *this = Test_OptionalGroup{} } - func (this *Test_OptionalGroup) String() string { return proto.CompactTextString(this) } - - func (this *Test_OptionalGroup) GetRequiredField() string { - if this != nil && this.RequiredField != nil { - return *this.RequiredField - } - return "" - } - - func init() { - proto.RegisterEnum("example.FOO", FOO_name, FOO_value) - } - - To create and play with a Test object: - - package main - - import ( - "log" - - "github.com/gogo/protobuf/proto" - "./example.pb" - ) - - func main() { - test := &example.Test{ - Label: proto.String("hello"), - Type: proto.Int32(17), - Optionalgroup: &example.Test_OptionalGroup{ - RequiredField: proto.String("good bye"), - }, - } - data, err := proto.Marshal(test) - if err != nil { - log.Fatal("marshaling error: ", err) - } - newTest := new(example.Test) - err = proto.Unmarshal(data, newTest) - if err != nil { - log.Fatal("unmarshaling error: ", err) - } - // Now test and newTest contain the same data. - if test.GetLabel() != newTest.GetLabel() { - log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) - } - // etc. - } -*/ -package proto - -import ( - "encoding/json" - "fmt" - "log" - "reflect" - "strconv" - "sync" -) - -// Message is implemented by generated protocol buffer messages. -type Message interface { - Reset() - String() string - ProtoMessage() -} - -// Stats records allocation details about the protocol buffer encoders -// and decoders. Useful for tuning the library itself. -type Stats struct { - Emalloc uint64 // mallocs in encode - Dmalloc uint64 // mallocs in decode - Encode uint64 // number of encodes - Decode uint64 // number of decodes - Chit uint64 // number of cache hits - Cmiss uint64 // number of cache misses - Size uint64 // number of sizes -} - -// Set to true to enable stats collection. -const collectStats = false - -var stats Stats - -// GetStats returns a copy of the global Stats structure. -func GetStats() Stats { return stats } - -// A Buffer is a buffer manager for marshaling and unmarshaling -// protocol buffers. It may be reused between invocations to -// reduce memory usage. It is not necessary to use a Buffer; -// the global functions Marshal and Unmarshal create a -// temporary Buffer and are fine for most applications. -type Buffer struct { - buf []byte // encode/decode byte stream - index int // write point - - // pools of basic types to amortize allocation. - bools []bool - uint32s []uint32 - uint64s []uint64 - - // extra pools, only used with pointer_reflect.go - int32s []int32 - int64s []int64 - float32s []float32 - float64s []float64 -} - -// NewBuffer allocates a new Buffer and initializes its internal data to -// the contents of the argument slice. -func NewBuffer(e []byte) *Buffer { - return &Buffer{buf: e} -} - -// Reset resets the Buffer, ready for marshaling a new protocol buffer. -func (p *Buffer) Reset() { - p.buf = p.buf[0:0] // for reading/writing - p.index = 0 // for reading -} - -// SetBuf replaces the internal buffer with the slice, -// ready for unmarshaling the contents of the slice. -func (p *Buffer) SetBuf(s []byte) { - p.buf = s - p.index = 0 -} - -// Bytes returns the contents of the Buffer. -func (p *Buffer) Bytes() []byte { return p.buf } - -/* - * Helper routines for simplifying the creation of optional fields of basic type. - */ - -// Bool is a helper routine that allocates a new bool value -// to store v and returns a pointer to it. -func Bool(v bool) *bool { - return &v -} - -// Int32 is a helper routine that allocates a new int32 value -// to store v and returns a pointer to it. -func Int32(v int32) *int32 { - return &v -} - -// Int is a helper routine that allocates a new int32 value -// to store v and returns a pointer to it, but unlike Int32 -// its argument value is an int. -func Int(v int) *int32 { - p := new(int32) - *p = int32(v) - return p -} - -// Int64 is a helper routine that allocates a new int64 value -// to store v and returns a pointer to it. -func Int64(v int64) *int64 { - return &v -} - -// Float32 is a helper routine that allocates a new float32 value -// to store v and returns a pointer to it. -func Float32(v float32) *float32 { - return &v -} - -// Float64 is a helper routine that allocates a new float64 value -// to store v and returns a pointer to it. -func Float64(v float64) *float64 { - return &v -} - -// Uint32 is a helper routine that allocates a new uint32 value -// to store v and returns a pointer to it. -func Uint32(v uint32) *uint32 { - p := new(uint32) - *p = v - return p -} - -// Uint64 is a helper routine that allocates a new uint64 value -// to store v and returns a pointer to it. -func Uint64(v uint64) *uint64 { - return &v -} - -// String is a helper routine that allocates a new string value -// to store v and returns a pointer to it. -func String(v string) *string { - return &v -} - -// EnumName is a helper function to simplify printing protocol buffer enums -// by name. Given an enum map and a value, it returns a useful string. -func EnumName(m map[int32]string, v int32) string { - s, ok := m[v] - if ok { - return s - } - return strconv.Itoa(int(v)) -} - -// UnmarshalJSONEnum is a helper function to simplify recovering enum int values -// from their JSON-encoded representation. Given a map from the enum's symbolic -// names to its int values, and a byte buffer containing the JSON-encoded -// value, it returns an int32 that can be cast to the enum type by the caller. -// -// The function can deal with both JSON representations, numeric and symbolic. -func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) { - if data[0] == '"' { - // New style: enums are strings. - var repr string - if err := json.Unmarshal(data, &repr); err != nil { - return -1, err - } - val, ok := m[repr] - if !ok { - return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr) - } - return val, nil - } - // Old style: enums are ints. - var val int32 - if err := json.Unmarshal(data, &val); err != nil { - return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName) - } - return val, nil -} - -// DebugPrint dumps the encoded data in b in a debugging format with a header -// including the string s. Used in testing but made available for general debugging. -func (o *Buffer) DebugPrint(s string, b []byte) { - var u uint64 - - obuf := o.buf - index := o.index - o.buf = b - o.index = 0 - depth := 0 - - fmt.Printf("\n--- %s ---\n", s) - -out: - for { - for i := 0; i < depth; i++ { - fmt.Print(" ") - } - - index := o.index - if index == len(o.buf) { - break - } - - op, err := o.DecodeVarint() - if err != nil { - fmt.Printf("%3d: fetching op err %v\n", index, err) - break out - } - tag := op >> 3 - wire := op & 7 - - switch wire { - default: - fmt.Printf("%3d: t=%3d unknown wire=%d\n", - index, tag, wire) - break out - - case WireBytes: - var r []byte - - r, err = o.DecodeRawBytes(false) - if err != nil { - break out - } - fmt.Printf("%3d: t=%3d bytes [%d]", index, tag, len(r)) - if len(r) <= 6 { - for i := 0; i < len(r); i++ { - fmt.Printf(" %.2x", r[i]) - } - } else { - for i := 0; i < 3; i++ { - fmt.Printf(" %.2x", r[i]) - } - fmt.Printf(" ..") - for i := len(r) - 3; i < len(r); i++ { - fmt.Printf(" %.2x", r[i]) - } - } - fmt.Printf("\n") - - case WireFixed32: - u, err = o.DecodeFixed32() - if err != nil { - fmt.Printf("%3d: t=%3d fix32 err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d fix32 %d\n", index, tag, u) - - case WireFixed64: - u, err = o.DecodeFixed64() - if err != nil { - fmt.Printf("%3d: t=%3d fix64 err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d fix64 %d\n", index, tag, u) - break - - case WireVarint: - u, err = o.DecodeVarint() - if err != nil { - fmt.Printf("%3d: t=%3d varint err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d varint %d\n", index, tag, u) - - case WireStartGroup: - if err != nil { - fmt.Printf("%3d: t=%3d start err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d start\n", index, tag) - depth++ - - case WireEndGroup: - depth-- - if err != nil { - fmt.Printf("%3d: t=%3d end err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d end\n", index, tag) - } - } - - if depth != 0 { - fmt.Printf("%3d: start-end not balanced %d\n", o.index, depth) - } - fmt.Printf("\n") - - o.buf = obuf - o.index = index -} - -// SetDefaults sets unset protocol buffer fields to their default values. -// It only modifies fields that are both unset and have defined defaults. -// It recursively sets default values in any non-nil sub-messages. -func SetDefaults(pb Message) { - setDefaults(reflect.ValueOf(pb), true, false) -} - -// v is a pointer to a struct. -func setDefaults(v reflect.Value, recur, zeros bool) { - v = v.Elem() - - defaultMu.RLock() - dm, ok := defaults[v.Type()] - defaultMu.RUnlock() - if !ok { - dm = buildDefaultMessage(v.Type()) - defaultMu.Lock() - defaults[v.Type()] = dm - defaultMu.Unlock() - } - - for _, sf := range dm.scalars { - f := v.Field(sf.index) - if !f.IsNil() { - // field already set - continue - } - dv := sf.value - if dv == nil && !zeros { - // no explicit default, and don't want to set zeros - continue - } - fptr := f.Addr().Interface() // **T - // TODO: Consider batching the allocations we do here. - switch sf.kind { - case reflect.Bool: - b := new(bool) - if dv != nil { - *b = dv.(bool) - } - *(fptr.(**bool)) = b - case reflect.Float32: - f := new(float32) - if dv != nil { - *f = dv.(float32) - } - *(fptr.(**float32)) = f - case reflect.Float64: - f := new(float64) - if dv != nil { - *f = dv.(float64) - } - *(fptr.(**float64)) = f - case reflect.Int32: - // might be an enum - if ft := f.Type(); ft != int32PtrType { - // enum - f.Set(reflect.New(ft.Elem())) - if dv != nil { - f.Elem().SetInt(int64(dv.(int32))) - } - } else { - // int32 field - i := new(int32) - if dv != nil { - *i = dv.(int32) - } - *(fptr.(**int32)) = i - } - case reflect.Int64: - i := new(int64) - if dv != nil { - *i = dv.(int64) - } - *(fptr.(**int64)) = i - case reflect.String: - s := new(string) - if dv != nil { - *s = dv.(string) - } - *(fptr.(**string)) = s - case reflect.Uint8: - // exceptional case: []byte - var b []byte - if dv != nil { - db := dv.([]byte) - b = make([]byte, len(db)) - copy(b, db) - } else { - b = []byte{} - } - *(fptr.(*[]byte)) = b - case reflect.Uint32: - u := new(uint32) - if dv != nil { - *u = dv.(uint32) - } - *(fptr.(**uint32)) = u - case reflect.Uint64: - u := new(uint64) - if dv != nil { - *u = dv.(uint64) - } - *(fptr.(**uint64)) = u - default: - log.Printf("proto: can't set default for field %v (sf.kind=%v)", f, sf.kind) - } - } - - for _, ni := range dm.nested { - f := v.Field(ni) - if f.IsNil() { - continue - } - // f is *T or []*T - if f.Kind() == reflect.Ptr { - setDefaults(f, recur, zeros) - } else { - for i := 0; i < f.Len(); i++ { - e := f.Index(i) - if e.IsNil() { - continue - } - setDefaults(e, recur, zeros) - } - } - } -} - -var ( - // defaults maps a protocol buffer struct type to a slice of the fields, - // with its scalar fields set to their proto-declared non-zero default values. - defaultMu sync.RWMutex - defaults = make(map[reflect.Type]defaultMessage) - - int32PtrType = reflect.TypeOf((*int32)(nil)) -) - -// defaultMessage represents information about the default values of a message. -type defaultMessage struct { - scalars []scalarField - nested []int // struct field index of nested messages -} - -type scalarField struct { - index int // struct field index - kind reflect.Kind // element type (the T in *T or []T) - value interface{} // the proto-declared default value, or nil -} - -func ptrToStruct(t reflect.Type) bool { - return t.Kind() == reflect.Ptr && t.Elem().Kind() == reflect.Struct -} - -// t is a struct type. -func buildDefaultMessage(t reflect.Type) (dm defaultMessage) { - sprop := GetProperties(t) - for _, prop := range sprop.Prop { - fi, ok := sprop.decoderTags.get(prop.Tag) - if !ok { - // XXX_unrecognized - continue - } - ft := t.Field(fi).Type - - // nested messages - if ptrToStruct(ft) || (ft.Kind() == reflect.Slice && ptrToStruct(ft.Elem())) { - dm.nested = append(dm.nested, fi) - continue - } - - sf := scalarField{ - index: fi, - kind: ft.Elem().Kind(), - } - - // scalar fields without defaults - if !prop.HasDefault { - dm.scalars = append(dm.scalars, sf) - continue - } - - // a scalar field: either *T or []byte - switch ft.Elem().Kind() { - case reflect.Bool: - x, err := strconv.ParseBool(prop.Default) - if err != nil { - log.Printf("proto: bad default bool %q: %v", prop.Default, err) - continue - } - sf.value = x - case reflect.Float32: - x, err := strconv.ParseFloat(prop.Default, 32) - if err != nil { - log.Printf("proto: bad default float32 %q: %v", prop.Default, err) - continue - } - sf.value = float32(x) - case reflect.Float64: - x, err := strconv.ParseFloat(prop.Default, 64) - if err != nil { - log.Printf("proto: bad default float64 %q: %v", prop.Default, err) - continue - } - sf.value = x - case reflect.Int32: - x, err := strconv.ParseInt(prop.Default, 10, 32) - if err != nil { - log.Printf("proto: bad default int32 %q: %v", prop.Default, err) - continue - } - sf.value = int32(x) - case reflect.Int64: - x, err := strconv.ParseInt(prop.Default, 10, 64) - if err != nil { - log.Printf("proto: bad default int64 %q: %v", prop.Default, err) - continue - } - sf.value = x - case reflect.String: - sf.value = prop.Default - case reflect.Uint8: - // []byte (not *uint8) - sf.value = []byte(prop.Default) - case reflect.Uint32: - x, err := strconv.ParseUint(prop.Default, 10, 32) - if err != nil { - log.Printf("proto: bad default uint32 %q: %v", prop.Default, err) - continue - } - sf.value = uint32(x) - case reflect.Uint64: - x, err := strconv.ParseUint(prop.Default, 10, 64) - if err != nil { - log.Printf("proto: bad default uint64 %q: %v", prop.Default, err) - continue - } - sf.value = x - default: - log.Printf("proto: unhandled def kind %v", ft.Elem().Kind()) - continue - } - - dm.scalars = append(dm.scalars, sf) - } - - return dm -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/lib_gogo.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/lib_gogo.go deleted file mode 100644 index a6c2c06b23d..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/lib_gogo.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2013, Vastech SA (PTY) LTD. All rights reserved. -// http://github.com/gogo/protobuf/gogoproto -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "encoding/json" - "strconv" -) - -func MarshalJSONEnum(m map[int32]string, value int32) ([]byte, error) { - s, ok := m[value] - if !ok { - s = strconv.Itoa(int(value)) - } - return json.Marshal(s) -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/message_set.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/message_set.go deleted file mode 100644 index 9d912bce19b..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/message_set.go +++ /dev/null @@ -1,287 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Support for message sets. - */ - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "reflect" - "sort" -) - -// ErrNoMessageTypeId occurs when a protocol buffer does not have a message type ID. -// A message type ID is required for storing a protocol buffer in a message set. -var ErrNoMessageTypeId = errors.New("proto does not have a message type ID") - -// The first two types (_MessageSet_Item and MessageSet) -// model what the protocol compiler produces for the following protocol message: -// message MessageSet { -// repeated group Item = 1 { -// required int32 type_id = 2; -// required string message = 3; -// }; -// } -// That is the MessageSet wire format. We can't use a proto to generate these -// because that would introduce a circular dependency between it and this package. -// -// When a proto1 proto has a field that looks like: -// optional message info = 3; -// the protocol compiler produces a field in the generated struct that looks like: -// Info *_proto_.MessageSet `protobuf:"bytes,3,opt,name=info"` -// The package is automatically inserted so there is no need for that proto file to -// import this package. - -type _MessageSet_Item struct { - TypeId *int32 `protobuf:"varint,2,req,name=type_id"` - Message []byte `protobuf:"bytes,3,req,name=message"` -} - -type MessageSet struct { - Item []*_MessageSet_Item `protobuf:"group,1,rep"` - XXX_unrecognized []byte - // TODO: caching? -} - -// Make sure MessageSet is a Message. -var _ Message = (*MessageSet)(nil) - -// messageTypeIder is an interface satisfied by a protocol buffer type -// that may be stored in a MessageSet. -type messageTypeIder interface { - MessageTypeId() int32 -} - -func (ms *MessageSet) find(pb Message) *_MessageSet_Item { - mti, ok := pb.(messageTypeIder) - if !ok { - return nil - } - id := mti.MessageTypeId() - for _, item := range ms.Item { - if *item.TypeId == id { - return item - } - } - return nil -} - -func (ms *MessageSet) Has(pb Message) bool { - if ms.find(pb) != nil { - return true - } - return false -} - -func (ms *MessageSet) Unmarshal(pb Message) error { - if item := ms.find(pb); item != nil { - return Unmarshal(item.Message, pb) - } - if _, ok := pb.(messageTypeIder); !ok { - return ErrNoMessageTypeId - } - return nil // TODO: return error instead? -} - -func (ms *MessageSet) Marshal(pb Message) error { - msg, err := Marshal(pb) - if err != nil { - return err - } - if item := ms.find(pb); item != nil { - // reuse existing item - item.Message = msg - return nil - } - - mti, ok := pb.(messageTypeIder) - if !ok { - return ErrNoMessageTypeId - } - - mtid := mti.MessageTypeId() - ms.Item = append(ms.Item, &_MessageSet_Item{ - TypeId: &mtid, - Message: msg, - }) - return nil -} - -func (ms *MessageSet) Reset() { *ms = MessageSet{} } -func (ms *MessageSet) String() string { return CompactTextString(ms) } -func (*MessageSet) ProtoMessage() {} - -// Support for the message_set_wire_format message option. - -func skipVarint(buf []byte) []byte { - i := 0 - for ; buf[i]&0x80 != 0; i++ { - } - return buf[i+1:] -} - -// MarshalMessageSet encodes the extension map represented by m in the message set wire format. -// It is called by generated Marshal methods on protocol buffer messages with the message_set_wire_format option. -func MarshalMessageSet(m map[int32]Extension) ([]byte, error) { - if err := encodeExtensionMap(m); err != nil { - return nil, err - } - - // Sort extension IDs to provide a deterministic encoding. - // See also enc_map in encode.go. - ids := make([]int, 0, len(m)) - for id := range m { - ids = append(ids, int(id)) - } - sort.Ints(ids) - - ms := &MessageSet{Item: make([]*_MessageSet_Item, 0, len(m))} - for _, id := range ids { - e := m[int32(id)] - // Remove the wire type and field number varint, as well as the length varint. - msg := skipVarint(skipVarint(e.enc)) - - ms.Item = append(ms.Item, &_MessageSet_Item{ - TypeId: Int32(int32(id)), - Message: msg, - }) - } - return Marshal(ms) -} - -// UnmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. -// It is called by generated Unmarshal methods on protocol buffer messages with the message_set_wire_format option. -func UnmarshalMessageSet(buf []byte, m map[int32]Extension) error { - ms := new(MessageSet) - if err := Unmarshal(buf, ms); err != nil { - return err - } - for _, item := range ms.Item { - id := *item.TypeId - msg := item.Message - - // Restore wire type and field number varint, plus length varint. - // Be careful to preserve duplicate items. - b := EncodeVarint(uint64(id)<<3 | WireBytes) - if ext, ok := m[id]; ok { - // Existing data; rip off the tag and length varint - // so we join the new data correctly. - // We can assume that ext.enc is set because we are unmarshaling. - o := ext.enc[len(b):] // skip wire type and field number - _, n := DecodeVarint(o) // calculate length of length varint - o = o[n:] // skip length varint - msg = append(o, msg...) // join old data and new data - } - b = append(b, EncodeVarint(uint64(len(msg)))...) - b = append(b, msg...) - - m[id] = Extension{enc: b} - } - return nil -} - -// MarshalMessageSetJSON encodes the extension map represented by m in JSON format. -// It is called by generated MarshalJSON methods on protocol buffer messages with the message_set_wire_format option. -func MarshalMessageSetJSON(m map[int32]Extension) ([]byte, error) { - var b bytes.Buffer - b.WriteByte('{') - - // Process the map in key order for deterministic output. - ids := make([]int32, 0, len(m)) - for id := range m { - ids = append(ids, id) - } - sort.Sort(int32Slice(ids)) // int32Slice defined in text.go - - for i, id := range ids { - ext := m[id] - if i > 0 { - b.WriteByte(',') - } - - msd, ok := messageSetMap[id] - if !ok { - // Unknown type; we can't render it, so skip it. - continue - } - fmt.Fprintf(&b, `"[%s]":`, msd.name) - - x := ext.value - if x == nil { - x = reflect.New(msd.t.Elem()).Interface() - if err := Unmarshal(ext.enc, x.(Message)); err != nil { - return nil, err - } - } - d, err := json.Marshal(x) - if err != nil { - return nil, err - } - b.Write(d) - } - b.WriteByte('}') - return b.Bytes(), nil -} - -// UnmarshalMessageSetJSON decodes the extension map encoded in buf in JSON format. -// It is called by generated UnmarshalJSON methods on protocol buffer messages with the message_set_wire_format option. -func UnmarshalMessageSetJSON(buf []byte, m map[int32]Extension) error { - // Common-case fast path. - if len(buf) == 0 || bytes.Equal(buf, []byte("{}")) { - return nil - } - - // This is fairly tricky, and it's not clear that it is needed. - return errors.New("TODO: UnmarshalMessageSetJSON not yet implemented") -} - -// A global registry of types that can be used in a MessageSet. - -var messageSetMap = make(map[int32]messageSetDesc) - -type messageSetDesc struct { - t reflect.Type // pointer to struct - name string -} - -// RegisterMessageSetType is called from the generated code. -func RegisterMessageSetType(m Message, fieldNum int32, name string) { - messageSetMap[fieldNum] = messageSetDesc{ - t: reflect.TypeOf(m), - name: name, - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/message_set_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/message_set_test.go deleted file mode 100644 index 7c29bccf4b1..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/message_set_test.go +++ /dev/null @@ -1,66 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2014 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "bytes" - "testing" -) - -func TestUnmarshalMessageSetWithDuplicate(t *testing.T) { - // Check that a repeated message set entry will be concatenated. - in := &MessageSet{ - Item: []*_MessageSet_Item{ - {TypeId: Int32(12345), Message: []byte("hoo")}, - {TypeId: Int32(12345), Message: []byte("hah")}, - }, - } - b, err := Marshal(in) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - t.Logf("Marshaled bytes: %q", b) - - m := make(map[int32]Extension) - if err := UnmarshalMessageSet(b, m); err != nil { - t.Fatalf("UnmarshalMessageSet: %v", err) - } - ext, ok := m[12345] - if !ok { - t.Fatalf("Didn't retrieve extension 12345; map is %v", m) - } - // Skip wire type/field number and length varints. - got := skipVarint(skipVarint(ext.enc)) - if want := []byte("hoohah"); !bytes.Equal(got, want) { - t.Errorf("Combined extension is %q, want %q", got, want) - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/pointer_reflect.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/pointer_reflect.go deleted file mode 100644 index 0c53417f05f..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/pointer_reflect.go +++ /dev/null @@ -1,384 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// +build appengine,!appenginevm - -// This file contains an implementation of proto field accesses using package reflect. -// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can -// be used on App Engine. - -package proto - -import ( - "math" - "reflect" -) - -// A structPointer is a pointer to a struct. -type structPointer struct { - v reflect.Value -} - -// toStructPointer returns a structPointer equivalent to the given reflect value. -// The reflect value must itself be a pointer to a struct. -func toStructPointer(v reflect.Value) structPointer { - return structPointer{v} -} - -// IsNil reports whether p is nil. -func structPointer_IsNil(p structPointer) bool { - return p.v.IsNil() -} - -// Interface returns the struct pointer as an interface value. -func structPointer_Interface(p structPointer, _ reflect.Type) interface{} { - return p.v.Interface() -} - -// A field identifies a field in a struct, accessible from a structPointer. -// In this implementation, a field is identified by the sequence of field indices -// passed to reflect's FieldByIndex. -type field []int - -// toField returns a field equivalent to the given reflect field. -func toField(f *reflect.StructField) field { - return f.Index -} - -// invalidField is an invalid field identifier. -var invalidField = field(nil) - -// IsValid reports whether the field identifier is valid. -func (f field) IsValid() bool { return f != nil } - -// field returns the given field in the struct as a reflect value. -func structPointer_field(p structPointer, f field) reflect.Value { - // Special case: an extension map entry with a value of type T - // passes a *T to the struct-handling code with a zero field, - // expecting that it will be treated as equivalent to *struct{ X T }, - // which has the same memory layout. We have to handle that case - // specially, because reflect will panic if we call FieldByIndex on a - // non-struct. - if f == nil { - return p.v.Elem() - } - - return p.v.Elem().FieldByIndex(f) -} - -// ifield returns the given field in the struct as an interface value. -func structPointer_ifield(p structPointer, f field) interface{} { - return structPointer_field(p, f).Addr().Interface() -} - -// Bytes returns the address of a []byte field in the struct. -func structPointer_Bytes(p structPointer, f field) *[]byte { - return structPointer_ifield(p, f).(*[]byte) -} - -// BytesSlice returns the address of a [][]byte field in the struct. -func structPointer_BytesSlice(p structPointer, f field) *[][]byte { - return structPointer_ifield(p, f).(*[][]byte) -} - -// Bool returns the address of a *bool field in the struct. -func structPointer_Bool(p structPointer, f field) **bool { - return structPointer_ifield(p, f).(**bool) -} - -// BoolSlice returns the address of a []bool field in the struct. -func structPointer_BoolSlice(p structPointer, f field) *[]bool { - return structPointer_ifield(p, f).(*[]bool) -} - -// String returns the address of a *string field in the struct. -func structPointer_String(p structPointer, f field) **string { - return structPointer_ifield(p, f).(**string) -} - -// StringSlice returns the address of a []string field in the struct. -func structPointer_StringSlice(p structPointer, f field) *[]string { - return structPointer_ifield(p, f).(*[]string) -} - -// ExtMap returns the address of an extension map field in the struct. -func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { - return structPointer_ifield(p, f).(*map[int32]Extension) -} - -// SetStructPointer writes a *struct field in the struct. -func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { - structPointer_field(p, f).Set(q.v) -} - -// GetStructPointer reads a *struct field in the struct. -func structPointer_GetStructPointer(p structPointer, f field) structPointer { - return structPointer{structPointer_field(p, f)} -} - -// StructPointerSlice the address of a []*struct field in the struct. -func structPointer_StructPointerSlice(p structPointer, f field) structPointerSlice { - return structPointerSlice{structPointer_field(p, f)} -} - -// A structPointerSlice represents the address of a slice of pointers to structs -// (themselves messages or groups). That is, v.Type() is *[]*struct{...}. -type structPointerSlice struct { - v reflect.Value -} - -func (p structPointerSlice) Len() int { return p.v.Len() } -func (p structPointerSlice) Index(i int) structPointer { return structPointer{p.v.Index(i)} } -func (p structPointerSlice) Append(q structPointer) { - p.v.Set(reflect.Append(p.v, q.v)) -} - -var ( - int32Type = reflect.TypeOf(int32(0)) - uint32Type = reflect.TypeOf(uint32(0)) - float32Type = reflect.TypeOf(float32(0)) - int64Type = reflect.TypeOf(int64(0)) - uint64Type = reflect.TypeOf(uint64(0)) - float64Type = reflect.TypeOf(float64(0)) -) - -// A word32 represents a field of type *int32, *uint32, *float32, or *enum. -// That is, v.Type() is *int32, *uint32, *float32, or *enum and v is assignable. -type word32 struct { - v reflect.Value -} - -// IsNil reports whether p is nil. -func word32_IsNil(p word32) bool { - return p.v.IsNil() -} - -// Set sets p to point at a newly allocated word with bits set to x. -func word32_Set(p word32, o *Buffer, x uint32) { - t := p.v.Type().Elem() - switch t { - case int32Type: - if len(o.int32s) == 0 { - o.int32s = make([]int32, uint32PoolSize) - } - o.int32s[0] = int32(x) - p.v.Set(reflect.ValueOf(&o.int32s[0])) - o.int32s = o.int32s[1:] - return - case uint32Type: - if len(o.uint32s) == 0 { - o.uint32s = make([]uint32, uint32PoolSize) - } - o.uint32s[0] = x - p.v.Set(reflect.ValueOf(&o.uint32s[0])) - o.uint32s = o.uint32s[1:] - return - case float32Type: - if len(o.float32s) == 0 { - o.float32s = make([]float32, uint32PoolSize) - } - o.float32s[0] = math.Float32frombits(x) - p.v.Set(reflect.ValueOf(&o.float32s[0])) - o.float32s = o.float32s[1:] - return - } - - // must be enum - p.v.Set(reflect.New(t)) - p.v.Elem().SetInt(int64(int32(x))) -} - -// Get gets the bits pointed at by p, as a uint32. -func word32_Get(p word32) uint32 { - elem := p.v.Elem() - switch elem.Kind() { - case reflect.Int32: - return uint32(elem.Int()) - case reflect.Uint32: - return uint32(elem.Uint()) - case reflect.Float32: - return math.Float32bits(float32(elem.Float())) - } - panic("unreachable") -} - -// Word32 returns a reference to a *int32, *uint32, *float32, or *enum field in the struct. -func structPointer_Word32(p structPointer, f field) word32 { - return word32{structPointer_field(p, f)} -} - -// A word32Slice is a slice of 32-bit values. -// That is, v.Type() is []int32, []uint32, []float32, or []enum. -type word32Slice struct { - v reflect.Value -} - -func (p word32Slice) Append(x uint32) { - n, m := p.v.Len(), p.v.Cap() - if n < m { - p.v.SetLen(n + 1) - } else { - t := p.v.Type().Elem() - p.v.Set(reflect.Append(p.v, reflect.Zero(t))) - } - elem := p.v.Index(n) - switch elem.Kind() { - case reflect.Int32: - elem.SetInt(int64(int32(x))) - case reflect.Uint32: - elem.SetUint(uint64(x)) - case reflect.Float32: - elem.SetFloat(float64(math.Float32frombits(x))) - } -} - -func (p word32Slice) Len() int { - return p.v.Len() -} - -func (p word32Slice) Index(i int) uint32 { - elem := p.v.Index(i) - switch elem.Kind() { - case reflect.Int32: - return uint32(elem.Int()) - case reflect.Uint32: - return uint32(elem.Uint()) - case reflect.Float32: - return math.Float32bits(float32(elem.Float())) - } - panic("unreachable") -} - -// Word32Slice returns a reference to a []int32, []uint32, []float32, or []enum field in the struct. -func structPointer_Word32Slice(p structPointer, f field) word32Slice { - return word32Slice{structPointer_field(p, f)} -} - -// word64 is like word32 but for 64-bit values. -type word64 struct { - v reflect.Value -} - -func word64_Set(p word64, o *Buffer, x uint64) { - t := p.v.Type().Elem() - switch t { - case int64Type: - if len(o.int64s) == 0 { - o.int64s = make([]int64, uint64PoolSize) - } - o.int64s[0] = int64(x) - p.v.Set(reflect.ValueOf(&o.int64s[0])) - o.int64s = o.int64s[1:] - return - case uint64Type: - if len(o.uint64s) == 0 { - o.uint64s = make([]uint64, uint64PoolSize) - } - o.uint64s[0] = x - p.v.Set(reflect.ValueOf(&o.uint64s[0])) - o.uint64s = o.uint64s[1:] - return - case float64Type: - if len(o.float64s) == 0 { - o.float64s = make([]float64, uint64PoolSize) - } - o.float64s[0] = math.Float64frombits(x) - p.v.Set(reflect.ValueOf(&o.float64s[0])) - o.float64s = o.float64s[1:] - return - } - panic("unreachable") -} - -func word64_IsNil(p word64) bool { - return p.v.IsNil() -} - -func word64_Get(p word64) uint64 { - elem := p.v.Elem() - switch elem.Kind() { - case reflect.Int64: - return uint64(elem.Int()) - case reflect.Uint64: - return elem.Uint() - case reflect.Float64: - return math.Float64bits(elem.Float()) - } - panic("unreachable") -} - -func structPointer_Word64(p structPointer, f field) word64 { - return word64{structPointer_field(p, f)} -} - -type word64Slice struct { - v reflect.Value -} - -func (p word64Slice) Append(x uint64) { - n, m := p.v.Len(), p.v.Cap() - if n < m { - p.v.SetLen(n + 1) - } else { - t := p.v.Type().Elem() - p.v.Set(reflect.Append(p.v, reflect.Zero(t))) - } - elem := p.v.Index(n) - switch elem.Kind() { - case reflect.Int64: - elem.SetInt(int64(int64(x))) - case reflect.Uint64: - elem.SetUint(uint64(x)) - case reflect.Float64: - elem.SetFloat(float64(math.Float64frombits(x))) - } -} - -func (p word64Slice) Len() int { - return p.v.Len() -} - -func (p word64Slice) Index(i int) uint64 { - elem := p.v.Index(i) - switch elem.Kind() { - case reflect.Int64: - return uint64(elem.Int()) - case reflect.Uint64: - return uint64(elem.Uint()) - case reflect.Float64: - return math.Float64bits(float64(elem.Float())) - } - panic("unreachable") -} - -func structPointer_Word64Slice(p structPointer, f field) word64Slice { - return word64Slice{structPointer_field(p, f)} -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/pointer_unsafe.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/pointer_unsafe.go deleted file mode 100644 index 7f3473e2f35..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/pointer_unsafe.go +++ /dev/null @@ -1,218 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// +build !appengine appenginevm - -// This file contains the implementation of the proto field accesses using package unsafe. - -package proto - -import ( - "reflect" - "unsafe" -) - -// NOTE: These type_Foo functions would more idiomatically be methods, -// but Go does not allow methods on pointer types, and we must preserve -// some pointer type for the garbage collector. We use these -// funcs with clunky names as our poor approximation to methods. -// -// An alternative would be -// type structPointer struct { p unsafe.Pointer } -// but that does not registerize as well. - -// A structPointer is a pointer to a struct. -type structPointer unsafe.Pointer - -// toStructPointer returns a structPointer equivalent to the given reflect value. -func toStructPointer(v reflect.Value) structPointer { - return structPointer(unsafe.Pointer(v.Pointer())) -} - -// IsNil reports whether p is nil. -func structPointer_IsNil(p structPointer) bool { - return p == nil -} - -// Interface returns the struct pointer, assumed to have element type t, -// as an interface value. -func structPointer_Interface(p structPointer, t reflect.Type) interface{} { - return reflect.NewAt(t, unsafe.Pointer(p)).Interface() -} - -// A field identifies a field in a struct, accessible from a structPointer. -// In this implementation, a field is identified by its byte offset from the start of the struct. -type field uintptr - -// toField returns a field equivalent to the given reflect field. -func toField(f *reflect.StructField) field { - return field(f.Offset) -} - -// invalidField is an invalid field identifier. -const invalidField = ^field(0) - -// IsValid reports whether the field identifier is valid. -func (f field) IsValid() bool { - return f != ^field(0) -} - -// Bytes returns the address of a []byte field in the struct. -func structPointer_Bytes(p structPointer, f field) *[]byte { - return (*[]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// BytesSlice returns the address of a [][]byte field in the struct. -func structPointer_BytesSlice(p structPointer, f field) *[][]byte { - return (*[][]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// Bool returns the address of a *bool field in the struct. -func structPointer_Bool(p structPointer, f field) **bool { - return (**bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// BoolSlice returns the address of a []bool field in the struct. -func structPointer_BoolSlice(p structPointer, f field) *[]bool { - return (*[]bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// String returns the address of a *string field in the struct. -func structPointer_String(p structPointer, f field) **string { - return (**string)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// StringSlice returns the address of a []string field in the struct. -func structPointer_StringSlice(p structPointer, f field) *[]string { - return (*[]string)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// ExtMap returns the address of an extension map field in the struct. -func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { - return (*map[int32]Extension)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// SetStructPointer writes a *struct field in the struct. -func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { - *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) = q -} - -// GetStructPointer reads a *struct field in the struct. -func structPointer_GetStructPointer(p structPointer, f field) structPointer { - return *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// StructPointerSlice the address of a []*struct field in the struct. -func structPointer_StructPointerSlice(p structPointer, f field) *structPointerSlice { - return (*structPointerSlice)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// A structPointerSlice represents a slice of pointers to structs (themselves submessages or groups). -type structPointerSlice []structPointer - -func (v *structPointerSlice) Len() int { return len(*v) } -func (v *structPointerSlice) Index(i int) structPointer { return (*v)[i] } -func (v *structPointerSlice) Append(p structPointer) { *v = append(*v, p) } - -// A word32 is the address of a "pointer to 32-bit value" field. -type word32 **uint32 - -// IsNil reports whether *v is nil. -func word32_IsNil(p word32) bool { - return *p == nil -} - -// Set sets *v to point at a newly allocated word set to x. -func word32_Set(p word32, o *Buffer, x uint32) { - if len(o.uint32s) == 0 { - o.uint32s = make([]uint32, uint32PoolSize) - } - o.uint32s[0] = x - *p = &o.uint32s[0] - o.uint32s = o.uint32s[1:] -} - -// Get gets the value pointed at by *v. -func word32_Get(p word32) uint32 { - return **p -} - -// Word32 returns the address of a *int32, *uint32, *float32, or *enum field in the struct. -func structPointer_Word32(p structPointer, f field) word32 { - return word32((**uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) -} - -// A word32Slice is a slice of 32-bit values. -type word32Slice []uint32 - -func (v *word32Slice) Append(x uint32) { *v = append(*v, x) } -func (v *word32Slice) Len() int { return len(*v) } -func (v *word32Slice) Index(i int) uint32 { return (*v)[i] } - -// Word32Slice returns the address of a []int32, []uint32, []float32, or []enum field in the struct. -func structPointer_Word32Slice(p structPointer, f field) *word32Slice { - return (*word32Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// word64 is like word32 but for 64-bit values. -type word64 **uint64 - -func word64_Set(p word64, o *Buffer, x uint64) { - if len(o.uint64s) == 0 { - o.uint64s = make([]uint64, uint64PoolSize) - } - o.uint64s[0] = x - *p = &o.uint64s[0] - o.uint64s = o.uint64s[1:] -} - -func word64_IsNil(p word64) bool { - return *p == nil -} - -func word64_Get(p word64) uint64 { - return **p -} - -func structPointer_Word64(p structPointer, f field) word64 { - return word64((**uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) -} - -// word64Slice is like word32Slice but for 64-bit values. -type word64Slice []uint64 - -func (v *word64Slice) Append(x uint64) { *v = append(*v, x) } -func (v *word64Slice) Len() int { return len(*v) } -func (v *word64Slice) Index(i int) uint64 { return (*v)[i] } - -func structPointer_Word64Slice(p structPointer, f field) *word64Slice { - return (*word64Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go deleted file mode 100644 index 797a6118f6d..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright (c) 2013, Vastech SA (PTY) LTD. All rights reserved. -// http://github.com/gogo/protobuf/gogoproto -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// +build !appengine - -// This file contains the implementation of the proto field accesses using package unsafe. - -package proto - -import ( - "reflect" - "unsafe" -) - -func structPointer_InterfaceAt(p structPointer, f field, t reflect.Type) interface{} { - point := unsafe.Pointer(uintptr(p) + uintptr(f)) - r := reflect.NewAt(t, point) - return r.Interface() -} - -func structPointer_InterfaceRef(p structPointer, f field, t reflect.Type) interface{} { - point := unsafe.Pointer(uintptr(p) + uintptr(f)) - r := reflect.NewAt(t, point) - if r.Elem().IsNil() { - return nil - } - return r.Elem().Interface() -} - -func copyUintPtr(oldptr, newptr uintptr, size int) { - oldbytes := make([]byte, 0) - oldslice := (*reflect.SliceHeader)(unsafe.Pointer(&oldbytes)) - oldslice.Data = oldptr - oldslice.Len = size - oldslice.Cap = size - newbytes := make([]byte, 0) - newslice := (*reflect.SliceHeader)(unsafe.Pointer(&newbytes)) - newslice.Data = newptr - newslice.Len = size - newslice.Cap = size - copy(newbytes, oldbytes) -} - -func structPointer_Copy(oldptr structPointer, newptr structPointer, size int) { - copyUintPtr(uintptr(oldptr), uintptr(newptr), size) -} - -func appendStructPointer(base structPointer, f field, typ reflect.Type) structPointer { - size := typ.Elem().Size() - oldHeader := structPointer_GetSliceHeader(base, f) - newLen := oldHeader.Len + 1 - slice := reflect.MakeSlice(typ, newLen, newLen) - bas := toStructPointer(slice) - for i := 0; i < oldHeader.Len; i++ { - newElemptr := uintptr(bas) + uintptr(i)*size - oldElemptr := oldHeader.Data + uintptr(i)*size - copyUintPtr(oldElemptr, newElemptr, int(size)) - } - - oldHeader.Data = uintptr(bas) - oldHeader.Len = newLen - oldHeader.Cap = newLen - - return structPointer(unsafe.Pointer(uintptr(unsafe.Pointer(bas)) + uintptr(uintptr(newLen-1)*size))) -} - -// RefBool returns a *bool field in the struct. -func structPointer_RefBool(p structPointer, f field) *bool { - return (*bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// RefString returns the address of a string field in the struct. -func structPointer_RefString(p structPointer, f field) *string { - return (*string)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -func structPointer_FieldPointer(p structPointer, f field) structPointer { - return structPointer(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -func structPointer_GetRefStructPointer(p structPointer, f field) structPointer { - return structPointer((*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f)))) -} - -func structPointer_GetSliceHeader(p structPointer, f field) *reflect.SliceHeader { - return (*reflect.SliceHeader)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -func structPointer_Add(p structPointer, size field) structPointer { - return structPointer(unsafe.Pointer(uintptr(p) + uintptr(size))) -} - -func structPointer_Len(p structPointer, f field) int { - return len(*(*[]interface{})(unsafe.Pointer(structPointer_GetRefStructPointer(p, f)))) -} - -// refWord32 is the address of a 32-bit value field. -type refWord32 *uint32 - -func refWord32_IsNil(p refWord32) bool { - return p == nil -} - -func refWord32_Set(p refWord32, o *Buffer, x uint32) { - if len(o.uint32s) == 0 { - o.uint32s = make([]uint32, uint32PoolSize) - } - o.uint32s[0] = x - *p = o.uint32s[0] - o.uint32s = o.uint32s[1:] -} - -func refWord32_Get(p refWord32) uint32 { - return *p -} - -func structPointer_RefWord32(p structPointer, f field) refWord32 { - return refWord32((*uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) -} - -// refWord64 is like refWord32 but for 32-bit values. -type refWord64 *uint64 - -func refWord64_Set(p refWord64, o *Buffer, x uint64) { - if len(o.uint64s) == 0 { - o.uint64s = make([]uint64, uint64PoolSize) - } - o.uint64s[0] = x - *p = o.uint64s[0] - o.uint64s = o.uint64s[1:] -} - -func refWord64_IsNil(p refWord64) bool { - return p == nil -} - -func refWord64_Get(p refWord64) uint64 { - return *p -} - -func structPointer_RefWord64(p structPointer, f field) refWord64 { - return refWord64((*uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/properties.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/properties.go deleted file mode 100644 index f5a2a8b0bc3..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/properties.go +++ /dev/null @@ -1,683 +0,0 @@ -// Extensions for Protocol Buffers to create more go like structures. -// -// Copyright (c) 2013, Vastech SA (PTY) LTD. All rights reserved. -// http://github.com/gogo/protobuf/gogoproto -// -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Routines for encoding data into the wire format for protocol buffers. - */ - -import ( - "fmt" - "os" - "reflect" - "sort" - "strconv" - "strings" - "sync" -) - -const debug bool = false - -// Constants that identify the encoding of a value on the wire. -const ( - WireVarint = 0 - WireFixed64 = 1 - WireBytes = 2 - WireStartGroup = 3 - WireEndGroup = 4 - WireFixed32 = 5 -) - -const startSize = 10 // initial slice/string sizes - -// Encoders are defined in encode.go -// An encoder outputs the full representation of a field, including its -// tag and encoder type. -type encoder func(p *Buffer, prop *Properties, base structPointer) error - -// A valueEncoder encodes a single integer in a particular encoding. -type valueEncoder func(o *Buffer, x uint64) error - -// Sizers are defined in encode.go -// A sizer returns the encoded size of a field, including its tag and encoder -// type. -type sizer func(prop *Properties, base structPointer) int - -// A valueSizer returns the encoded size of a single integer in a particular -// encoding. -type valueSizer func(x uint64) int - -// Decoders are defined in decode.go -// A decoder creates a value from its wire representation. -// Unrecognized subelements are saved in unrec. -type decoder func(p *Buffer, prop *Properties, base structPointer) error - -// A valueDecoder decodes a single integer in a particular encoding. -type valueDecoder func(o *Buffer) (x uint64, err error) - -// tagMap is an optimization over map[int]int for typical protocol buffer -// use-cases. Encoded protocol buffers are often in tag order with small tag -// numbers. -type tagMap struct { - fastTags []int - slowTags map[int]int -} - -// tagMapFastLimit is the upper bound on the tag number that will be stored in -// the tagMap slice rather than its map. -const tagMapFastLimit = 1024 - -func (p *tagMap) get(t int) (int, bool) { - if t > 0 && t < tagMapFastLimit { - if t >= len(p.fastTags) { - return 0, false - } - fi := p.fastTags[t] - return fi, fi >= 0 - } - fi, ok := p.slowTags[t] - return fi, ok -} - -func (p *tagMap) put(t int, fi int) { - if t > 0 && t < tagMapFastLimit { - for len(p.fastTags) < t+1 { - p.fastTags = append(p.fastTags, -1) - } - p.fastTags[t] = fi - return - } - if p.slowTags == nil { - p.slowTags = make(map[int]int) - } - p.slowTags[t] = fi -} - -// StructProperties represents properties for all the fields of a struct. -// decoderTags and decoderOrigNames should only be used by the decoder. -type StructProperties struct { - Prop []*Properties // properties for each field - reqCount int // required count - decoderTags tagMap // map from proto tag to struct field number - decoderOrigNames map[string]int // map from original name to struct field number - order []int // list of struct field numbers in tag order - unrecField field // field id of the XXX_unrecognized []byte field - extendable bool // is this an extendable proto -} - -// Implement the sorting interface so we can sort the fields in tag order, as recommended by the spec. -// See encode.go, (*Buffer).enc_struct. - -func (sp *StructProperties) Len() int { return len(sp.order) } -func (sp *StructProperties) Less(i, j int) bool { - return sp.Prop[sp.order[i]].Tag < sp.Prop[sp.order[j]].Tag -} -func (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order[j], sp.order[i] } - -// Properties represents the protocol-specific behavior of a single struct field. -type Properties struct { - Name string // name of the field, for error messages - OrigName string // original name before protocol compiler (always set) - Wire string - WireType int - Tag int - Required bool - Optional bool - Repeated bool - Packed bool // relevant for repeated primitives only - Enum string // set for enum types only - - Default string // default value - HasDefault bool // whether an explicit default was provided - CustomType string - def_uint64 uint64 - - enc encoder - valEnc valueEncoder // set for bool and numeric types only - field field - tagcode []byte // encoding of EncodeVarint((Tag<<3)|WireType) - tagbuf [8]byte - stype reflect.Type // set for struct types only - sstype reflect.Type // set for slices of structs types only - ctype reflect.Type // set for custom types only - sprop *StructProperties // set for struct types only - isMarshaler bool - isUnmarshaler bool - - size sizer - valSize valueSizer // set for bool and numeric types only - - dec decoder - valDec valueDecoder // set for bool and numeric types only - - // If this is a packable field, this will be the decoder for the packed version of the field. - packedDec decoder -} - -// String formats the properties in the protobuf struct field tag style. -func (p *Properties) String() string { - s := p.Wire - s = "," - s += strconv.Itoa(p.Tag) - if p.Required { - s += ",req" - } - if p.Optional { - s += ",opt" - } - if p.Repeated { - s += ",rep" - } - if p.Packed { - s += ",packed" - } - if p.OrigName != p.Name { - s += ",name=" + p.OrigName - } - if len(p.Enum) > 0 { - s += ",enum=" + p.Enum - } - if p.HasDefault { - s += ",def=" + p.Default - } - return s -} - -// Parse populates p by parsing a string in the protobuf struct field tag style. -func (p *Properties) Parse(s string) { - // "bytes,49,opt,name=foo,def=hello!" - fields := strings.Split(s, ",") // breaks def=, but handled below. - if len(fields) < 2 { - fmt.Fprintf(os.Stderr, "proto: tag has too few fields: %q\n", s) - return - } - - p.Wire = fields[0] - switch p.Wire { - case "varint": - p.WireType = WireVarint - p.valEnc = (*Buffer).EncodeVarint - p.valDec = (*Buffer).DecodeVarint - p.valSize = sizeVarint - case "fixed32": - p.WireType = WireFixed32 - p.valEnc = (*Buffer).EncodeFixed32 - p.valDec = (*Buffer).DecodeFixed32 - p.valSize = sizeFixed32 - case "fixed64": - p.WireType = WireFixed64 - p.valEnc = (*Buffer).EncodeFixed64 - p.valDec = (*Buffer).DecodeFixed64 - p.valSize = sizeFixed64 - case "zigzag32": - p.WireType = WireVarint - p.valEnc = (*Buffer).EncodeZigzag32 - p.valDec = (*Buffer).DecodeZigzag32 - p.valSize = sizeZigzag32 - case "zigzag64": - p.WireType = WireVarint - p.valEnc = (*Buffer).EncodeZigzag64 - p.valDec = (*Buffer).DecodeZigzag64 - p.valSize = sizeZigzag64 - case "bytes", "group": - p.WireType = WireBytes - // no numeric converter for non-numeric types - default: - fmt.Fprintf(os.Stderr, "proto: tag has unknown wire type: %q\n", s) - return - } - - var err error - p.Tag, err = strconv.Atoi(fields[1]) - if err != nil { - return - } - - for i := 2; i < len(fields); i++ { - f := fields[i] - switch { - case f == "req": - p.Required = true - case f == "opt": - p.Optional = true - case f == "rep": - p.Repeated = true - case f == "packed": - p.Packed = true - case strings.HasPrefix(f, "name="): - p.OrigName = f[5:] - case strings.HasPrefix(f, "enum="): - p.Enum = f[5:] - case strings.HasPrefix(f, "def="): - p.HasDefault = true - p.Default = f[4:] // rest of string - if i+1 < len(fields) { - // Commas aren't escaped, and def is always last. - p.Default += "," + strings.Join(fields[i+1:], ",") - break - } - case strings.HasPrefix(f, "embedded="): - p.OrigName = strings.Split(f, "=")[1] - case strings.HasPrefix(f, "customtype="): - p.CustomType = strings.Split(f, "=")[1] - } - } -} - -func logNoSliceEnc(t1, t2 reflect.Type) { - fmt.Fprintf(os.Stderr, "proto: no slice oenc for %T = []%T\n", t1, t2) -} - -var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() - -// Initialize the fields for encoding and decoding. -func (p *Properties) setEncAndDec(typ reflect.Type, lockGetProp bool) { - p.enc = nil - p.dec = nil - p.size = nil - if len(p.CustomType) > 0 { - p.setCustomEncAndDec(typ) - p.setTag(lockGetProp) - return - } - switch t1 := typ; t1.Kind() { - default: - if !p.setNonNullableEncAndDec(t1) { - fmt.Fprintf(os.Stderr, "proto: no coders for %v\n", t1) - } - case reflect.Ptr: - switch t2 := t1.Elem(); t2.Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no encoder function for %T -> %T\n", t1, t2) - break - case reflect.Bool: - p.enc = (*Buffer).enc_bool - p.dec = (*Buffer).dec_bool - p.size = size_bool - case reflect.Int32: - p.enc = (*Buffer).enc_int32 - p.dec = (*Buffer).dec_int32 - p.size = size_int32 - case reflect.Uint32: - p.enc = (*Buffer).enc_uint32 - p.dec = (*Buffer).dec_int32 // can reuse - p.size = size_uint32 - case reflect.Int64, reflect.Uint64: - p.enc = (*Buffer).enc_int64 - p.dec = (*Buffer).dec_int64 - p.size = size_int64 - case reflect.Float32: - p.enc = (*Buffer).enc_uint32 // can just treat them as bits - p.dec = (*Buffer).dec_int32 - p.size = size_uint32 - case reflect.Float64: - p.enc = (*Buffer).enc_int64 // can just treat them as bits - p.dec = (*Buffer).dec_int64 - p.size = size_int64 - case reflect.String: - p.enc = (*Buffer).enc_string - p.dec = (*Buffer).dec_string - p.size = size_string - case reflect.Struct: - p.stype = t1.Elem() - p.isMarshaler = isMarshaler(t1) - p.isUnmarshaler = isUnmarshaler(t1) - if p.Wire == "bytes" { - p.enc = (*Buffer).enc_struct_message - p.dec = (*Buffer).dec_struct_message - p.size = size_struct_message - } else { - p.enc = (*Buffer).enc_struct_group - p.dec = (*Buffer).dec_struct_group - p.size = size_struct_group - } - } - - case reflect.Slice: - switch t2 := t1.Elem(); t2.Kind() { - default: - logNoSliceEnc(t1, t2) - break - case reflect.Bool: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_bool - p.size = size_slice_packed_bool - } else { - p.enc = (*Buffer).enc_slice_bool - p.size = size_slice_bool - } - p.dec = (*Buffer).dec_slice_bool - p.packedDec = (*Buffer).dec_slice_packed_bool - case reflect.Int32: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_int32 - p.size = size_slice_packed_int32 - } else { - p.enc = (*Buffer).enc_slice_int32 - p.size = size_slice_int32 - } - p.dec = (*Buffer).dec_slice_int32 - p.packedDec = (*Buffer).dec_slice_packed_int32 - case reflect.Uint32: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_uint32 - p.size = size_slice_packed_uint32 - } else { - p.enc = (*Buffer).enc_slice_uint32 - p.size = size_slice_uint32 - } - p.dec = (*Buffer).dec_slice_int32 - p.packedDec = (*Buffer).dec_slice_packed_int32 - case reflect.Int64, reflect.Uint64: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_int64 - p.size = size_slice_packed_int64 - } else { - p.enc = (*Buffer).enc_slice_int64 - p.size = size_slice_int64 - } - p.dec = (*Buffer).dec_slice_int64 - p.packedDec = (*Buffer).dec_slice_packed_int64 - case reflect.Uint8: - p.enc = (*Buffer).enc_slice_byte - p.dec = (*Buffer).dec_slice_byte - p.size = size_slice_byte - case reflect.Float32, reflect.Float64: - switch t2.Bits() { - case 32: - // can just treat them as bits - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_uint32 - p.size = size_slice_packed_uint32 - } else { - p.enc = (*Buffer).enc_slice_uint32 - p.size = size_slice_uint32 - } - p.dec = (*Buffer).dec_slice_int32 - p.packedDec = (*Buffer).dec_slice_packed_int32 - case 64: - // can just treat them as bits - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_int64 - p.size = size_slice_packed_int64 - } else { - p.enc = (*Buffer).enc_slice_int64 - p.size = size_slice_int64 - } - p.dec = (*Buffer).dec_slice_int64 - p.packedDec = (*Buffer).dec_slice_packed_int64 - default: - logNoSliceEnc(t1, t2) - break - } - case reflect.String: - p.enc = (*Buffer).enc_slice_string - p.dec = (*Buffer).dec_slice_string - p.size = size_slice_string - case reflect.Ptr: - switch t3 := t2.Elem(); t3.Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no ptr oenc for %T -> %T -> %T\n", t1, t2, t3) - break - case reflect.Struct: - p.stype = t2.Elem() - p.isMarshaler = isMarshaler(t2) - p.isUnmarshaler = isUnmarshaler(t2) - if p.Wire == "bytes" { - p.enc = (*Buffer).enc_slice_struct_message - p.dec = (*Buffer).dec_slice_struct_message - p.size = size_slice_struct_message - } else { - p.enc = (*Buffer).enc_slice_struct_group - p.dec = (*Buffer).dec_slice_struct_group - p.size = size_slice_struct_group - } - } - case reflect.Slice: - switch t2.Elem().Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no slice elem oenc for %T -> %T -> %T\n", t1, t2, t2.Elem()) - break - case reflect.Uint8: - p.enc = (*Buffer).enc_slice_slice_byte - p.dec = (*Buffer).dec_slice_slice_byte - p.size = size_slice_slice_byte - } - case reflect.Struct: - p.setSliceOfNonPointerStructs(t1) - } - } - p.setTag(lockGetProp) -} - -func (p *Properties) setTag(lockGetProp bool) { - // precalculate tag code - wire := p.WireType - if p.Packed { - wire = WireBytes - } - x := uint32(p.Tag)<<3 | uint32(wire) - i := 0 - for i = 0; x > 127; i++ { - p.tagbuf[i] = 0x80 | uint8(x&0x7F) - x >>= 7 - } - p.tagbuf[i] = uint8(x) - p.tagcode = p.tagbuf[0 : i+1] - - if p.stype != nil { - if lockGetProp { - p.sprop = GetProperties(p.stype) - } else { - p.sprop = getPropertiesLocked(p.stype) - } - } -} - -var ( - marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() - unmarshalerType = reflect.TypeOf((*Unmarshaler)(nil)).Elem() -) - -// isMarshaler reports whether type t implements Marshaler. -func isMarshaler(t reflect.Type) bool { - return t.Implements(marshalerType) -} - -// isUnmarshaler reports whether type t implements Unmarshaler. -func isUnmarshaler(t reflect.Type) bool { - return t.Implements(unmarshalerType) -} - -// Init populates the properties from a protocol buffer struct tag. -func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { - p.init(typ, name, tag, f, true) -} - -func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructField, lockGetProp bool) { - // "bytes,49,opt,def=hello!" - p.Name = name - p.OrigName = name - if f != nil { - p.field = toField(f) - } - if tag == "" { - return - } - p.Parse(tag) - p.setEncAndDec(typ, lockGetProp) -} - -var ( - mutex sync.Mutex - propertiesMap = make(map[reflect.Type]*StructProperties) -) - -// GetProperties returns the list of properties for the type represented by t. -// t must represent a generated struct type of a protocol message. -func GetProperties(t reflect.Type) *StructProperties { - if t.Kind() != reflect.Struct { - panic("proto: type must have kind struct") - } - mutex.Lock() - sprop := getPropertiesLocked(t) - mutex.Unlock() - return sprop -} - -// getPropertiesLocked requires that mutex is held. -func getPropertiesLocked(t reflect.Type) *StructProperties { - if prop, ok := propertiesMap[t]; ok { - if collectStats { - stats.Chit++ - } - return prop - } - if collectStats { - stats.Cmiss++ - } - - prop := new(StructProperties) - // in case of recursive protos, fill this in now. - propertiesMap[t] = prop - - // build properties - prop.extendable = reflect.PtrTo(t).Implements(extendableProtoType) - prop.unrecField = invalidField - prop.Prop = make([]*Properties, t.NumField()) - prop.order = make([]int, t.NumField()) - - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - p := new(Properties) - name := f.Name - p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) - - if f.Name == "XXX_extensions" { // special case - if len(f.Tag.Get("protobuf")) > 0 { - p.enc = (*Buffer).enc_ext_slice_byte - p.dec = nil // not needed - p.size = size_ext_slice_byte - } else { - p.enc = (*Buffer).enc_map - p.dec = nil // not needed - p.size = size_map - } - } - if f.Name == "XXX_unrecognized" { // special case - prop.unrecField = toField(&f) - } - prop.Prop[i] = p - prop.order[i] = i - if debug { - print(i, " ", f.Name, " ", t.String(), " ") - if p.Tag > 0 { - print(p.String()) - } - print("\n") - } - if p.enc == nil && !strings.HasPrefix(f.Name, "XXX_") { - fmt.Fprintln(os.Stderr, "proto: no encoder for", f.Name, f.Type.String(), "[GetProperties]") - } - } - - // Re-order prop.order. - sort.Sort(prop) - - // build required counts - // build tags - reqCount := 0 - prop.decoderOrigNames = make(map[string]int) - for i, p := range prop.Prop { - if strings.HasPrefix(p.Name, "XXX_") { - // Internal fields should not appear in tags/origNames maps. - // They are handled specially when encoding and decoding. - continue - } - if p.Required { - reqCount++ - } - prop.decoderTags.put(p.Tag, i) - prop.decoderOrigNames[p.OrigName] = i - } - prop.reqCount = reqCount - - return prop -} - -// Return the Properties object for the x[0]'th field of the structure. -func propByIndex(t reflect.Type, x []int) *Properties { - if len(x) != 1 { - fmt.Fprintf(os.Stderr, "proto: field index dimension %d (not 1) for type %s\n", len(x), t) - return nil - } - prop := GetProperties(t) - return prop.Prop[x[0]] -} - -// Get the address and type of a pointer to a struct from an interface. -func getbase(pb Message) (t reflect.Type, b structPointer, err error) { - if pb == nil { - err = ErrNil - return - } - // get the reflect type of the pointer to the struct. - t = reflect.TypeOf(pb) - // get the address of the struct. - value := reflect.ValueOf(pb) - b = toStructPointer(value) - return -} - -// A global registry of enum types. -// The generated code will register the generated maps by calling RegisterEnum. - -var enumValueMaps = make(map[string]map[string]int32) -var enumStringMaps = make(map[string]map[int32]string) - -// RegisterEnum is called from the generated code to install the enum descriptor -// maps into the global table to aid parsing text format protocol buffers. -func RegisterEnum(typeName string, unusedNameMap map[int32]string, valueMap map[string]int32) { - if _, ok := enumValueMaps[typeName]; ok { - panic("proto: duplicate enum registered: " + typeName) - } - enumValueMaps[typeName] = valueMap - if _, ok := enumStringMaps[typeName]; ok { - panic("proto: duplicate enum registered: " + typeName) - } - enumStringMaps[typeName] = unusedNameMap -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/properties_gogo.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/properties_gogo.go deleted file mode 100644 index 3518b77834e..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/properties_gogo.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (c) 2013, Vastech SA (PTY) LTD. All rights reserved. -// http://github.com/gogo/protobuf/gogoproto -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "fmt" - "os" - "reflect" -) - -func (p *Properties) setCustomEncAndDec(typ reflect.Type) { - p.ctype = typ - if p.Repeated { - p.enc = (*Buffer).enc_custom_slice_bytes - p.dec = (*Buffer).dec_custom_slice_bytes - p.size = size_custom_slice_bytes - } else if typ.Kind() == reflect.Ptr { - p.enc = (*Buffer).enc_custom_bytes - p.dec = (*Buffer).dec_custom_bytes - p.size = size_custom_bytes - } else { - p.enc = (*Buffer).enc_custom_ref_bytes - p.dec = (*Buffer).dec_custom_ref_bytes - p.size = size_custom_ref_bytes - } -} - -func (p *Properties) setNonNullableEncAndDec(typ reflect.Type) bool { - switch typ.Kind() { - case reflect.Bool: - p.enc = (*Buffer).enc_ref_bool - p.dec = (*Buffer).dec_ref_bool - p.size = size_ref_bool - case reflect.Int32: - p.enc = (*Buffer).enc_ref_int32 - p.dec = (*Buffer).dec_ref_int32 - p.size = size_ref_int32 - case reflect.Uint32: - p.enc = (*Buffer).enc_ref_uint32 - p.dec = (*Buffer).dec_ref_int32 - p.size = size_ref_uint32 - case reflect.Int64, reflect.Uint64: - p.enc = (*Buffer).enc_ref_int64 - p.dec = (*Buffer).dec_ref_int64 - p.size = size_ref_int64 - case reflect.Float32: - p.enc = (*Buffer).enc_ref_uint32 // can just treat them as bits - p.dec = (*Buffer).dec_ref_int32 - p.size = size_ref_uint32 - case reflect.Float64: - p.enc = (*Buffer).enc_ref_int64 // can just treat them as bits - p.dec = (*Buffer).dec_ref_int64 - p.size = size_ref_int64 - case reflect.String: - p.dec = (*Buffer).dec_ref_string - p.enc = (*Buffer).enc_ref_string - p.size = size_ref_string - case reflect.Struct: - p.stype = typ - p.isMarshaler = isMarshaler(typ) - p.isUnmarshaler = isUnmarshaler(typ) - if p.Wire == "bytes" { - p.enc = (*Buffer).enc_ref_struct_message - p.dec = (*Buffer).dec_ref_struct_message - p.size = size_ref_struct_message - } else { - fmt.Fprintf(os.Stderr, "proto: no coders for struct %T\n", typ) - } - default: - return false - } - return true -} - -func (p *Properties) setSliceOfNonPointerStructs(typ reflect.Type) { - t2 := typ.Elem() - p.sstype = typ - p.stype = t2 - p.isMarshaler = isMarshaler(t2) - p.isUnmarshaler = isUnmarshaler(t2) - p.enc = (*Buffer).enc_slice_ref_struct_message - p.dec = (*Buffer).dec_slice_ref_struct_message - p.size = size_slice_ref_struct_message - if p.Wire != "bytes" { - fmt.Fprintf(os.Stderr, "proto: no ptr oenc for %T -> %T \n", typ, t2) - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/size2_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/size2_test.go deleted file mode 100644 index a2729c39a1b..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/size2_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "testing" -) - -// This is a separate file and package from size_test.go because that one uses -// generated messages and thus may not be in package proto without having a circular -// dependency, whereas this file tests unexported details of size.go. - -func TestVarintSize(t *testing.T) { - // Check the edge cases carefully. - testCases := []struct { - n uint64 - size int - }{ - {0, 1}, - {1, 1}, - {127, 1}, - {128, 2}, - {16383, 2}, - {16384, 3}, - {1<<63 - 1, 9}, - {1 << 63, 10}, - } - for _, tc := range testCases { - size := sizeVarint(tc.n) - if size != tc.size { - t.Errorf("sizeVarint(%d) = %d, want %d", tc.n, size, tc.size) - } - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/size_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/size_test.go deleted file mode 100644 index a9e002ee771..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/size_test.go +++ /dev/null @@ -1,120 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto_test - -import ( - "log" - "testing" - - pb "./testdata" - . "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" -) - -var messageWithExtension1 = &pb.MyMessage{Count: Int32(7)} - -// messageWithExtension2 is in equal_test.go. -var messageWithExtension3 = &pb.MyMessage{Count: Int32(8)} - -func init() { - if err := SetExtension(messageWithExtension1, pb.E_Ext_More, &pb.Ext{Data: String("Abbott")}); err != nil { - log.Panicf("SetExtension: %v", err) - } - if err := SetExtension(messageWithExtension3, pb.E_Ext_More, &pb.Ext{Data: String("Costello")}); err != nil { - log.Panicf("SetExtension: %v", err) - } - - // Force messageWithExtension3 to have the extension encoded. - Marshal(messageWithExtension3) - -} - -var SizeTests = []struct { - desc string - pb Message -}{ - {"empty", &pb.OtherMessage{}}, - // Basic types. - {"bool", &pb.Defaults{F_Bool: Bool(true)}}, - {"int32", &pb.Defaults{F_Int32: Int32(12)}}, - {"negative int32", &pb.Defaults{F_Int32: Int32(-1)}}, - {"small int64", &pb.Defaults{F_Int64: Int64(1)}}, - {"big int64", &pb.Defaults{F_Int64: Int64(1 << 20)}}, - {"negative int64", &pb.Defaults{F_Int64: Int64(-1)}}, - {"fixed32", &pb.Defaults{F_Fixed32: Uint32(71)}}, - {"fixed64", &pb.Defaults{F_Fixed64: Uint64(72)}}, - {"uint32", &pb.Defaults{F_Uint32: Uint32(123)}}, - {"uint64", &pb.Defaults{F_Uint64: Uint64(124)}}, - {"float", &pb.Defaults{F_Float: Float32(12.6)}}, - {"double", &pb.Defaults{F_Double: Float64(13.9)}}, - {"string", &pb.Defaults{F_String: String("niles")}}, - {"bytes", &pb.Defaults{F_Bytes: []byte("wowsa")}}, - {"bytes, empty", &pb.Defaults{F_Bytes: []byte{}}}, - {"sint32", &pb.Defaults{F_Sint32: Int32(65)}}, - {"sint64", &pb.Defaults{F_Sint64: Int64(67)}}, - {"enum", &pb.Defaults{F_Enum: pb.Defaults_BLUE.Enum()}}, - // Repeated. - {"empty repeated bool", &pb.MoreRepeated{Bools: []bool{}}}, - {"repeated bool", &pb.MoreRepeated{Bools: []bool{false, true, true, false}}}, - {"packed repeated bool", &pb.MoreRepeated{BoolsPacked: []bool{false, true, true, false, true, true, true}}}, - {"repeated int32", &pb.MoreRepeated{Ints: []int32{1, 12203, 1729, -1}}}, - {"repeated int32 packed", &pb.MoreRepeated{IntsPacked: []int32{1, 12203, 1729}}}, - {"repeated int64 packed", &pb.MoreRepeated{Int64SPacked: []int64{ - // Need enough large numbers to verify that the header is counting the number of bytes - // for the field, not the number of elements. - 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, - 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, - }}}, - {"repeated string", &pb.MoreRepeated{Strings: []string{"r", "ken", "gri"}}}, - {"repeated fixed", &pb.MoreRepeated{Fixeds: []uint32{1, 2, 3, 4}}}, - // Nested. - {"nested", &pb.OldMessage{Nested: &pb.OldMessage_Nested{Name: String("whatever")}}}, - {"group", &pb.GroupOld{G: &pb.GroupOld_G{X: Int32(12345)}}}, - // Other things. - {"unrecognized", &pb.MoreRepeated{XXX_unrecognized: []byte{13<<3 | 0, 4}}}, - {"extension (unencoded)", messageWithExtension1}, - {"extension (encoded)", messageWithExtension3}, -} - -func TestSize(t *testing.T) { - for _, tc := range SizeTests { - size := Size(tc.pb) - b, err := Marshal(tc.pb) - if err != nil { - t.Errorf("%v: Marshal failed: %v", tc.desc, err) - continue - } - if size != len(b) { - t.Errorf("%v: Size(%v) = %d, want %d", tc.desc, tc.pb, size, len(b)) - t.Logf("%v: bytes: %#v", tc.desc, b) - } - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/skip_gogo.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/skip_gogo.go deleted file mode 100644 index d8683c8edf4..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/skip_gogo.go +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright (c) 2013, Vastech SA (PTY) LTD. All rights reserved. -// http://github.com/gogo/protobuf/gogoproto -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "fmt" - "io" -) - -func Skip(data []byte) (n int, err error) { - l := len(data) - index := 0 - for index < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if index >= l { - return 0, io.ErrUnexpectedEOF - } - b := data[index] - index++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for { - if index >= l { - return 0, io.ErrUnexpectedEOF - } - index++ - if data[index-1] < 0x80 { - break - } - } - return index, nil - case 1: - index += 8 - return index, nil - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if index >= l { - return 0, io.ErrUnexpectedEOF - } - b := data[index] - index++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - index += length - return index, nil - case 3: - for { - var wire uint64 - var start int = index - for shift := uint(0); ; shift += 7 { - if index >= l { - return 0, io.ErrUnexpectedEOF - } - b := data[index] - index++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - if wireType == 4 { - break - } - next, err := Skip(data[start:]) - if err != nil { - return 0, err - } - index = start + next - } - return index, nil - case 4: - return index, nil - case 5: - index += 4 - return index, nil - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - } - panic("unreachable") -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/Makefile b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/Makefile deleted file mode 100644 index beb438e3e70..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/Makefile +++ /dev/null @@ -1,47 +0,0 @@ -# Go support for Protocol Buffers - Google's data interchange format -# -# Copyright 2010 The Go Authors. All rights reserved. -# https://github.com/golang/protobuf -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -all: regenerate - -regenerate: - rm -f test.pb.go - protoc --gogo_out=. test.proto - -# The following rules are just aids to development. Not needed for typical testing. - -diff: regenerate - hg diff test.pb.go - -restore: - cp test.pb.go.golden test.pb.go - -preserve: - cp test.pb.go test.pb.go.golden diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/golden_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/golden_test.go deleted file mode 100644 index 8e84515377a..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/golden_test.go +++ /dev/null @@ -1,86 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Verify that the compiler output for test.proto is unchanged. - -package testdata - -import ( - "crypto/sha1" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "testing" -) - -// sum returns in string form (for easy comparison) the SHA-1 hash of the named file. -func sum(t *testing.T, name string) string { - data, err := ioutil.ReadFile(name) - if err != nil { - t.Fatal(err) - } - t.Logf("sum(%q): length is %d", name, len(data)) - hash := sha1.New() - _, err = hash.Write(data) - if err != nil { - t.Fatal(err) - } - return fmt.Sprintf("% x", hash.Sum(nil)) -} - -func run(t *testing.T, name string, args ...string) { - cmd := exec.Command(name, args...) - cmd.Stdin = os.Stdin - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - err := cmd.Run() - if err != nil { - t.Fatal(err) - } -} - -func TestGolden(t *testing.T) { - // Compute the original checksum. - goldenSum := sum(t, "test.pb.go") - // Run the proto compiler. - run(t, "protoc", "--gogo_out="+os.TempDir(), "test.proto") - newFile := filepath.Join(os.TempDir(), "test.pb.go") - defer os.Remove(newFile) - // Compute the new checksum. - newSum := sum(t, newFile) - // Verify - if newSum != goldenSum { - run(t, "diff", "-u", "test.pb.go", newFile) - t.Fatal("Code generated by protoc-gen-go has changed; update test.pb.go") - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.pb.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.pb.go deleted file mode 100644 index dbfc73dd906..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.pb.go +++ /dev/null @@ -1,2356 +0,0 @@ -// Code generated by protoc-gen-gogo. -// source: test.proto -// DO NOT EDIT! - -/* -Package testdata is a generated protocol buffer package. - -It is generated from these files: - test.proto - -It has these top-level messages: - GoEnum - GoTestField - GoTest - GoSkipTest - NonPackedTest - PackedTest - MaxTag - OldMessage - NewMessage - InnerMessage - OtherMessage - MyMessage - Ext - MyMessageSet - Empty - MessageList - Strings - Defaults - SubDefaults - RepeatedEnum - MoreRepeated - GroupOld - GroupNew - FloatingPoint -*/ -package testdata - -import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = math.Inf - -type FOO int32 - -const ( - FOO_FOO1 FOO = 1 -) - -var FOO_name = map[int32]string{ - 1: "FOO1", -} -var FOO_value = map[string]int32{ - "FOO1": 1, -} - -func (x FOO) Enum() *FOO { - p := new(FOO) - *p = x - return p -} -func (x FOO) String() string { - return proto.EnumName(FOO_name, int32(x)) -} -func (x *FOO) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(FOO_value, data, "FOO") - if err != nil { - return err - } - *x = FOO(value) - return nil -} - -// An enum, for completeness. -type GoTest_KIND int32 - -const ( - GoTest_VOID GoTest_KIND = 0 - // Basic types - GoTest_BOOL GoTest_KIND = 1 - GoTest_BYTES GoTest_KIND = 2 - GoTest_FINGERPRINT GoTest_KIND = 3 - GoTest_FLOAT GoTest_KIND = 4 - GoTest_INT GoTest_KIND = 5 - GoTest_STRING GoTest_KIND = 6 - GoTest_TIME GoTest_KIND = 7 - // Groupings - GoTest_TUPLE GoTest_KIND = 8 - GoTest_ARRAY GoTest_KIND = 9 - GoTest_MAP GoTest_KIND = 10 - // Table types - GoTest_TABLE GoTest_KIND = 11 - // Functions - GoTest_FUNCTION GoTest_KIND = 12 -) - -var GoTest_KIND_name = map[int32]string{ - 0: "VOID", - 1: "BOOL", - 2: "BYTES", - 3: "FINGERPRINT", - 4: "FLOAT", - 5: "INT", - 6: "STRING", - 7: "TIME", - 8: "TUPLE", - 9: "ARRAY", - 10: "MAP", - 11: "TABLE", - 12: "FUNCTION", -} -var GoTest_KIND_value = map[string]int32{ - "VOID": 0, - "BOOL": 1, - "BYTES": 2, - "FINGERPRINT": 3, - "FLOAT": 4, - "INT": 5, - "STRING": 6, - "TIME": 7, - "TUPLE": 8, - "ARRAY": 9, - "MAP": 10, - "TABLE": 11, - "FUNCTION": 12, -} - -func (x GoTest_KIND) Enum() *GoTest_KIND { - p := new(GoTest_KIND) - *p = x - return p -} -func (x GoTest_KIND) String() string { - return proto.EnumName(GoTest_KIND_name, int32(x)) -} -func (x *GoTest_KIND) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(GoTest_KIND_value, data, "GoTest_KIND") - if err != nil { - return err - } - *x = GoTest_KIND(value) - return nil -} - -type MyMessage_Color int32 - -const ( - MyMessage_RED MyMessage_Color = 0 - MyMessage_GREEN MyMessage_Color = 1 - MyMessage_BLUE MyMessage_Color = 2 -) - -var MyMessage_Color_name = map[int32]string{ - 0: "RED", - 1: "GREEN", - 2: "BLUE", -} -var MyMessage_Color_value = map[string]int32{ - "RED": 0, - "GREEN": 1, - "BLUE": 2, -} - -func (x MyMessage_Color) Enum() *MyMessage_Color { - p := new(MyMessage_Color) - *p = x - return p -} -func (x MyMessage_Color) String() string { - return proto.EnumName(MyMessage_Color_name, int32(x)) -} -func (x *MyMessage_Color) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(MyMessage_Color_value, data, "MyMessage_Color") - if err != nil { - return err - } - *x = MyMessage_Color(value) - return nil -} - -type Defaults_Color int32 - -const ( - Defaults_RED Defaults_Color = 0 - Defaults_GREEN Defaults_Color = 1 - Defaults_BLUE Defaults_Color = 2 -) - -var Defaults_Color_name = map[int32]string{ - 0: "RED", - 1: "GREEN", - 2: "BLUE", -} -var Defaults_Color_value = map[string]int32{ - "RED": 0, - "GREEN": 1, - "BLUE": 2, -} - -func (x Defaults_Color) Enum() *Defaults_Color { - p := new(Defaults_Color) - *p = x - return p -} -func (x Defaults_Color) String() string { - return proto.EnumName(Defaults_Color_name, int32(x)) -} -func (x *Defaults_Color) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Defaults_Color_value, data, "Defaults_Color") - if err != nil { - return err - } - *x = Defaults_Color(value) - return nil -} - -type RepeatedEnum_Color int32 - -const ( - RepeatedEnum_RED RepeatedEnum_Color = 1 -) - -var RepeatedEnum_Color_name = map[int32]string{ - 1: "RED", -} -var RepeatedEnum_Color_value = map[string]int32{ - "RED": 1, -} - -func (x RepeatedEnum_Color) Enum() *RepeatedEnum_Color { - p := new(RepeatedEnum_Color) - *p = x - return p -} -func (x RepeatedEnum_Color) String() string { - return proto.EnumName(RepeatedEnum_Color_name, int32(x)) -} -func (x *RepeatedEnum_Color) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(RepeatedEnum_Color_value, data, "RepeatedEnum_Color") - if err != nil { - return err - } - *x = RepeatedEnum_Color(value) - return nil -} - -type GoEnum struct { - Foo *FOO `protobuf:"varint,1,req,name=foo,enum=testdata.FOO" json:"foo,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoEnum) Reset() { *m = GoEnum{} } -func (m *GoEnum) String() string { return proto.CompactTextString(m) } -func (*GoEnum) ProtoMessage() {} - -func (m *GoEnum) GetFoo() FOO { - if m != nil && m.Foo != nil { - return *m.Foo - } - return FOO_FOO1 -} - -type GoTestField struct { - Label *string `protobuf:"bytes,1,req" json:"Label,omitempty"` - Type *string `protobuf:"bytes,2,req" json:"Type,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTestField) Reset() { *m = GoTestField{} } -func (m *GoTestField) String() string { return proto.CompactTextString(m) } -func (*GoTestField) ProtoMessage() {} - -func (m *GoTestField) GetLabel() string { - if m != nil && m.Label != nil { - return *m.Label - } - return "" -} - -func (m *GoTestField) GetType() string { - if m != nil && m.Type != nil { - return *m.Type - } - return "" -} - -type GoTest struct { - // Some typical parameters - Kind *GoTest_KIND `protobuf:"varint,1,req,enum=testdata.GoTest_KIND" json:"Kind,omitempty"` - Table *string `protobuf:"bytes,2,opt" json:"Table,omitempty"` - Param *int32 `protobuf:"varint,3,opt" json:"Param,omitempty"` - // Required, repeated and optional foreign fields. - RequiredField *GoTestField `protobuf:"bytes,4,req" json:"RequiredField,omitempty"` - RepeatedField []*GoTestField `protobuf:"bytes,5,rep" json:"RepeatedField,omitempty"` - OptionalField *GoTestField `protobuf:"bytes,6,opt" json:"OptionalField,omitempty"` - // Required fields of all basic types - F_BoolRequired *bool `protobuf:"varint,10,req,name=F_Bool_required" json:"F_Bool_required,omitempty"` - F_Int32Required *int32 `protobuf:"varint,11,req,name=F_Int32_required" json:"F_Int32_required,omitempty"` - F_Int64Required *int64 `protobuf:"varint,12,req,name=F_Int64_required" json:"F_Int64_required,omitempty"` - F_Fixed32Required *uint32 `protobuf:"fixed32,13,req,name=F_Fixed32_required" json:"F_Fixed32_required,omitempty"` - F_Fixed64Required *uint64 `protobuf:"fixed64,14,req,name=F_Fixed64_required" json:"F_Fixed64_required,omitempty"` - F_Uint32Required *uint32 `protobuf:"varint,15,req,name=F_Uint32_required" json:"F_Uint32_required,omitempty"` - F_Uint64Required *uint64 `protobuf:"varint,16,req,name=F_Uint64_required" json:"F_Uint64_required,omitempty"` - F_FloatRequired *float32 `protobuf:"fixed32,17,req,name=F_Float_required" json:"F_Float_required,omitempty"` - F_DoubleRequired *float64 `protobuf:"fixed64,18,req,name=F_Double_required" json:"F_Double_required,omitempty"` - F_StringRequired *string `protobuf:"bytes,19,req,name=F_String_required" json:"F_String_required,omitempty"` - F_BytesRequired []byte `protobuf:"bytes,101,req,name=F_Bytes_required" json:"F_Bytes_required,omitempty"` - F_Sint32Required *int32 `protobuf:"zigzag32,102,req,name=F_Sint32_required" json:"F_Sint32_required,omitempty"` - F_Sint64Required *int64 `protobuf:"zigzag64,103,req,name=F_Sint64_required" json:"F_Sint64_required,omitempty"` - // Repeated fields of all basic types - F_BoolRepeated []bool `protobuf:"varint,20,rep,name=F_Bool_repeated" json:"F_Bool_repeated,omitempty"` - F_Int32Repeated []int32 `protobuf:"varint,21,rep,name=F_Int32_repeated" json:"F_Int32_repeated,omitempty"` - F_Int64Repeated []int64 `protobuf:"varint,22,rep,name=F_Int64_repeated" json:"F_Int64_repeated,omitempty"` - F_Fixed32Repeated []uint32 `protobuf:"fixed32,23,rep,name=F_Fixed32_repeated" json:"F_Fixed32_repeated,omitempty"` - F_Fixed64Repeated []uint64 `protobuf:"fixed64,24,rep,name=F_Fixed64_repeated" json:"F_Fixed64_repeated,omitempty"` - F_Uint32Repeated []uint32 `protobuf:"varint,25,rep,name=F_Uint32_repeated" json:"F_Uint32_repeated,omitempty"` - F_Uint64Repeated []uint64 `protobuf:"varint,26,rep,name=F_Uint64_repeated" json:"F_Uint64_repeated,omitempty"` - F_FloatRepeated []float32 `protobuf:"fixed32,27,rep,name=F_Float_repeated" json:"F_Float_repeated,omitempty"` - F_DoubleRepeated []float64 `protobuf:"fixed64,28,rep,name=F_Double_repeated" json:"F_Double_repeated,omitempty"` - F_StringRepeated []string `protobuf:"bytes,29,rep,name=F_String_repeated" json:"F_String_repeated,omitempty"` - F_BytesRepeated [][]byte `protobuf:"bytes,201,rep,name=F_Bytes_repeated" json:"F_Bytes_repeated,omitempty"` - F_Sint32Repeated []int32 `protobuf:"zigzag32,202,rep,name=F_Sint32_repeated" json:"F_Sint32_repeated,omitempty"` - F_Sint64Repeated []int64 `protobuf:"zigzag64,203,rep,name=F_Sint64_repeated" json:"F_Sint64_repeated,omitempty"` - // Optional fields of all basic types - F_BoolOptional *bool `protobuf:"varint,30,opt,name=F_Bool_optional" json:"F_Bool_optional,omitempty"` - F_Int32Optional *int32 `protobuf:"varint,31,opt,name=F_Int32_optional" json:"F_Int32_optional,omitempty"` - F_Int64Optional *int64 `protobuf:"varint,32,opt,name=F_Int64_optional" json:"F_Int64_optional,omitempty"` - F_Fixed32Optional *uint32 `protobuf:"fixed32,33,opt,name=F_Fixed32_optional" json:"F_Fixed32_optional,omitempty"` - F_Fixed64Optional *uint64 `protobuf:"fixed64,34,opt,name=F_Fixed64_optional" json:"F_Fixed64_optional,omitempty"` - F_Uint32Optional *uint32 `protobuf:"varint,35,opt,name=F_Uint32_optional" json:"F_Uint32_optional,omitempty"` - F_Uint64Optional *uint64 `protobuf:"varint,36,opt,name=F_Uint64_optional" json:"F_Uint64_optional,omitempty"` - F_FloatOptional *float32 `protobuf:"fixed32,37,opt,name=F_Float_optional" json:"F_Float_optional,omitempty"` - F_DoubleOptional *float64 `protobuf:"fixed64,38,opt,name=F_Double_optional" json:"F_Double_optional,omitempty"` - F_StringOptional *string `protobuf:"bytes,39,opt,name=F_String_optional" json:"F_String_optional,omitempty"` - F_BytesOptional []byte `protobuf:"bytes,301,opt,name=F_Bytes_optional" json:"F_Bytes_optional,omitempty"` - F_Sint32Optional *int32 `protobuf:"zigzag32,302,opt,name=F_Sint32_optional" json:"F_Sint32_optional,omitempty"` - F_Sint64Optional *int64 `protobuf:"zigzag64,303,opt,name=F_Sint64_optional" json:"F_Sint64_optional,omitempty"` - // Default-valued fields of all basic types - F_BoolDefaulted *bool `protobuf:"varint,40,opt,name=F_Bool_defaulted,def=1" json:"F_Bool_defaulted,omitempty"` - F_Int32Defaulted *int32 `protobuf:"varint,41,opt,name=F_Int32_defaulted,def=32" json:"F_Int32_defaulted,omitempty"` - F_Int64Defaulted *int64 `protobuf:"varint,42,opt,name=F_Int64_defaulted,def=64" json:"F_Int64_defaulted,omitempty"` - F_Fixed32Defaulted *uint32 `protobuf:"fixed32,43,opt,name=F_Fixed32_defaulted,def=320" json:"F_Fixed32_defaulted,omitempty"` - F_Fixed64Defaulted *uint64 `protobuf:"fixed64,44,opt,name=F_Fixed64_defaulted,def=640" json:"F_Fixed64_defaulted,omitempty"` - F_Uint32Defaulted *uint32 `protobuf:"varint,45,opt,name=F_Uint32_defaulted,def=3200" json:"F_Uint32_defaulted,omitempty"` - F_Uint64Defaulted *uint64 `protobuf:"varint,46,opt,name=F_Uint64_defaulted,def=6400" json:"F_Uint64_defaulted,omitempty"` - F_FloatDefaulted *float32 `protobuf:"fixed32,47,opt,name=F_Float_defaulted,def=314159" json:"F_Float_defaulted,omitempty"` - F_DoubleDefaulted *float64 `protobuf:"fixed64,48,opt,name=F_Double_defaulted,def=271828" json:"F_Double_defaulted,omitempty"` - F_StringDefaulted *string `protobuf:"bytes,49,opt,name=F_String_defaulted,def=hello, \"world!\"\n" json:"F_String_defaulted,omitempty"` - F_BytesDefaulted []byte `protobuf:"bytes,401,opt,name=F_Bytes_defaulted,def=Bignose" json:"F_Bytes_defaulted,omitempty"` - F_Sint32Defaulted *int32 `protobuf:"zigzag32,402,opt,name=F_Sint32_defaulted,def=-32" json:"F_Sint32_defaulted,omitempty"` - F_Sint64Defaulted *int64 `protobuf:"zigzag64,403,opt,name=F_Sint64_defaulted,def=-64" json:"F_Sint64_defaulted,omitempty"` - // Packed repeated fields (no string or bytes). - F_BoolRepeatedPacked []bool `protobuf:"varint,50,rep,packed,name=F_Bool_repeated_packed" json:"F_Bool_repeated_packed,omitempty"` - F_Int32RepeatedPacked []int32 `protobuf:"varint,51,rep,packed,name=F_Int32_repeated_packed" json:"F_Int32_repeated_packed,omitempty"` - F_Int64RepeatedPacked []int64 `protobuf:"varint,52,rep,packed,name=F_Int64_repeated_packed" json:"F_Int64_repeated_packed,omitempty"` - F_Fixed32RepeatedPacked []uint32 `protobuf:"fixed32,53,rep,packed,name=F_Fixed32_repeated_packed" json:"F_Fixed32_repeated_packed,omitempty"` - F_Fixed64RepeatedPacked []uint64 `protobuf:"fixed64,54,rep,packed,name=F_Fixed64_repeated_packed" json:"F_Fixed64_repeated_packed,omitempty"` - F_Uint32RepeatedPacked []uint32 `protobuf:"varint,55,rep,packed,name=F_Uint32_repeated_packed" json:"F_Uint32_repeated_packed,omitempty"` - F_Uint64RepeatedPacked []uint64 `protobuf:"varint,56,rep,packed,name=F_Uint64_repeated_packed" json:"F_Uint64_repeated_packed,omitempty"` - F_FloatRepeatedPacked []float32 `protobuf:"fixed32,57,rep,packed,name=F_Float_repeated_packed" json:"F_Float_repeated_packed,omitempty"` - F_DoubleRepeatedPacked []float64 `protobuf:"fixed64,58,rep,packed,name=F_Double_repeated_packed" json:"F_Double_repeated_packed,omitempty"` - F_Sint32RepeatedPacked []int32 `protobuf:"zigzag32,502,rep,packed,name=F_Sint32_repeated_packed" json:"F_Sint32_repeated_packed,omitempty"` - F_Sint64RepeatedPacked []int64 `protobuf:"zigzag64,503,rep,packed,name=F_Sint64_repeated_packed" json:"F_Sint64_repeated_packed,omitempty"` - Requiredgroup *GoTest_RequiredGroup `protobuf:"group,70,req,name=RequiredGroup" json:"requiredgroup,omitempty"` - Repeatedgroup []*GoTest_RepeatedGroup `protobuf:"group,80,rep,name=RepeatedGroup" json:"repeatedgroup,omitempty"` - Optionalgroup *GoTest_OptionalGroup `protobuf:"group,90,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTest) Reset() { *m = GoTest{} } -func (m *GoTest) String() string { return proto.CompactTextString(m) } -func (*GoTest) ProtoMessage() {} - -const Default_GoTest_F_BoolDefaulted bool = true -const Default_GoTest_F_Int32Defaulted int32 = 32 -const Default_GoTest_F_Int64Defaulted int64 = 64 -const Default_GoTest_F_Fixed32Defaulted uint32 = 320 -const Default_GoTest_F_Fixed64Defaulted uint64 = 640 -const Default_GoTest_F_Uint32Defaulted uint32 = 3200 -const Default_GoTest_F_Uint64Defaulted uint64 = 6400 -const Default_GoTest_F_FloatDefaulted float32 = 314159 -const Default_GoTest_F_DoubleDefaulted float64 = 271828 -const Default_GoTest_F_StringDefaulted string = "hello, \"world!\"\n" - -var Default_GoTest_F_BytesDefaulted []byte = []byte("Bignose") - -const Default_GoTest_F_Sint32Defaulted int32 = -32 -const Default_GoTest_F_Sint64Defaulted int64 = -64 - -func (m *GoTest) GetKind() GoTest_KIND { - if m != nil && m.Kind != nil { - return *m.Kind - } - return GoTest_VOID -} - -func (m *GoTest) GetTable() string { - if m != nil && m.Table != nil { - return *m.Table - } - return "" -} - -func (m *GoTest) GetParam() int32 { - if m != nil && m.Param != nil { - return *m.Param - } - return 0 -} - -func (m *GoTest) GetRequiredField() *GoTestField { - if m != nil { - return m.RequiredField - } - return nil -} - -func (m *GoTest) GetRepeatedField() []*GoTestField { - if m != nil { - return m.RepeatedField - } - return nil -} - -func (m *GoTest) GetOptionalField() *GoTestField { - if m != nil { - return m.OptionalField - } - return nil -} - -func (m *GoTest) GetF_BoolRequired() bool { - if m != nil && m.F_BoolRequired != nil { - return *m.F_BoolRequired - } - return false -} - -func (m *GoTest) GetF_Int32Required() int32 { - if m != nil && m.F_Int32Required != nil { - return *m.F_Int32Required - } - return 0 -} - -func (m *GoTest) GetF_Int64Required() int64 { - if m != nil && m.F_Int64Required != nil { - return *m.F_Int64Required - } - return 0 -} - -func (m *GoTest) GetF_Fixed32Required() uint32 { - if m != nil && m.F_Fixed32Required != nil { - return *m.F_Fixed32Required - } - return 0 -} - -func (m *GoTest) GetF_Fixed64Required() uint64 { - if m != nil && m.F_Fixed64Required != nil { - return *m.F_Fixed64Required - } - return 0 -} - -func (m *GoTest) GetF_Uint32Required() uint32 { - if m != nil && m.F_Uint32Required != nil { - return *m.F_Uint32Required - } - return 0 -} - -func (m *GoTest) GetF_Uint64Required() uint64 { - if m != nil && m.F_Uint64Required != nil { - return *m.F_Uint64Required - } - return 0 -} - -func (m *GoTest) GetF_FloatRequired() float32 { - if m != nil && m.F_FloatRequired != nil { - return *m.F_FloatRequired - } - return 0 -} - -func (m *GoTest) GetF_DoubleRequired() float64 { - if m != nil && m.F_DoubleRequired != nil { - return *m.F_DoubleRequired - } - return 0 -} - -func (m *GoTest) GetF_StringRequired() string { - if m != nil && m.F_StringRequired != nil { - return *m.F_StringRequired - } - return "" -} - -func (m *GoTest) GetF_BytesRequired() []byte { - if m != nil { - return m.F_BytesRequired - } - return nil -} - -func (m *GoTest) GetF_Sint32Required() int32 { - if m != nil && m.F_Sint32Required != nil { - return *m.F_Sint32Required - } - return 0 -} - -func (m *GoTest) GetF_Sint64Required() int64 { - if m != nil && m.F_Sint64Required != nil { - return *m.F_Sint64Required - } - return 0 -} - -func (m *GoTest) GetF_BoolRepeated() []bool { - if m != nil { - return m.F_BoolRepeated - } - return nil -} - -func (m *GoTest) GetF_Int32Repeated() []int32 { - if m != nil { - return m.F_Int32Repeated - } - return nil -} - -func (m *GoTest) GetF_Int64Repeated() []int64 { - if m != nil { - return m.F_Int64Repeated - } - return nil -} - -func (m *GoTest) GetF_Fixed32Repeated() []uint32 { - if m != nil { - return m.F_Fixed32Repeated - } - return nil -} - -func (m *GoTest) GetF_Fixed64Repeated() []uint64 { - if m != nil { - return m.F_Fixed64Repeated - } - return nil -} - -func (m *GoTest) GetF_Uint32Repeated() []uint32 { - if m != nil { - return m.F_Uint32Repeated - } - return nil -} - -func (m *GoTest) GetF_Uint64Repeated() []uint64 { - if m != nil { - return m.F_Uint64Repeated - } - return nil -} - -func (m *GoTest) GetF_FloatRepeated() []float32 { - if m != nil { - return m.F_FloatRepeated - } - return nil -} - -func (m *GoTest) GetF_DoubleRepeated() []float64 { - if m != nil { - return m.F_DoubleRepeated - } - return nil -} - -func (m *GoTest) GetF_StringRepeated() []string { - if m != nil { - return m.F_StringRepeated - } - return nil -} - -func (m *GoTest) GetF_BytesRepeated() [][]byte { - if m != nil { - return m.F_BytesRepeated - } - return nil -} - -func (m *GoTest) GetF_Sint32Repeated() []int32 { - if m != nil { - return m.F_Sint32Repeated - } - return nil -} - -func (m *GoTest) GetF_Sint64Repeated() []int64 { - if m != nil { - return m.F_Sint64Repeated - } - return nil -} - -func (m *GoTest) GetF_BoolOptional() bool { - if m != nil && m.F_BoolOptional != nil { - return *m.F_BoolOptional - } - return false -} - -func (m *GoTest) GetF_Int32Optional() int32 { - if m != nil && m.F_Int32Optional != nil { - return *m.F_Int32Optional - } - return 0 -} - -func (m *GoTest) GetF_Int64Optional() int64 { - if m != nil && m.F_Int64Optional != nil { - return *m.F_Int64Optional - } - return 0 -} - -func (m *GoTest) GetF_Fixed32Optional() uint32 { - if m != nil && m.F_Fixed32Optional != nil { - return *m.F_Fixed32Optional - } - return 0 -} - -func (m *GoTest) GetF_Fixed64Optional() uint64 { - if m != nil && m.F_Fixed64Optional != nil { - return *m.F_Fixed64Optional - } - return 0 -} - -func (m *GoTest) GetF_Uint32Optional() uint32 { - if m != nil && m.F_Uint32Optional != nil { - return *m.F_Uint32Optional - } - return 0 -} - -func (m *GoTest) GetF_Uint64Optional() uint64 { - if m != nil && m.F_Uint64Optional != nil { - return *m.F_Uint64Optional - } - return 0 -} - -func (m *GoTest) GetF_FloatOptional() float32 { - if m != nil && m.F_FloatOptional != nil { - return *m.F_FloatOptional - } - return 0 -} - -func (m *GoTest) GetF_DoubleOptional() float64 { - if m != nil && m.F_DoubleOptional != nil { - return *m.F_DoubleOptional - } - return 0 -} - -func (m *GoTest) GetF_StringOptional() string { - if m != nil && m.F_StringOptional != nil { - return *m.F_StringOptional - } - return "" -} - -func (m *GoTest) GetF_BytesOptional() []byte { - if m != nil { - return m.F_BytesOptional - } - return nil -} - -func (m *GoTest) GetF_Sint32Optional() int32 { - if m != nil && m.F_Sint32Optional != nil { - return *m.F_Sint32Optional - } - return 0 -} - -func (m *GoTest) GetF_Sint64Optional() int64 { - if m != nil && m.F_Sint64Optional != nil { - return *m.F_Sint64Optional - } - return 0 -} - -func (m *GoTest) GetF_BoolDefaulted() bool { - if m != nil && m.F_BoolDefaulted != nil { - return *m.F_BoolDefaulted - } - return Default_GoTest_F_BoolDefaulted -} - -func (m *GoTest) GetF_Int32Defaulted() int32 { - if m != nil && m.F_Int32Defaulted != nil { - return *m.F_Int32Defaulted - } - return Default_GoTest_F_Int32Defaulted -} - -func (m *GoTest) GetF_Int64Defaulted() int64 { - if m != nil && m.F_Int64Defaulted != nil { - return *m.F_Int64Defaulted - } - return Default_GoTest_F_Int64Defaulted -} - -func (m *GoTest) GetF_Fixed32Defaulted() uint32 { - if m != nil && m.F_Fixed32Defaulted != nil { - return *m.F_Fixed32Defaulted - } - return Default_GoTest_F_Fixed32Defaulted -} - -func (m *GoTest) GetF_Fixed64Defaulted() uint64 { - if m != nil && m.F_Fixed64Defaulted != nil { - return *m.F_Fixed64Defaulted - } - return Default_GoTest_F_Fixed64Defaulted -} - -func (m *GoTest) GetF_Uint32Defaulted() uint32 { - if m != nil && m.F_Uint32Defaulted != nil { - return *m.F_Uint32Defaulted - } - return Default_GoTest_F_Uint32Defaulted -} - -func (m *GoTest) GetF_Uint64Defaulted() uint64 { - if m != nil && m.F_Uint64Defaulted != nil { - return *m.F_Uint64Defaulted - } - return Default_GoTest_F_Uint64Defaulted -} - -func (m *GoTest) GetF_FloatDefaulted() float32 { - if m != nil && m.F_FloatDefaulted != nil { - return *m.F_FloatDefaulted - } - return Default_GoTest_F_FloatDefaulted -} - -func (m *GoTest) GetF_DoubleDefaulted() float64 { - if m != nil && m.F_DoubleDefaulted != nil { - return *m.F_DoubleDefaulted - } - return Default_GoTest_F_DoubleDefaulted -} - -func (m *GoTest) GetF_StringDefaulted() string { - if m != nil && m.F_StringDefaulted != nil { - return *m.F_StringDefaulted - } - return Default_GoTest_F_StringDefaulted -} - -func (m *GoTest) GetF_BytesDefaulted() []byte { - if m != nil && m.F_BytesDefaulted != nil { - return m.F_BytesDefaulted - } - return append([]byte(nil), Default_GoTest_F_BytesDefaulted...) -} - -func (m *GoTest) GetF_Sint32Defaulted() int32 { - if m != nil && m.F_Sint32Defaulted != nil { - return *m.F_Sint32Defaulted - } - return Default_GoTest_F_Sint32Defaulted -} - -func (m *GoTest) GetF_Sint64Defaulted() int64 { - if m != nil && m.F_Sint64Defaulted != nil { - return *m.F_Sint64Defaulted - } - return Default_GoTest_F_Sint64Defaulted -} - -func (m *GoTest) GetF_BoolRepeatedPacked() []bool { - if m != nil { - return m.F_BoolRepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Int32RepeatedPacked() []int32 { - if m != nil { - return m.F_Int32RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Int64RepeatedPacked() []int64 { - if m != nil { - return m.F_Int64RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Fixed32RepeatedPacked() []uint32 { - if m != nil { - return m.F_Fixed32RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Fixed64RepeatedPacked() []uint64 { - if m != nil { - return m.F_Fixed64RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Uint32RepeatedPacked() []uint32 { - if m != nil { - return m.F_Uint32RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Uint64RepeatedPacked() []uint64 { - if m != nil { - return m.F_Uint64RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_FloatRepeatedPacked() []float32 { - if m != nil { - return m.F_FloatRepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_DoubleRepeatedPacked() []float64 { - if m != nil { - return m.F_DoubleRepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Sint32RepeatedPacked() []int32 { - if m != nil { - return m.F_Sint32RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Sint64RepeatedPacked() []int64 { - if m != nil { - return m.F_Sint64RepeatedPacked - } - return nil -} - -func (m *GoTest) GetRequiredgroup() *GoTest_RequiredGroup { - if m != nil { - return m.Requiredgroup - } - return nil -} - -func (m *GoTest) GetRepeatedgroup() []*GoTest_RepeatedGroup { - if m != nil { - return m.Repeatedgroup - } - return nil -} - -func (m *GoTest) GetOptionalgroup() *GoTest_OptionalGroup { - if m != nil { - return m.Optionalgroup - } - return nil -} - -// Required, repeated, and optional groups. -type GoTest_RequiredGroup struct { - RequiredField *string `protobuf:"bytes,71,req" json:"RequiredField,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTest_RequiredGroup) Reset() { *m = GoTest_RequiredGroup{} } -func (m *GoTest_RequiredGroup) String() string { return proto.CompactTextString(m) } -func (*GoTest_RequiredGroup) ProtoMessage() {} - -func (m *GoTest_RequiredGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" -} - -type GoTest_RepeatedGroup struct { - RequiredField *string `protobuf:"bytes,81,req" json:"RequiredField,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTest_RepeatedGroup) Reset() { *m = GoTest_RepeatedGroup{} } -func (m *GoTest_RepeatedGroup) String() string { return proto.CompactTextString(m) } -func (*GoTest_RepeatedGroup) ProtoMessage() {} - -func (m *GoTest_RepeatedGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" -} - -type GoTest_OptionalGroup struct { - RequiredField *string `protobuf:"bytes,91,req" json:"RequiredField,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTest_OptionalGroup) Reset() { *m = GoTest_OptionalGroup{} } -func (m *GoTest_OptionalGroup) String() string { return proto.CompactTextString(m) } -func (*GoTest_OptionalGroup) ProtoMessage() {} - -func (m *GoTest_OptionalGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" -} - -// For testing skipping of unrecognized fields. -// Numbers are all big, larger than tag numbers in GoTestField, -// the message used in the corresponding test. -type GoSkipTest struct { - SkipInt32 *int32 `protobuf:"varint,11,req,name=skip_int32" json:"skip_int32,omitempty"` - SkipFixed32 *uint32 `protobuf:"fixed32,12,req,name=skip_fixed32" json:"skip_fixed32,omitempty"` - SkipFixed64 *uint64 `protobuf:"fixed64,13,req,name=skip_fixed64" json:"skip_fixed64,omitempty"` - SkipString *string `protobuf:"bytes,14,req,name=skip_string" json:"skip_string,omitempty"` - Skipgroup *GoSkipTest_SkipGroup `protobuf:"group,15,req,name=SkipGroup" json:"skipgroup,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoSkipTest) Reset() { *m = GoSkipTest{} } -func (m *GoSkipTest) String() string { return proto.CompactTextString(m) } -func (*GoSkipTest) ProtoMessage() {} - -func (m *GoSkipTest) GetSkipInt32() int32 { - if m != nil && m.SkipInt32 != nil { - return *m.SkipInt32 - } - return 0 -} - -func (m *GoSkipTest) GetSkipFixed32() uint32 { - if m != nil && m.SkipFixed32 != nil { - return *m.SkipFixed32 - } - return 0 -} - -func (m *GoSkipTest) GetSkipFixed64() uint64 { - if m != nil && m.SkipFixed64 != nil { - return *m.SkipFixed64 - } - return 0 -} - -func (m *GoSkipTest) GetSkipString() string { - if m != nil && m.SkipString != nil { - return *m.SkipString - } - return "" -} - -func (m *GoSkipTest) GetSkipgroup() *GoSkipTest_SkipGroup { - if m != nil { - return m.Skipgroup - } - return nil -} - -type GoSkipTest_SkipGroup struct { - GroupInt32 *int32 `protobuf:"varint,16,req,name=group_int32" json:"group_int32,omitempty"` - GroupString *string `protobuf:"bytes,17,req,name=group_string" json:"group_string,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoSkipTest_SkipGroup) Reset() { *m = GoSkipTest_SkipGroup{} } -func (m *GoSkipTest_SkipGroup) String() string { return proto.CompactTextString(m) } -func (*GoSkipTest_SkipGroup) ProtoMessage() {} - -func (m *GoSkipTest_SkipGroup) GetGroupInt32() int32 { - if m != nil && m.GroupInt32 != nil { - return *m.GroupInt32 - } - return 0 -} - -func (m *GoSkipTest_SkipGroup) GetGroupString() string { - if m != nil && m.GroupString != nil { - return *m.GroupString - } - return "" -} - -// For testing packed/non-packed decoder switching. -// A serialized instance of one should be deserializable as the other. -type NonPackedTest struct { - A []int32 `protobuf:"varint,1,rep,name=a" json:"a,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *NonPackedTest) Reset() { *m = NonPackedTest{} } -func (m *NonPackedTest) String() string { return proto.CompactTextString(m) } -func (*NonPackedTest) ProtoMessage() {} - -func (m *NonPackedTest) GetA() []int32 { - if m != nil { - return m.A - } - return nil -} - -type PackedTest struct { - B []int32 `protobuf:"varint,1,rep,packed,name=b" json:"b,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *PackedTest) Reset() { *m = PackedTest{} } -func (m *PackedTest) String() string { return proto.CompactTextString(m) } -func (*PackedTest) ProtoMessage() {} - -func (m *PackedTest) GetB() []int32 { - if m != nil { - return m.B - } - return nil -} - -type MaxTag struct { - // Maximum possible tag number. - LastField *string `protobuf:"bytes,536870911,opt,name=last_field" json:"last_field,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MaxTag) Reset() { *m = MaxTag{} } -func (m *MaxTag) String() string { return proto.CompactTextString(m) } -func (*MaxTag) ProtoMessage() {} - -func (m *MaxTag) GetLastField() string { - if m != nil && m.LastField != nil { - return *m.LastField - } - return "" -} - -type OldMessage struct { - Nested *OldMessage_Nested `protobuf:"bytes,1,opt,name=nested" json:"nested,omitempty"` - Num *int32 `protobuf:"varint,2,opt,name=num" json:"num,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *OldMessage) Reset() { *m = OldMessage{} } -func (m *OldMessage) String() string { return proto.CompactTextString(m) } -func (*OldMessage) ProtoMessage() {} - -func (m *OldMessage) GetNested() *OldMessage_Nested { - if m != nil { - return m.Nested - } - return nil -} - -func (m *OldMessage) GetNum() int32 { - if m != nil && m.Num != nil { - return *m.Num - } - return 0 -} - -type OldMessage_Nested struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *OldMessage_Nested) Reset() { *m = OldMessage_Nested{} } -func (m *OldMessage_Nested) String() string { return proto.CompactTextString(m) } -func (*OldMessage_Nested) ProtoMessage() {} - -func (m *OldMessage_Nested) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -// NewMessage is wire compatible with OldMessage; -// imagine it as a future version. -type NewMessage struct { - Nested *NewMessage_Nested `protobuf:"bytes,1,opt,name=nested" json:"nested,omitempty"` - // This is an int32 in OldMessage. - Num *int64 `protobuf:"varint,2,opt,name=num" json:"num,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *NewMessage) Reset() { *m = NewMessage{} } -func (m *NewMessage) String() string { return proto.CompactTextString(m) } -func (*NewMessage) ProtoMessage() {} - -func (m *NewMessage) GetNested() *NewMessage_Nested { - if m != nil { - return m.Nested - } - return nil -} - -func (m *NewMessage) GetNum() int64 { - if m != nil && m.Num != nil { - return *m.Num - } - return 0 -} - -type NewMessage_Nested struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - FoodGroup *string `protobuf:"bytes,2,opt,name=food_group" json:"food_group,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *NewMessage_Nested) Reset() { *m = NewMessage_Nested{} } -func (m *NewMessage_Nested) String() string { return proto.CompactTextString(m) } -func (*NewMessage_Nested) ProtoMessage() {} - -func (m *NewMessage_Nested) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *NewMessage_Nested) GetFoodGroup() string { - if m != nil && m.FoodGroup != nil { - return *m.FoodGroup - } - return "" -} - -type InnerMessage struct { - Host *string `protobuf:"bytes,1,req,name=host" json:"host,omitempty"` - Port *int32 `protobuf:"varint,2,opt,name=port,def=4000" json:"port,omitempty"` - Connected *bool `protobuf:"varint,3,opt,name=connected" json:"connected,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *InnerMessage) Reset() { *m = InnerMessage{} } -func (m *InnerMessage) String() string { return proto.CompactTextString(m) } -func (*InnerMessage) ProtoMessage() {} - -const Default_InnerMessage_Port int32 = 4000 - -func (m *InnerMessage) GetHost() string { - if m != nil && m.Host != nil { - return *m.Host - } - return "" -} - -func (m *InnerMessage) GetPort() int32 { - if m != nil && m.Port != nil { - return *m.Port - } - return Default_InnerMessage_Port -} - -func (m *InnerMessage) GetConnected() bool { - if m != nil && m.Connected != nil { - return *m.Connected - } - return false -} - -type OtherMessage struct { - Key *int64 `protobuf:"varint,1,opt,name=key" json:"key,omitempty"` - Value []byte `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` - Weight *float32 `protobuf:"fixed32,3,opt,name=weight" json:"weight,omitempty"` - Inner *InnerMessage `protobuf:"bytes,4,opt,name=inner" json:"inner,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *OtherMessage) Reset() { *m = OtherMessage{} } -func (m *OtherMessage) String() string { return proto.CompactTextString(m) } -func (*OtherMessage) ProtoMessage() {} - -func (m *OtherMessage) GetKey() int64 { - if m != nil && m.Key != nil { - return *m.Key - } - return 0 -} - -func (m *OtherMessage) GetValue() []byte { - if m != nil { - return m.Value - } - return nil -} - -func (m *OtherMessage) GetWeight() float32 { - if m != nil && m.Weight != nil { - return *m.Weight - } - return 0 -} - -func (m *OtherMessage) GetInner() *InnerMessage { - if m != nil { - return m.Inner - } - return nil -} - -type MyMessage struct { - Count *int32 `protobuf:"varint,1,req,name=count" json:"count,omitempty"` - Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` - Quote *string `protobuf:"bytes,3,opt,name=quote" json:"quote,omitempty"` - Pet []string `protobuf:"bytes,4,rep,name=pet" json:"pet,omitempty"` - Inner *InnerMessage `protobuf:"bytes,5,opt,name=inner" json:"inner,omitempty"` - Others []*OtherMessage `protobuf:"bytes,6,rep,name=others" json:"others,omitempty"` - RepInner []*InnerMessage `protobuf:"bytes,12,rep,name=rep_inner" json:"rep_inner,omitempty"` - Bikeshed *MyMessage_Color `protobuf:"varint,7,opt,name=bikeshed,enum=testdata.MyMessage_Color" json:"bikeshed,omitempty"` - Somegroup *MyMessage_SomeGroup `protobuf:"group,8,opt,name=SomeGroup" json:"somegroup,omitempty"` - // This field becomes [][]byte in the generated code. - RepBytes [][]byte `protobuf:"bytes,10,rep,name=rep_bytes" json:"rep_bytes,omitempty"` - Bigfloat *float64 `protobuf:"fixed64,11,opt,name=bigfloat" json:"bigfloat,omitempty"` - XXX_extensions map[int32]proto.Extension `json:"-"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MyMessage) Reset() { *m = MyMessage{} } -func (m *MyMessage) String() string { return proto.CompactTextString(m) } -func (*MyMessage) ProtoMessage() {} - -var extRange_MyMessage = []proto.ExtensionRange{ - {100, 536870911}, -} - -func (*MyMessage) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_MyMessage -} -func (m *MyMessage) ExtensionMap() map[int32]proto.Extension { - if m.XXX_extensions == nil { - m.XXX_extensions = make(map[int32]proto.Extension) - } - return m.XXX_extensions -} - -func (m *MyMessage) GetCount() int32 { - if m != nil && m.Count != nil { - return *m.Count - } - return 0 -} - -func (m *MyMessage) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *MyMessage) GetQuote() string { - if m != nil && m.Quote != nil { - return *m.Quote - } - return "" -} - -func (m *MyMessage) GetPet() []string { - if m != nil { - return m.Pet - } - return nil -} - -func (m *MyMessage) GetInner() *InnerMessage { - if m != nil { - return m.Inner - } - return nil -} - -func (m *MyMessage) GetOthers() []*OtherMessage { - if m != nil { - return m.Others - } - return nil -} - -func (m *MyMessage) GetRepInner() []*InnerMessage { - if m != nil { - return m.RepInner - } - return nil -} - -func (m *MyMessage) GetBikeshed() MyMessage_Color { - if m != nil && m.Bikeshed != nil { - return *m.Bikeshed - } - return MyMessage_RED -} - -func (m *MyMessage) GetSomegroup() *MyMessage_SomeGroup { - if m != nil { - return m.Somegroup - } - return nil -} - -func (m *MyMessage) GetRepBytes() [][]byte { - if m != nil { - return m.RepBytes - } - return nil -} - -func (m *MyMessage) GetBigfloat() float64 { - if m != nil && m.Bigfloat != nil { - return *m.Bigfloat - } - return 0 -} - -type MyMessage_SomeGroup struct { - GroupField *int32 `protobuf:"varint,9,opt,name=group_field" json:"group_field,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MyMessage_SomeGroup) Reset() { *m = MyMessage_SomeGroup{} } -func (m *MyMessage_SomeGroup) String() string { return proto.CompactTextString(m) } -func (*MyMessage_SomeGroup) ProtoMessage() {} - -func (m *MyMessage_SomeGroup) GetGroupField() int32 { - if m != nil && m.GroupField != nil { - return *m.GroupField - } - return 0 -} - -type Ext struct { - Data *string `protobuf:"bytes,1,opt,name=data" json:"data,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Ext) Reset() { *m = Ext{} } -func (m *Ext) String() string { return proto.CompactTextString(m) } -func (*Ext) ProtoMessage() {} - -func (m *Ext) GetData() string { - if m != nil && m.Data != nil { - return *m.Data - } - return "" -} - -var E_Ext_More = &proto.ExtensionDesc{ - ExtendedType: (*MyMessage)(nil), - ExtensionType: (*Ext)(nil), - Field: 103, - Name: "testdata.Ext.more", - Tag: "bytes,103,opt,name=more", -} - -var E_Ext_Text = &proto.ExtensionDesc{ - ExtendedType: (*MyMessage)(nil), - ExtensionType: (*string)(nil), - Field: 104, - Name: "testdata.Ext.text", - Tag: "bytes,104,opt,name=text", -} - -var E_Ext_Number = &proto.ExtensionDesc{ - ExtendedType: (*MyMessage)(nil), - ExtensionType: (*int32)(nil), - Field: 105, - Name: "testdata.Ext.number", - Tag: "varint,105,opt,name=number", -} - -type MyMessageSet struct { - XXX_extensions map[int32]proto.Extension `json:"-"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MyMessageSet) Reset() { *m = MyMessageSet{} } -func (m *MyMessageSet) String() string { return proto.CompactTextString(m) } -func (*MyMessageSet) ProtoMessage() {} - -func (m *MyMessageSet) Marshal() ([]byte, error) { - return proto.MarshalMessageSet(m.ExtensionMap()) -} -func (m *MyMessageSet) Unmarshal(buf []byte) error { - return proto.UnmarshalMessageSet(buf, m.ExtensionMap()) -} -func (m *MyMessageSet) MarshalJSON() ([]byte, error) { - return proto.MarshalMessageSetJSON(m.XXX_extensions) -} -func (m *MyMessageSet) UnmarshalJSON(buf []byte) error { - return proto.UnmarshalMessageSetJSON(buf, m.XXX_extensions) -} - -// ensure MyMessageSet satisfies proto.Marshaler and proto.Unmarshaler -var _ proto.Marshaler = (*MyMessageSet)(nil) -var _ proto.Unmarshaler = (*MyMessageSet)(nil) - -var extRange_MyMessageSet = []proto.ExtensionRange{ - {100, 2147483646}, -} - -func (*MyMessageSet) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_MyMessageSet -} -func (m *MyMessageSet) ExtensionMap() map[int32]proto.Extension { - if m.XXX_extensions == nil { - m.XXX_extensions = make(map[int32]proto.Extension) - } - return m.XXX_extensions -} - -type Empty struct { - XXX_unrecognized []byte `json:"-"` -} - -func (m *Empty) Reset() { *m = Empty{} } -func (m *Empty) String() string { return proto.CompactTextString(m) } -func (*Empty) ProtoMessage() {} - -type MessageList struct { - Message []*MessageList_Message `protobuf:"group,1,rep" json:"message,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MessageList) Reset() { *m = MessageList{} } -func (m *MessageList) String() string { return proto.CompactTextString(m) } -func (*MessageList) ProtoMessage() {} - -func (m *MessageList) GetMessage() []*MessageList_Message { - if m != nil { - return m.Message - } - return nil -} - -type MessageList_Message struct { - Name *string `protobuf:"bytes,2,req,name=name" json:"name,omitempty"` - Count *int32 `protobuf:"varint,3,req,name=count" json:"count,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MessageList_Message) Reset() { *m = MessageList_Message{} } -func (m *MessageList_Message) String() string { return proto.CompactTextString(m) } -func (*MessageList_Message) ProtoMessage() {} - -func (m *MessageList_Message) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *MessageList_Message) GetCount() int32 { - if m != nil && m.Count != nil { - return *m.Count - } - return 0 -} - -type Strings struct { - StringField *string `protobuf:"bytes,1,opt,name=string_field" json:"string_field,omitempty"` - BytesField []byte `protobuf:"bytes,2,opt,name=bytes_field" json:"bytes_field,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Strings) Reset() { *m = Strings{} } -func (m *Strings) String() string { return proto.CompactTextString(m) } -func (*Strings) ProtoMessage() {} - -func (m *Strings) GetStringField() string { - if m != nil && m.StringField != nil { - return *m.StringField - } - return "" -} - -func (m *Strings) GetBytesField() []byte { - if m != nil { - return m.BytesField - } - return nil -} - -type Defaults struct { - // Default-valued fields of all basic types. - // Same as GoTest, but copied here to make testing easier. - F_Bool *bool `protobuf:"varint,1,opt,def=1" json:"F_Bool,omitempty"` - F_Int32 *int32 `protobuf:"varint,2,opt,def=32" json:"F_Int32,omitempty"` - F_Int64 *int64 `protobuf:"varint,3,opt,def=64" json:"F_Int64,omitempty"` - F_Fixed32 *uint32 `protobuf:"fixed32,4,opt,def=320" json:"F_Fixed32,omitempty"` - F_Fixed64 *uint64 `protobuf:"fixed64,5,opt,def=640" json:"F_Fixed64,omitempty"` - F_Uint32 *uint32 `protobuf:"varint,6,opt,def=3200" json:"F_Uint32,omitempty"` - F_Uint64 *uint64 `protobuf:"varint,7,opt,def=6400" json:"F_Uint64,omitempty"` - F_Float *float32 `protobuf:"fixed32,8,opt,def=314159" json:"F_Float,omitempty"` - F_Double *float64 `protobuf:"fixed64,9,opt,def=271828" json:"F_Double,omitempty"` - F_String *string `protobuf:"bytes,10,opt,def=hello, \"world!\"\n" json:"F_String,omitempty"` - F_Bytes []byte `protobuf:"bytes,11,opt,def=Bignose" json:"F_Bytes,omitempty"` - F_Sint32 *int32 `protobuf:"zigzag32,12,opt,def=-32" json:"F_Sint32,omitempty"` - F_Sint64 *int64 `protobuf:"zigzag64,13,opt,def=-64" json:"F_Sint64,omitempty"` - F_Enum *Defaults_Color `protobuf:"varint,14,opt,enum=testdata.Defaults_Color,def=1" json:"F_Enum,omitempty"` - // More fields with crazy defaults. - F_Pinf *float32 `protobuf:"fixed32,15,opt,def=inf" json:"F_Pinf,omitempty"` - F_Ninf *float32 `protobuf:"fixed32,16,opt,def=-inf" json:"F_Ninf,omitempty"` - F_Nan *float32 `protobuf:"fixed32,17,opt,def=nan" json:"F_Nan,omitempty"` - // Sub-message. - Sub *SubDefaults `protobuf:"bytes,18,opt,name=sub" json:"sub,omitempty"` - // Redundant but explicit defaults. - StrZero *string `protobuf:"bytes,19,opt,name=str_zero,def=" json:"str_zero,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Defaults) Reset() { *m = Defaults{} } -func (m *Defaults) String() string { return proto.CompactTextString(m) } -func (*Defaults) ProtoMessage() {} - -const Default_Defaults_F_Bool bool = true -const Default_Defaults_F_Int32 int32 = 32 -const Default_Defaults_F_Int64 int64 = 64 -const Default_Defaults_F_Fixed32 uint32 = 320 -const Default_Defaults_F_Fixed64 uint64 = 640 -const Default_Defaults_F_Uint32 uint32 = 3200 -const Default_Defaults_F_Uint64 uint64 = 6400 -const Default_Defaults_F_Float float32 = 314159 -const Default_Defaults_F_Double float64 = 271828 -const Default_Defaults_F_String string = "hello, \"world!\"\n" - -var Default_Defaults_F_Bytes []byte = []byte("Bignose") - -const Default_Defaults_F_Sint32 int32 = -32 -const Default_Defaults_F_Sint64 int64 = -64 -const Default_Defaults_F_Enum Defaults_Color = Defaults_GREEN - -var Default_Defaults_F_Pinf float32 = float32(math.Inf(1)) -var Default_Defaults_F_Ninf float32 = float32(math.Inf(-1)) -var Default_Defaults_F_Nan float32 = float32(math.NaN()) - -func (m *Defaults) GetF_Bool() bool { - if m != nil && m.F_Bool != nil { - return *m.F_Bool - } - return Default_Defaults_F_Bool -} - -func (m *Defaults) GetF_Int32() int32 { - if m != nil && m.F_Int32 != nil { - return *m.F_Int32 - } - return Default_Defaults_F_Int32 -} - -func (m *Defaults) GetF_Int64() int64 { - if m != nil && m.F_Int64 != nil { - return *m.F_Int64 - } - return Default_Defaults_F_Int64 -} - -func (m *Defaults) GetF_Fixed32() uint32 { - if m != nil && m.F_Fixed32 != nil { - return *m.F_Fixed32 - } - return Default_Defaults_F_Fixed32 -} - -func (m *Defaults) GetF_Fixed64() uint64 { - if m != nil && m.F_Fixed64 != nil { - return *m.F_Fixed64 - } - return Default_Defaults_F_Fixed64 -} - -func (m *Defaults) GetF_Uint32() uint32 { - if m != nil && m.F_Uint32 != nil { - return *m.F_Uint32 - } - return Default_Defaults_F_Uint32 -} - -func (m *Defaults) GetF_Uint64() uint64 { - if m != nil && m.F_Uint64 != nil { - return *m.F_Uint64 - } - return Default_Defaults_F_Uint64 -} - -func (m *Defaults) GetF_Float() float32 { - if m != nil && m.F_Float != nil { - return *m.F_Float - } - return Default_Defaults_F_Float -} - -func (m *Defaults) GetF_Double() float64 { - if m != nil && m.F_Double != nil { - return *m.F_Double - } - return Default_Defaults_F_Double -} - -func (m *Defaults) GetF_String() string { - if m != nil && m.F_String != nil { - return *m.F_String - } - return Default_Defaults_F_String -} - -func (m *Defaults) GetF_Bytes() []byte { - if m != nil && m.F_Bytes != nil { - return m.F_Bytes - } - return append([]byte(nil), Default_Defaults_F_Bytes...) -} - -func (m *Defaults) GetF_Sint32() int32 { - if m != nil && m.F_Sint32 != nil { - return *m.F_Sint32 - } - return Default_Defaults_F_Sint32 -} - -func (m *Defaults) GetF_Sint64() int64 { - if m != nil && m.F_Sint64 != nil { - return *m.F_Sint64 - } - return Default_Defaults_F_Sint64 -} - -func (m *Defaults) GetF_Enum() Defaults_Color { - if m != nil && m.F_Enum != nil { - return *m.F_Enum - } - return Default_Defaults_F_Enum -} - -func (m *Defaults) GetF_Pinf() float32 { - if m != nil && m.F_Pinf != nil { - return *m.F_Pinf - } - return Default_Defaults_F_Pinf -} - -func (m *Defaults) GetF_Ninf() float32 { - if m != nil && m.F_Ninf != nil { - return *m.F_Ninf - } - return Default_Defaults_F_Ninf -} - -func (m *Defaults) GetF_Nan() float32 { - if m != nil && m.F_Nan != nil { - return *m.F_Nan - } - return Default_Defaults_F_Nan -} - -func (m *Defaults) GetSub() *SubDefaults { - if m != nil { - return m.Sub - } - return nil -} - -func (m *Defaults) GetStrZero() string { - if m != nil && m.StrZero != nil { - return *m.StrZero - } - return "" -} - -type SubDefaults struct { - N *int64 `protobuf:"varint,1,opt,name=n,def=7" json:"n,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *SubDefaults) Reset() { *m = SubDefaults{} } -func (m *SubDefaults) String() string { return proto.CompactTextString(m) } -func (*SubDefaults) ProtoMessage() {} - -const Default_SubDefaults_N int64 = 7 - -func (m *SubDefaults) GetN() int64 { - if m != nil && m.N != nil { - return *m.N - } - return Default_SubDefaults_N -} - -type RepeatedEnum struct { - Color []RepeatedEnum_Color `protobuf:"varint,1,rep,name=color,enum=testdata.RepeatedEnum_Color" json:"color,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *RepeatedEnum) Reset() { *m = RepeatedEnum{} } -func (m *RepeatedEnum) String() string { return proto.CompactTextString(m) } -func (*RepeatedEnum) ProtoMessage() {} - -func (m *RepeatedEnum) GetColor() []RepeatedEnum_Color { - if m != nil { - return m.Color - } - return nil -} - -type MoreRepeated struct { - Bools []bool `protobuf:"varint,1,rep,name=bools" json:"bools,omitempty"` - BoolsPacked []bool `protobuf:"varint,2,rep,packed,name=bools_packed" json:"bools_packed,omitempty"` - Ints []int32 `protobuf:"varint,3,rep,name=ints" json:"ints,omitempty"` - IntsPacked []int32 `protobuf:"varint,4,rep,packed,name=ints_packed" json:"ints_packed,omitempty"` - Int64SPacked []int64 `protobuf:"varint,7,rep,packed,name=int64s_packed" json:"int64s_packed,omitempty"` - Strings []string `protobuf:"bytes,5,rep,name=strings" json:"strings,omitempty"` - Fixeds []uint32 `protobuf:"fixed32,6,rep,name=fixeds" json:"fixeds,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MoreRepeated) Reset() { *m = MoreRepeated{} } -func (m *MoreRepeated) String() string { return proto.CompactTextString(m) } -func (*MoreRepeated) ProtoMessage() {} - -func (m *MoreRepeated) GetBools() []bool { - if m != nil { - return m.Bools - } - return nil -} - -func (m *MoreRepeated) GetBoolsPacked() []bool { - if m != nil { - return m.BoolsPacked - } - return nil -} - -func (m *MoreRepeated) GetInts() []int32 { - if m != nil { - return m.Ints - } - return nil -} - -func (m *MoreRepeated) GetIntsPacked() []int32 { - if m != nil { - return m.IntsPacked - } - return nil -} - -func (m *MoreRepeated) GetInt64SPacked() []int64 { - if m != nil { - return m.Int64SPacked - } - return nil -} - -func (m *MoreRepeated) GetStrings() []string { - if m != nil { - return m.Strings - } - return nil -} - -func (m *MoreRepeated) GetFixeds() []uint32 { - if m != nil { - return m.Fixeds - } - return nil -} - -type GroupOld struct { - G *GroupOld_G `protobuf:"group,101,opt" json:"g,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GroupOld) Reset() { *m = GroupOld{} } -func (m *GroupOld) String() string { return proto.CompactTextString(m) } -func (*GroupOld) ProtoMessage() {} - -func (m *GroupOld) GetG() *GroupOld_G { - if m != nil { - return m.G - } - return nil -} - -type GroupOld_G struct { - X *int32 `protobuf:"varint,2,opt,name=x" json:"x,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GroupOld_G) Reset() { *m = GroupOld_G{} } -func (m *GroupOld_G) String() string { return proto.CompactTextString(m) } -func (*GroupOld_G) ProtoMessage() {} - -func (m *GroupOld_G) GetX() int32 { - if m != nil && m.X != nil { - return *m.X - } - return 0 -} - -type GroupNew struct { - G *GroupNew_G `protobuf:"group,101,opt" json:"g,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GroupNew) Reset() { *m = GroupNew{} } -func (m *GroupNew) String() string { return proto.CompactTextString(m) } -func (*GroupNew) ProtoMessage() {} - -func (m *GroupNew) GetG() *GroupNew_G { - if m != nil { - return m.G - } - return nil -} - -type GroupNew_G struct { - X *int32 `protobuf:"varint,2,opt,name=x" json:"x,omitempty"` - Y *int32 `protobuf:"varint,3,opt,name=y" json:"y,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GroupNew_G) Reset() { *m = GroupNew_G{} } -func (m *GroupNew_G) String() string { return proto.CompactTextString(m) } -func (*GroupNew_G) ProtoMessage() {} - -func (m *GroupNew_G) GetX() int32 { - if m != nil && m.X != nil { - return *m.X - } - return 0 -} - -func (m *GroupNew_G) GetY() int32 { - if m != nil && m.Y != nil { - return *m.Y - } - return 0 -} - -type FloatingPoint struct { - F *float64 `protobuf:"fixed64,1,req,name=f" json:"f,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *FloatingPoint) Reset() { *m = FloatingPoint{} } -func (m *FloatingPoint) String() string { return proto.CompactTextString(m) } -func (*FloatingPoint) ProtoMessage() {} - -func (m *FloatingPoint) GetF() float64 { - if m != nil && m.F != nil { - return *m.F - } - return 0 -} - -var E_Greeting = &proto.ExtensionDesc{ - ExtendedType: (*MyMessage)(nil), - ExtensionType: ([]string)(nil), - Field: 106, - Name: "testdata.greeting", - Tag: "bytes,106,rep,name=greeting", -} - -var E_X201 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 201, - Name: "testdata.x201", - Tag: "bytes,201,opt,name=x201", -} - -var E_X202 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 202, - Name: "testdata.x202", - Tag: "bytes,202,opt,name=x202", -} - -var E_X203 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 203, - Name: "testdata.x203", - Tag: "bytes,203,opt,name=x203", -} - -var E_X204 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 204, - Name: "testdata.x204", - Tag: "bytes,204,opt,name=x204", -} - -var E_X205 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 205, - Name: "testdata.x205", - Tag: "bytes,205,opt,name=x205", -} - -var E_X206 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 206, - Name: "testdata.x206", - Tag: "bytes,206,opt,name=x206", -} - -var E_X207 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 207, - Name: "testdata.x207", - Tag: "bytes,207,opt,name=x207", -} - -var E_X208 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 208, - Name: "testdata.x208", - Tag: "bytes,208,opt,name=x208", -} - -var E_X209 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 209, - Name: "testdata.x209", - Tag: "bytes,209,opt,name=x209", -} - -var E_X210 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 210, - Name: "testdata.x210", - Tag: "bytes,210,opt,name=x210", -} - -var E_X211 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 211, - Name: "testdata.x211", - Tag: "bytes,211,opt,name=x211", -} - -var E_X212 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 212, - Name: "testdata.x212", - Tag: "bytes,212,opt,name=x212", -} - -var E_X213 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 213, - Name: "testdata.x213", - Tag: "bytes,213,opt,name=x213", -} - -var E_X214 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 214, - Name: "testdata.x214", - Tag: "bytes,214,opt,name=x214", -} - -var E_X215 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 215, - Name: "testdata.x215", - Tag: "bytes,215,opt,name=x215", -} - -var E_X216 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 216, - Name: "testdata.x216", - Tag: "bytes,216,opt,name=x216", -} - -var E_X217 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 217, - Name: "testdata.x217", - Tag: "bytes,217,opt,name=x217", -} - -var E_X218 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 218, - Name: "testdata.x218", - Tag: "bytes,218,opt,name=x218", -} - -var E_X219 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 219, - Name: "testdata.x219", - Tag: "bytes,219,opt,name=x219", -} - -var E_X220 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 220, - Name: "testdata.x220", - Tag: "bytes,220,opt,name=x220", -} - -var E_X221 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 221, - Name: "testdata.x221", - Tag: "bytes,221,opt,name=x221", -} - -var E_X222 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 222, - Name: "testdata.x222", - Tag: "bytes,222,opt,name=x222", -} - -var E_X223 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 223, - Name: "testdata.x223", - Tag: "bytes,223,opt,name=x223", -} - -var E_X224 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 224, - Name: "testdata.x224", - Tag: "bytes,224,opt,name=x224", -} - -var E_X225 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 225, - Name: "testdata.x225", - Tag: "bytes,225,opt,name=x225", -} - -var E_X226 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 226, - Name: "testdata.x226", - Tag: "bytes,226,opt,name=x226", -} - -var E_X227 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 227, - Name: "testdata.x227", - Tag: "bytes,227,opt,name=x227", -} - -var E_X228 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 228, - Name: "testdata.x228", - Tag: "bytes,228,opt,name=x228", -} - -var E_X229 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 229, - Name: "testdata.x229", - Tag: "bytes,229,opt,name=x229", -} - -var E_X230 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 230, - Name: "testdata.x230", - Tag: "bytes,230,opt,name=x230", -} - -var E_X231 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 231, - Name: "testdata.x231", - Tag: "bytes,231,opt,name=x231", -} - -var E_X232 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 232, - Name: "testdata.x232", - Tag: "bytes,232,opt,name=x232", -} - -var E_X233 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 233, - Name: "testdata.x233", - Tag: "bytes,233,opt,name=x233", -} - -var E_X234 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 234, - Name: "testdata.x234", - Tag: "bytes,234,opt,name=x234", -} - -var E_X235 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 235, - Name: "testdata.x235", - Tag: "bytes,235,opt,name=x235", -} - -var E_X236 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 236, - Name: "testdata.x236", - Tag: "bytes,236,opt,name=x236", -} - -var E_X237 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 237, - Name: "testdata.x237", - Tag: "bytes,237,opt,name=x237", -} - -var E_X238 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 238, - Name: "testdata.x238", - Tag: "bytes,238,opt,name=x238", -} - -var E_X239 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 239, - Name: "testdata.x239", - Tag: "bytes,239,opt,name=x239", -} - -var E_X240 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 240, - Name: "testdata.x240", - Tag: "bytes,240,opt,name=x240", -} - -var E_X241 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 241, - Name: "testdata.x241", - Tag: "bytes,241,opt,name=x241", -} - -var E_X242 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 242, - Name: "testdata.x242", - Tag: "bytes,242,opt,name=x242", -} - -var E_X243 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 243, - Name: "testdata.x243", - Tag: "bytes,243,opt,name=x243", -} - -var E_X244 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 244, - Name: "testdata.x244", - Tag: "bytes,244,opt,name=x244", -} - -var E_X245 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 245, - Name: "testdata.x245", - Tag: "bytes,245,opt,name=x245", -} - -var E_X246 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 246, - Name: "testdata.x246", - Tag: "bytes,246,opt,name=x246", -} - -var E_X247 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 247, - Name: "testdata.x247", - Tag: "bytes,247,opt,name=x247", -} - -var E_X248 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 248, - Name: "testdata.x248", - Tag: "bytes,248,opt,name=x248", -} - -var E_X249 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 249, - Name: "testdata.x249", - Tag: "bytes,249,opt,name=x249", -} - -var E_X250 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 250, - Name: "testdata.x250", - Tag: "bytes,250,opt,name=x250", -} - -func init() { - proto.RegisterEnum("testdata.FOO", FOO_name, FOO_value) - proto.RegisterEnum("testdata.GoTest_KIND", GoTest_KIND_name, GoTest_KIND_value) - proto.RegisterEnum("testdata.MyMessage_Color", MyMessage_Color_name, MyMessage_Color_value) - proto.RegisterEnum("testdata.Defaults_Color", Defaults_Color_name, Defaults_Color_value) - proto.RegisterEnum("testdata.RepeatedEnum_Color", RepeatedEnum_Color_name, RepeatedEnum_Color_value) - proto.RegisterExtension(E_Ext_More) - proto.RegisterExtension(E_Ext_Text) - proto.RegisterExtension(E_Ext_Number) - proto.RegisterExtension(E_Greeting) - proto.RegisterExtension(E_X201) - proto.RegisterExtension(E_X202) - proto.RegisterExtension(E_X203) - proto.RegisterExtension(E_X204) - proto.RegisterExtension(E_X205) - proto.RegisterExtension(E_X206) - proto.RegisterExtension(E_X207) - proto.RegisterExtension(E_X208) - proto.RegisterExtension(E_X209) - proto.RegisterExtension(E_X210) - proto.RegisterExtension(E_X211) - proto.RegisterExtension(E_X212) - proto.RegisterExtension(E_X213) - proto.RegisterExtension(E_X214) - proto.RegisterExtension(E_X215) - proto.RegisterExtension(E_X216) - proto.RegisterExtension(E_X217) - proto.RegisterExtension(E_X218) - proto.RegisterExtension(E_X219) - proto.RegisterExtension(E_X220) - proto.RegisterExtension(E_X221) - proto.RegisterExtension(E_X222) - proto.RegisterExtension(E_X223) - proto.RegisterExtension(E_X224) - proto.RegisterExtension(E_X225) - proto.RegisterExtension(E_X226) - proto.RegisterExtension(E_X227) - proto.RegisterExtension(E_X228) - proto.RegisterExtension(E_X229) - proto.RegisterExtension(E_X230) - proto.RegisterExtension(E_X231) - proto.RegisterExtension(E_X232) - proto.RegisterExtension(E_X233) - proto.RegisterExtension(E_X234) - proto.RegisterExtension(E_X235) - proto.RegisterExtension(E_X236) - proto.RegisterExtension(E_X237) - proto.RegisterExtension(E_X238) - proto.RegisterExtension(E_X239) - proto.RegisterExtension(E_X240) - proto.RegisterExtension(E_X241) - proto.RegisterExtension(E_X242) - proto.RegisterExtension(E_X243) - proto.RegisterExtension(E_X244) - proto.RegisterExtension(E_X245) - proto.RegisterExtension(E_X246) - proto.RegisterExtension(E_X247) - proto.RegisterExtension(E_X248) - proto.RegisterExtension(E_X249) - proto.RegisterExtension(E_X250) -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.pb.go.golden b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.pb.go.golden deleted file mode 100644 index 0387853d56c..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.pb.go.golden +++ /dev/null @@ -1,1737 +0,0 @@ -// Code generated by protoc-gen-gogo. -// source: test.proto -// DO NOT EDIT! - -package testdata - -import proto "github.com/gogo/protobuf/proto" -import json "encoding/json" -import math "math" - -import () - -// Reference proto, json, and math imports to suppress error if they are not otherwise used. -var _ = proto.Marshal -var _ = &json.SyntaxError{} -var _ = math.Inf - -type FOO int32 - -const ( - FOO_FOO1 FOO = 1 -) - -var FOO_name = map[int32]string{ - 1: "FOO1", -} -var FOO_value = map[string]int32{ - "FOO1": 1, -} - -func (x FOO) Enum() *FOO { - p := new(FOO) - *p = x - return p -} -func (x FOO) String() string { - return proto.EnumName(FOO_name, int32(x)) -} -func (x FOO) MarshalJSON() ([]byte, error) { - return json.Marshal(x.String()) -} -func (x *FOO) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(FOO_value, data, "FOO") - if err != nil { - return err - } - *x = FOO(value) - return nil -} - -type GoTest_KIND int32 - -const ( - GoTest_VOID GoTest_KIND = 0 - GoTest_BOOL GoTest_KIND = 1 - GoTest_BYTES GoTest_KIND = 2 - GoTest_FINGERPRINT GoTest_KIND = 3 - GoTest_FLOAT GoTest_KIND = 4 - GoTest_INT GoTest_KIND = 5 - GoTest_STRING GoTest_KIND = 6 - GoTest_TIME GoTest_KIND = 7 - GoTest_TUPLE GoTest_KIND = 8 - GoTest_ARRAY GoTest_KIND = 9 - GoTest_MAP GoTest_KIND = 10 - GoTest_TABLE GoTest_KIND = 11 - GoTest_FUNCTION GoTest_KIND = 12 -) - -var GoTest_KIND_name = map[int32]string{ - 0: "VOID", - 1: "BOOL", - 2: "BYTES", - 3: "FINGERPRINT", - 4: "FLOAT", - 5: "INT", - 6: "STRING", - 7: "TIME", - 8: "TUPLE", - 9: "ARRAY", - 10: "MAP", - 11: "TABLE", - 12: "FUNCTION", -} -var GoTest_KIND_value = map[string]int32{ - "VOID": 0, - "BOOL": 1, - "BYTES": 2, - "FINGERPRINT": 3, - "FLOAT": 4, - "INT": 5, - "STRING": 6, - "TIME": 7, - "TUPLE": 8, - "ARRAY": 9, - "MAP": 10, - "TABLE": 11, - "FUNCTION": 12, -} - -func (x GoTest_KIND) Enum() *GoTest_KIND { - p := new(GoTest_KIND) - *p = x - return p -} -func (x GoTest_KIND) String() string { - return proto.EnumName(GoTest_KIND_name, int32(x)) -} -func (x GoTest_KIND) MarshalJSON() ([]byte, error) { - return json.Marshal(x.String()) -} -func (x *GoTest_KIND) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(GoTest_KIND_value, data, "GoTest_KIND") - if err != nil { - return err - } - *x = GoTest_KIND(value) - return nil -} - -type MyMessage_Color int32 - -const ( - MyMessage_RED MyMessage_Color = 0 - MyMessage_GREEN MyMessage_Color = 1 - MyMessage_BLUE MyMessage_Color = 2 -) - -var MyMessage_Color_name = map[int32]string{ - 0: "RED", - 1: "GREEN", - 2: "BLUE", -} -var MyMessage_Color_value = map[string]int32{ - "RED": 0, - "GREEN": 1, - "BLUE": 2, -} - -func (x MyMessage_Color) Enum() *MyMessage_Color { - p := new(MyMessage_Color) - *p = x - return p -} -func (x MyMessage_Color) String() string { - return proto.EnumName(MyMessage_Color_name, int32(x)) -} -func (x MyMessage_Color) MarshalJSON() ([]byte, error) { - return json.Marshal(x.String()) -} -func (x *MyMessage_Color) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(MyMessage_Color_value, data, "MyMessage_Color") - if err != nil { - return err - } - *x = MyMessage_Color(value) - return nil -} - -type Defaults_Color int32 - -const ( - Defaults_RED Defaults_Color = 0 - Defaults_GREEN Defaults_Color = 1 - Defaults_BLUE Defaults_Color = 2 -) - -var Defaults_Color_name = map[int32]string{ - 0: "RED", - 1: "GREEN", - 2: "BLUE", -} -var Defaults_Color_value = map[string]int32{ - "RED": 0, - "GREEN": 1, - "BLUE": 2, -} - -func (x Defaults_Color) Enum() *Defaults_Color { - p := new(Defaults_Color) - *p = x - return p -} -func (x Defaults_Color) String() string { - return proto.EnumName(Defaults_Color_name, int32(x)) -} -func (x Defaults_Color) MarshalJSON() ([]byte, error) { - return json.Marshal(x.String()) -} -func (x *Defaults_Color) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Defaults_Color_value, data, "Defaults_Color") - if err != nil { - return err - } - *x = Defaults_Color(value) - return nil -} - -type RepeatedEnum_Color int32 - -const ( - RepeatedEnum_RED RepeatedEnum_Color = 1 -) - -var RepeatedEnum_Color_name = map[int32]string{ - 1: "RED", -} -var RepeatedEnum_Color_value = map[string]int32{ - "RED": 1, -} - -func (x RepeatedEnum_Color) Enum() *RepeatedEnum_Color { - p := new(RepeatedEnum_Color) - *p = x - return p -} -func (x RepeatedEnum_Color) String() string { - return proto.EnumName(RepeatedEnum_Color_name, int32(x)) -} -func (x RepeatedEnum_Color) MarshalJSON() ([]byte, error) { - return json.Marshal(x.String()) -} -func (x *RepeatedEnum_Color) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(RepeatedEnum_Color_value, data, "RepeatedEnum_Color") - if err != nil { - return err - } - *x = RepeatedEnum_Color(value) - return nil -} - -type GoEnum struct { - Foo *FOO `protobuf:"varint,1,req,name=foo,enum=testdata.FOO" json:"foo,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoEnum) Reset() { *m = GoEnum{} } -func (m *GoEnum) String() string { return proto.CompactTextString(m) } -func (*GoEnum) ProtoMessage() {} - -func (m *GoEnum) GetFoo() FOO { - if m != nil && m.Foo != nil { - return *m.Foo - } - return 0 -} - -type GoTestField struct { - Label *string `protobuf:"bytes,1,req" json:"Label,omitempty"` - Type *string `protobuf:"bytes,2,req" json:"Type,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTestField) Reset() { *m = GoTestField{} } -func (m *GoTestField) String() string { return proto.CompactTextString(m) } -func (*GoTestField) ProtoMessage() {} - -func (m *GoTestField) GetLabel() string { - if m != nil && m.Label != nil { - return *m.Label - } - return "" -} - -func (m *GoTestField) GetType() string { - if m != nil && m.Type != nil { - return *m.Type - } - return "" -} - -type GoTest struct { - Kind *GoTest_KIND `protobuf:"varint,1,req,enum=testdata.GoTest_KIND" json:"Kind,omitempty"` - Table *string `protobuf:"bytes,2,opt" json:"Table,omitempty"` - Param *int32 `protobuf:"varint,3,opt" json:"Param,omitempty"` - RequiredField *GoTestField `protobuf:"bytes,4,req" json:"RequiredField,omitempty"` - RepeatedField []*GoTestField `protobuf:"bytes,5,rep" json:"RepeatedField,omitempty"` - OptionalField *GoTestField `protobuf:"bytes,6,opt" json:"OptionalField,omitempty"` - F_BoolRequired *bool `protobuf:"varint,10,req,name=F_Bool_required" json:"F_Bool_required,omitempty"` - F_Int32Required *int32 `protobuf:"varint,11,req,name=F_Int32_required" json:"F_Int32_required,omitempty"` - F_Int64Required *int64 `protobuf:"varint,12,req,name=F_Int64_required" json:"F_Int64_required,omitempty"` - F_Fixed32Required *uint32 `protobuf:"fixed32,13,req,name=F_Fixed32_required" json:"F_Fixed32_required,omitempty"` - F_Fixed64Required *uint64 `protobuf:"fixed64,14,req,name=F_Fixed64_required" json:"F_Fixed64_required,omitempty"` - F_Uint32Required *uint32 `protobuf:"varint,15,req,name=F_Uint32_required" json:"F_Uint32_required,omitempty"` - F_Uint64Required *uint64 `protobuf:"varint,16,req,name=F_Uint64_required" json:"F_Uint64_required,omitempty"` - F_FloatRequired *float32 `protobuf:"fixed32,17,req,name=F_Float_required" json:"F_Float_required,omitempty"` - F_DoubleRequired *float64 `protobuf:"fixed64,18,req,name=F_Double_required" json:"F_Double_required,omitempty"` - F_StringRequired *string `protobuf:"bytes,19,req,name=F_String_required" json:"F_String_required,omitempty"` - F_BytesRequired []byte `protobuf:"bytes,101,req,name=F_Bytes_required" json:"F_Bytes_required,omitempty"` - F_Sint32Required *int32 `protobuf:"zigzag32,102,req,name=F_Sint32_required" json:"F_Sint32_required,omitempty"` - F_Sint64Required *int64 `protobuf:"zigzag64,103,req,name=F_Sint64_required" json:"F_Sint64_required,omitempty"` - F_BoolRepeated []bool `protobuf:"varint,20,rep,name=F_Bool_repeated" json:"F_Bool_repeated,omitempty"` - F_Int32Repeated []int32 `protobuf:"varint,21,rep,name=F_Int32_repeated" json:"F_Int32_repeated,omitempty"` - F_Int64Repeated []int64 `protobuf:"varint,22,rep,name=F_Int64_repeated" json:"F_Int64_repeated,omitempty"` - F_Fixed32Repeated []uint32 `protobuf:"fixed32,23,rep,name=F_Fixed32_repeated" json:"F_Fixed32_repeated,omitempty"` - F_Fixed64Repeated []uint64 `protobuf:"fixed64,24,rep,name=F_Fixed64_repeated" json:"F_Fixed64_repeated,omitempty"` - F_Uint32Repeated []uint32 `protobuf:"varint,25,rep,name=F_Uint32_repeated" json:"F_Uint32_repeated,omitempty"` - F_Uint64Repeated []uint64 `protobuf:"varint,26,rep,name=F_Uint64_repeated" json:"F_Uint64_repeated,omitempty"` - F_FloatRepeated []float32 `protobuf:"fixed32,27,rep,name=F_Float_repeated" json:"F_Float_repeated,omitempty"` - F_DoubleRepeated []float64 `protobuf:"fixed64,28,rep,name=F_Double_repeated" json:"F_Double_repeated,omitempty"` - F_StringRepeated []string `protobuf:"bytes,29,rep,name=F_String_repeated" json:"F_String_repeated,omitempty"` - F_BytesRepeated [][]byte `protobuf:"bytes,201,rep,name=F_Bytes_repeated" json:"F_Bytes_repeated,omitempty"` - F_Sint32Repeated []int32 `protobuf:"zigzag32,202,rep,name=F_Sint32_repeated" json:"F_Sint32_repeated,omitempty"` - F_Sint64Repeated []int64 `protobuf:"zigzag64,203,rep,name=F_Sint64_repeated" json:"F_Sint64_repeated,omitempty"` - F_BoolOptional *bool `protobuf:"varint,30,opt,name=F_Bool_optional" json:"F_Bool_optional,omitempty"` - F_Int32Optional *int32 `protobuf:"varint,31,opt,name=F_Int32_optional" json:"F_Int32_optional,omitempty"` - F_Int64Optional *int64 `protobuf:"varint,32,opt,name=F_Int64_optional" json:"F_Int64_optional,omitempty"` - F_Fixed32Optional *uint32 `protobuf:"fixed32,33,opt,name=F_Fixed32_optional" json:"F_Fixed32_optional,omitempty"` - F_Fixed64Optional *uint64 `protobuf:"fixed64,34,opt,name=F_Fixed64_optional" json:"F_Fixed64_optional,omitempty"` - F_Uint32Optional *uint32 `protobuf:"varint,35,opt,name=F_Uint32_optional" json:"F_Uint32_optional,omitempty"` - F_Uint64Optional *uint64 `protobuf:"varint,36,opt,name=F_Uint64_optional" json:"F_Uint64_optional,omitempty"` - F_FloatOptional *float32 `protobuf:"fixed32,37,opt,name=F_Float_optional" json:"F_Float_optional,omitempty"` - F_DoubleOptional *float64 `protobuf:"fixed64,38,opt,name=F_Double_optional" json:"F_Double_optional,omitempty"` - F_StringOptional *string `protobuf:"bytes,39,opt,name=F_String_optional" json:"F_String_optional,omitempty"` - F_BytesOptional []byte `protobuf:"bytes,301,opt,name=F_Bytes_optional" json:"F_Bytes_optional,omitempty"` - F_Sint32Optional *int32 `protobuf:"zigzag32,302,opt,name=F_Sint32_optional" json:"F_Sint32_optional,omitempty"` - F_Sint64Optional *int64 `protobuf:"zigzag64,303,opt,name=F_Sint64_optional" json:"F_Sint64_optional,omitempty"` - F_BoolDefaulted *bool `protobuf:"varint,40,opt,name=F_Bool_defaulted,def=1" json:"F_Bool_defaulted,omitempty"` - F_Int32Defaulted *int32 `protobuf:"varint,41,opt,name=F_Int32_defaulted,def=32" json:"F_Int32_defaulted,omitempty"` - F_Int64Defaulted *int64 `protobuf:"varint,42,opt,name=F_Int64_defaulted,def=64" json:"F_Int64_defaulted,omitempty"` - F_Fixed32Defaulted *uint32 `protobuf:"fixed32,43,opt,name=F_Fixed32_defaulted,def=320" json:"F_Fixed32_defaulted,omitempty"` - F_Fixed64Defaulted *uint64 `protobuf:"fixed64,44,opt,name=F_Fixed64_defaulted,def=640" json:"F_Fixed64_defaulted,omitempty"` - F_Uint32Defaulted *uint32 `protobuf:"varint,45,opt,name=F_Uint32_defaulted,def=3200" json:"F_Uint32_defaulted,omitempty"` - F_Uint64Defaulted *uint64 `protobuf:"varint,46,opt,name=F_Uint64_defaulted,def=6400" json:"F_Uint64_defaulted,omitempty"` - F_FloatDefaulted *float32 `protobuf:"fixed32,47,opt,name=F_Float_defaulted,def=314159" json:"F_Float_defaulted,omitempty"` - F_DoubleDefaulted *float64 `protobuf:"fixed64,48,opt,name=F_Double_defaulted,def=271828" json:"F_Double_defaulted,omitempty"` - F_StringDefaulted *string `protobuf:"bytes,49,opt,name=F_String_defaulted,def=hello, \"world!\"\n" json:"F_String_defaulted,omitempty"` - F_BytesDefaulted []byte `protobuf:"bytes,401,opt,name=F_Bytes_defaulted,def=Bignose" json:"F_Bytes_defaulted,omitempty"` - F_Sint32Defaulted *int32 `protobuf:"zigzag32,402,opt,name=F_Sint32_defaulted,def=-32" json:"F_Sint32_defaulted,omitempty"` - F_Sint64Defaulted *int64 `protobuf:"zigzag64,403,opt,name=F_Sint64_defaulted,def=-64" json:"F_Sint64_defaulted,omitempty"` - F_BoolRepeatedPacked []bool `protobuf:"varint,50,rep,packed,name=F_Bool_repeated_packed" json:"F_Bool_repeated_packed,omitempty"` - F_Int32RepeatedPacked []int32 `protobuf:"varint,51,rep,packed,name=F_Int32_repeated_packed" json:"F_Int32_repeated_packed,omitempty"` - F_Int64RepeatedPacked []int64 `protobuf:"varint,52,rep,packed,name=F_Int64_repeated_packed" json:"F_Int64_repeated_packed,omitempty"` - F_Fixed32RepeatedPacked []uint32 `protobuf:"fixed32,53,rep,packed,name=F_Fixed32_repeated_packed" json:"F_Fixed32_repeated_packed,omitempty"` - F_Fixed64RepeatedPacked []uint64 `protobuf:"fixed64,54,rep,packed,name=F_Fixed64_repeated_packed" json:"F_Fixed64_repeated_packed,omitempty"` - F_Uint32RepeatedPacked []uint32 `protobuf:"varint,55,rep,packed,name=F_Uint32_repeated_packed" json:"F_Uint32_repeated_packed,omitempty"` - F_Uint64RepeatedPacked []uint64 `protobuf:"varint,56,rep,packed,name=F_Uint64_repeated_packed" json:"F_Uint64_repeated_packed,omitempty"` - F_FloatRepeatedPacked []float32 `protobuf:"fixed32,57,rep,packed,name=F_Float_repeated_packed" json:"F_Float_repeated_packed,omitempty"` - F_DoubleRepeatedPacked []float64 `protobuf:"fixed64,58,rep,packed,name=F_Double_repeated_packed" json:"F_Double_repeated_packed,omitempty"` - F_Sint32RepeatedPacked []int32 `protobuf:"zigzag32,502,rep,packed,name=F_Sint32_repeated_packed" json:"F_Sint32_repeated_packed,omitempty"` - F_Sint64RepeatedPacked []int64 `protobuf:"zigzag64,503,rep,packed,name=F_Sint64_repeated_packed" json:"F_Sint64_repeated_packed,omitempty"` - Requiredgroup *GoTest_RequiredGroup `protobuf:"group,70,req,name=RequiredGroup" json:"requiredgroup,omitempty"` - Repeatedgroup []*GoTest_RepeatedGroup `protobuf:"group,80,rep,name=RepeatedGroup" json:"repeatedgroup,omitempty"` - Optionalgroup *GoTest_OptionalGroup `protobuf:"group,90,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTest) Reset() { *m = GoTest{} } -func (m *GoTest) String() string { return proto.CompactTextString(m) } -func (*GoTest) ProtoMessage() {} - -const Default_GoTest_F_BoolDefaulted bool = true -const Default_GoTest_F_Int32Defaulted int32 = 32 -const Default_GoTest_F_Int64Defaulted int64 = 64 -const Default_GoTest_F_Fixed32Defaulted uint32 = 320 -const Default_GoTest_F_Fixed64Defaulted uint64 = 640 -const Default_GoTest_F_Uint32Defaulted uint32 = 3200 -const Default_GoTest_F_Uint64Defaulted uint64 = 6400 -const Default_GoTest_F_FloatDefaulted float32 = 314159 -const Default_GoTest_F_DoubleDefaulted float64 = 271828 -const Default_GoTest_F_StringDefaulted string = "hello, \"world!\"\n" - -var Default_GoTest_F_BytesDefaulted []byte = []byte("Bignose") - -const Default_GoTest_F_Sint32Defaulted int32 = -32 -const Default_GoTest_F_Sint64Defaulted int64 = -64 - -func (m *GoTest) GetKind() GoTest_KIND { - if m != nil && m.Kind != nil { - return *m.Kind - } - return 0 -} - -func (m *GoTest) GetTable() string { - if m != nil && m.Table != nil { - return *m.Table - } - return "" -} - -func (m *GoTest) GetParam() int32 { - if m != nil && m.Param != nil { - return *m.Param - } - return 0 -} - -func (m *GoTest) GetRequiredField() *GoTestField { - if m != nil { - return m.RequiredField - } - return nil -} - -func (m *GoTest) GetRepeatedField() []*GoTestField { - if m != nil { - return m.RepeatedField - } - return nil -} - -func (m *GoTest) GetOptionalField() *GoTestField { - if m != nil { - return m.OptionalField - } - return nil -} - -func (m *GoTest) GetF_BoolRequired() bool { - if m != nil && m.F_BoolRequired != nil { - return *m.F_BoolRequired - } - return false -} - -func (m *GoTest) GetF_Int32Required() int32 { - if m != nil && m.F_Int32Required != nil { - return *m.F_Int32Required - } - return 0 -} - -func (m *GoTest) GetF_Int64Required() int64 { - if m != nil && m.F_Int64Required != nil { - return *m.F_Int64Required - } - return 0 -} - -func (m *GoTest) GetF_Fixed32Required() uint32 { - if m != nil && m.F_Fixed32Required != nil { - return *m.F_Fixed32Required - } - return 0 -} - -func (m *GoTest) GetF_Fixed64Required() uint64 { - if m != nil && m.F_Fixed64Required != nil { - return *m.F_Fixed64Required - } - return 0 -} - -func (m *GoTest) GetF_Uint32Required() uint32 { - if m != nil && m.F_Uint32Required != nil { - return *m.F_Uint32Required - } - return 0 -} - -func (m *GoTest) GetF_Uint64Required() uint64 { - if m != nil && m.F_Uint64Required != nil { - return *m.F_Uint64Required - } - return 0 -} - -func (m *GoTest) GetF_FloatRequired() float32 { - if m != nil && m.F_FloatRequired != nil { - return *m.F_FloatRequired - } - return 0 -} - -func (m *GoTest) GetF_DoubleRequired() float64 { - if m != nil && m.F_DoubleRequired != nil { - return *m.F_DoubleRequired - } - return 0 -} - -func (m *GoTest) GetF_StringRequired() string { - if m != nil && m.F_StringRequired != nil { - return *m.F_StringRequired - } - return "" -} - -func (m *GoTest) GetF_BytesRequired() []byte { - if m != nil { - return m.F_BytesRequired - } - return nil -} - -func (m *GoTest) GetF_Sint32Required() int32 { - if m != nil && m.F_Sint32Required != nil { - return *m.F_Sint32Required - } - return 0 -} - -func (m *GoTest) GetF_Sint64Required() int64 { - if m != nil && m.F_Sint64Required != nil { - return *m.F_Sint64Required - } - return 0 -} - -func (m *GoTest) GetF_BoolRepeated() []bool { - if m != nil { - return m.F_BoolRepeated - } - return nil -} - -func (m *GoTest) GetF_Int32Repeated() []int32 { - if m != nil { - return m.F_Int32Repeated - } - return nil -} - -func (m *GoTest) GetF_Int64Repeated() []int64 { - if m != nil { - return m.F_Int64Repeated - } - return nil -} - -func (m *GoTest) GetF_Fixed32Repeated() []uint32 { - if m != nil { - return m.F_Fixed32Repeated - } - return nil -} - -func (m *GoTest) GetF_Fixed64Repeated() []uint64 { - if m != nil { - return m.F_Fixed64Repeated - } - return nil -} - -func (m *GoTest) GetF_Uint32Repeated() []uint32 { - if m != nil { - return m.F_Uint32Repeated - } - return nil -} - -func (m *GoTest) GetF_Uint64Repeated() []uint64 { - if m != nil { - return m.F_Uint64Repeated - } - return nil -} - -func (m *GoTest) GetF_FloatRepeated() []float32 { - if m != nil { - return m.F_FloatRepeated - } - return nil -} - -func (m *GoTest) GetF_DoubleRepeated() []float64 { - if m != nil { - return m.F_DoubleRepeated - } - return nil -} - -func (m *GoTest) GetF_StringRepeated() []string { - if m != nil { - return m.F_StringRepeated - } - return nil -} - -func (m *GoTest) GetF_BytesRepeated() [][]byte { - if m != nil { - return m.F_BytesRepeated - } - return nil -} - -func (m *GoTest) GetF_Sint32Repeated() []int32 { - if m != nil { - return m.F_Sint32Repeated - } - return nil -} - -func (m *GoTest) GetF_Sint64Repeated() []int64 { - if m != nil { - return m.F_Sint64Repeated - } - return nil -} - -func (m *GoTest) GetF_BoolOptional() bool { - if m != nil && m.F_BoolOptional != nil { - return *m.F_BoolOptional - } - return false -} - -func (m *GoTest) GetF_Int32Optional() int32 { - if m != nil && m.F_Int32Optional != nil { - return *m.F_Int32Optional - } - return 0 -} - -func (m *GoTest) GetF_Int64Optional() int64 { - if m != nil && m.F_Int64Optional != nil { - return *m.F_Int64Optional - } - return 0 -} - -func (m *GoTest) GetF_Fixed32Optional() uint32 { - if m != nil && m.F_Fixed32Optional != nil { - return *m.F_Fixed32Optional - } - return 0 -} - -func (m *GoTest) GetF_Fixed64Optional() uint64 { - if m != nil && m.F_Fixed64Optional != nil { - return *m.F_Fixed64Optional - } - return 0 -} - -func (m *GoTest) GetF_Uint32Optional() uint32 { - if m != nil && m.F_Uint32Optional != nil { - return *m.F_Uint32Optional - } - return 0 -} - -func (m *GoTest) GetF_Uint64Optional() uint64 { - if m != nil && m.F_Uint64Optional != nil { - return *m.F_Uint64Optional - } - return 0 -} - -func (m *GoTest) GetF_FloatOptional() float32 { - if m != nil && m.F_FloatOptional != nil { - return *m.F_FloatOptional - } - return 0 -} - -func (m *GoTest) GetF_DoubleOptional() float64 { - if m != nil && m.F_DoubleOptional != nil { - return *m.F_DoubleOptional - } - return 0 -} - -func (m *GoTest) GetF_StringOptional() string { - if m != nil && m.F_StringOptional != nil { - return *m.F_StringOptional - } - return "" -} - -func (m *GoTest) GetF_BytesOptional() []byte { - if m != nil { - return m.F_BytesOptional - } - return nil -} - -func (m *GoTest) GetF_Sint32Optional() int32 { - if m != nil && m.F_Sint32Optional != nil { - return *m.F_Sint32Optional - } - return 0 -} - -func (m *GoTest) GetF_Sint64Optional() int64 { - if m != nil && m.F_Sint64Optional != nil { - return *m.F_Sint64Optional - } - return 0 -} - -func (m *GoTest) GetF_BoolDefaulted() bool { - if m != nil && m.F_BoolDefaulted != nil { - return *m.F_BoolDefaulted - } - return Default_GoTest_F_BoolDefaulted -} - -func (m *GoTest) GetF_Int32Defaulted() int32 { - if m != nil && m.F_Int32Defaulted != nil { - return *m.F_Int32Defaulted - } - return Default_GoTest_F_Int32Defaulted -} - -func (m *GoTest) GetF_Int64Defaulted() int64 { - if m != nil && m.F_Int64Defaulted != nil { - return *m.F_Int64Defaulted - } - return Default_GoTest_F_Int64Defaulted -} - -func (m *GoTest) GetF_Fixed32Defaulted() uint32 { - if m != nil && m.F_Fixed32Defaulted != nil { - return *m.F_Fixed32Defaulted - } - return Default_GoTest_F_Fixed32Defaulted -} - -func (m *GoTest) GetF_Fixed64Defaulted() uint64 { - if m != nil && m.F_Fixed64Defaulted != nil { - return *m.F_Fixed64Defaulted - } - return Default_GoTest_F_Fixed64Defaulted -} - -func (m *GoTest) GetF_Uint32Defaulted() uint32 { - if m != nil && m.F_Uint32Defaulted != nil { - return *m.F_Uint32Defaulted - } - return Default_GoTest_F_Uint32Defaulted -} - -func (m *GoTest) GetF_Uint64Defaulted() uint64 { - if m != nil && m.F_Uint64Defaulted != nil { - return *m.F_Uint64Defaulted - } - return Default_GoTest_F_Uint64Defaulted -} - -func (m *GoTest) GetF_FloatDefaulted() float32 { - if m != nil && m.F_FloatDefaulted != nil { - return *m.F_FloatDefaulted - } - return Default_GoTest_F_FloatDefaulted -} - -func (m *GoTest) GetF_DoubleDefaulted() float64 { - if m != nil && m.F_DoubleDefaulted != nil { - return *m.F_DoubleDefaulted - } - return Default_GoTest_F_DoubleDefaulted -} - -func (m *GoTest) GetF_StringDefaulted() string { - if m != nil && m.F_StringDefaulted != nil { - return *m.F_StringDefaulted - } - return Default_GoTest_F_StringDefaulted -} - -func (m *GoTest) GetF_BytesDefaulted() []byte { - if m != nil && m.F_BytesDefaulted != nil { - return m.F_BytesDefaulted - } - return append([]byte(nil), Default_GoTest_F_BytesDefaulted...) -} - -func (m *GoTest) GetF_Sint32Defaulted() int32 { - if m != nil && m.F_Sint32Defaulted != nil { - return *m.F_Sint32Defaulted - } - return Default_GoTest_F_Sint32Defaulted -} - -func (m *GoTest) GetF_Sint64Defaulted() int64 { - if m != nil && m.F_Sint64Defaulted != nil { - return *m.F_Sint64Defaulted - } - return Default_GoTest_F_Sint64Defaulted -} - -func (m *GoTest) GetF_BoolRepeatedPacked() []bool { - if m != nil { - return m.F_BoolRepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Int32RepeatedPacked() []int32 { - if m != nil { - return m.F_Int32RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Int64RepeatedPacked() []int64 { - if m != nil { - return m.F_Int64RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Fixed32RepeatedPacked() []uint32 { - if m != nil { - return m.F_Fixed32RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Fixed64RepeatedPacked() []uint64 { - if m != nil { - return m.F_Fixed64RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Uint32RepeatedPacked() []uint32 { - if m != nil { - return m.F_Uint32RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Uint64RepeatedPacked() []uint64 { - if m != nil { - return m.F_Uint64RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_FloatRepeatedPacked() []float32 { - if m != nil { - return m.F_FloatRepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_DoubleRepeatedPacked() []float64 { - if m != nil { - return m.F_DoubleRepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Sint32RepeatedPacked() []int32 { - if m != nil { - return m.F_Sint32RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Sint64RepeatedPacked() []int64 { - if m != nil { - return m.F_Sint64RepeatedPacked - } - return nil -} - -func (m *GoTest) GetRequiredgroup() *GoTest_RequiredGroup { - if m != nil { - return m.Requiredgroup - } - return nil -} - -func (m *GoTest) GetRepeatedgroup() []*GoTest_RepeatedGroup { - if m != nil { - return m.Repeatedgroup - } - return nil -} - -func (m *GoTest) GetOptionalgroup() *GoTest_OptionalGroup { - if m != nil { - return m.Optionalgroup - } - return nil -} - -type GoTest_RequiredGroup struct { - RequiredField *string `protobuf:"bytes,71,req" json:"RequiredField,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTest_RequiredGroup) Reset() { *m = GoTest_RequiredGroup{} } - -func (m *GoTest_RequiredGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" -} - -type GoTest_RepeatedGroup struct { - RequiredField *string `protobuf:"bytes,81,req" json:"RequiredField,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTest_RepeatedGroup) Reset() { *m = GoTest_RepeatedGroup{} } - -func (m *GoTest_RepeatedGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" -} - -type GoTest_OptionalGroup struct { - RequiredField *string `protobuf:"bytes,91,req" json:"RequiredField,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTest_OptionalGroup) Reset() { *m = GoTest_OptionalGroup{} } - -func (m *GoTest_OptionalGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" -} - -type GoSkipTest struct { - SkipInt32 *int32 `protobuf:"varint,11,req,name=skip_int32" json:"skip_int32,omitempty"` - SkipFixed32 *uint32 `protobuf:"fixed32,12,req,name=skip_fixed32" json:"skip_fixed32,omitempty"` - SkipFixed64 *uint64 `protobuf:"fixed64,13,req,name=skip_fixed64" json:"skip_fixed64,omitempty"` - SkipString *string `protobuf:"bytes,14,req,name=skip_string" json:"skip_string,omitempty"` - Skipgroup *GoSkipTest_SkipGroup `protobuf:"group,15,req,name=SkipGroup" json:"skipgroup,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoSkipTest) Reset() { *m = GoSkipTest{} } -func (m *GoSkipTest) String() string { return proto.CompactTextString(m) } -func (*GoSkipTest) ProtoMessage() {} - -func (m *GoSkipTest) GetSkipInt32() int32 { - if m != nil && m.SkipInt32 != nil { - return *m.SkipInt32 - } - return 0 -} - -func (m *GoSkipTest) GetSkipFixed32() uint32 { - if m != nil && m.SkipFixed32 != nil { - return *m.SkipFixed32 - } - return 0 -} - -func (m *GoSkipTest) GetSkipFixed64() uint64 { - if m != nil && m.SkipFixed64 != nil { - return *m.SkipFixed64 - } - return 0 -} - -func (m *GoSkipTest) GetSkipString() string { - if m != nil && m.SkipString != nil { - return *m.SkipString - } - return "" -} - -func (m *GoSkipTest) GetSkipgroup() *GoSkipTest_SkipGroup { - if m != nil { - return m.Skipgroup - } - return nil -} - -type GoSkipTest_SkipGroup struct { - GroupInt32 *int32 `protobuf:"varint,16,req,name=group_int32" json:"group_int32,omitempty"` - GroupString *string `protobuf:"bytes,17,req,name=group_string" json:"group_string,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoSkipTest_SkipGroup) Reset() { *m = GoSkipTest_SkipGroup{} } - -func (m *GoSkipTest_SkipGroup) GetGroupInt32() int32 { - if m != nil && m.GroupInt32 != nil { - return *m.GroupInt32 - } - return 0 -} - -func (m *GoSkipTest_SkipGroup) GetGroupString() string { - if m != nil && m.GroupString != nil { - return *m.GroupString - } - return "" -} - -type NonPackedTest struct { - A []int32 `protobuf:"varint,1,rep,name=a" json:"a,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *NonPackedTest) Reset() { *m = NonPackedTest{} } -func (m *NonPackedTest) String() string { return proto.CompactTextString(m) } -func (*NonPackedTest) ProtoMessage() {} - -func (m *NonPackedTest) GetA() []int32 { - if m != nil { - return m.A - } - return nil -} - -type PackedTest struct { - B []int32 `protobuf:"varint,1,rep,packed,name=b" json:"b,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *PackedTest) Reset() { *m = PackedTest{} } -func (m *PackedTest) String() string { return proto.CompactTextString(m) } -func (*PackedTest) ProtoMessage() {} - -func (m *PackedTest) GetB() []int32 { - if m != nil { - return m.B - } - return nil -} - -type MaxTag struct { - LastField *string `protobuf:"bytes,536870911,opt,name=last_field" json:"last_field,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MaxTag) Reset() { *m = MaxTag{} } -func (m *MaxTag) String() string { return proto.CompactTextString(m) } -func (*MaxTag) ProtoMessage() {} - -func (m *MaxTag) GetLastField() string { - if m != nil && m.LastField != nil { - return *m.LastField - } - return "" -} - -type OldMessage struct { - Nested *OldMessage_Nested `protobuf:"bytes,1,opt,name=nested" json:"nested,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *OldMessage) Reset() { *m = OldMessage{} } -func (m *OldMessage) String() string { return proto.CompactTextString(m) } -func (*OldMessage) ProtoMessage() {} - -func (m *OldMessage) GetNested() *OldMessage_Nested { - if m != nil { - return m.Nested - } - return nil -} - -type OldMessage_Nested struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *OldMessage_Nested) Reset() { *m = OldMessage_Nested{} } -func (m *OldMessage_Nested) String() string { return proto.CompactTextString(m) } -func (*OldMessage_Nested) ProtoMessage() {} - -func (m *OldMessage_Nested) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -type NewMessage struct { - Nested *NewMessage_Nested `protobuf:"bytes,1,opt,name=nested" json:"nested,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *NewMessage) Reset() { *m = NewMessage{} } -func (m *NewMessage) String() string { return proto.CompactTextString(m) } -func (*NewMessage) ProtoMessage() {} - -func (m *NewMessage) GetNested() *NewMessage_Nested { - if m != nil { - return m.Nested - } - return nil -} - -type NewMessage_Nested struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - FoodGroup *string `protobuf:"bytes,2,opt,name=food_group" json:"food_group,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *NewMessage_Nested) Reset() { *m = NewMessage_Nested{} } -func (m *NewMessage_Nested) String() string { return proto.CompactTextString(m) } -func (*NewMessage_Nested) ProtoMessage() {} - -func (m *NewMessage_Nested) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *NewMessage_Nested) GetFoodGroup() string { - if m != nil && m.FoodGroup != nil { - return *m.FoodGroup - } - return "" -} - -type InnerMessage struct { - Host *string `protobuf:"bytes,1,req,name=host" json:"host,omitempty"` - Port *int32 `protobuf:"varint,2,opt,name=port,def=4000" json:"port,omitempty"` - Connected *bool `protobuf:"varint,3,opt,name=connected" json:"connected,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *InnerMessage) Reset() { *m = InnerMessage{} } -func (m *InnerMessage) String() string { return proto.CompactTextString(m) } -func (*InnerMessage) ProtoMessage() {} - -const Default_InnerMessage_Port int32 = 4000 - -func (m *InnerMessage) GetHost() string { - if m != nil && m.Host != nil { - return *m.Host - } - return "" -} - -func (m *InnerMessage) GetPort() int32 { - if m != nil && m.Port != nil { - return *m.Port - } - return Default_InnerMessage_Port -} - -func (m *InnerMessage) GetConnected() bool { - if m != nil && m.Connected != nil { - return *m.Connected - } - return false -} - -type OtherMessage struct { - Key *int64 `protobuf:"varint,1,opt,name=key" json:"key,omitempty"` - Value []byte `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` - Weight *float32 `protobuf:"fixed32,3,opt,name=weight" json:"weight,omitempty"` - Inner *InnerMessage `protobuf:"bytes,4,opt,name=inner" json:"inner,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *OtherMessage) Reset() { *m = OtherMessage{} } -func (m *OtherMessage) String() string { return proto.CompactTextString(m) } -func (*OtherMessage) ProtoMessage() {} - -func (m *OtherMessage) GetKey() int64 { - if m != nil && m.Key != nil { - return *m.Key - } - return 0 -} - -func (m *OtherMessage) GetValue() []byte { - if m != nil { - return m.Value - } - return nil -} - -func (m *OtherMessage) GetWeight() float32 { - if m != nil && m.Weight != nil { - return *m.Weight - } - return 0 -} - -func (m *OtherMessage) GetInner() *InnerMessage { - if m != nil { - return m.Inner - } - return nil -} - -type MyMessage struct { - Count *int32 `protobuf:"varint,1,req,name=count" json:"count,omitempty"` - Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` - Quote *string `protobuf:"bytes,3,opt,name=quote" json:"quote,omitempty"` - Pet []string `protobuf:"bytes,4,rep,name=pet" json:"pet,omitempty"` - Inner *InnerMessage `protobuf:"bytes,5,opt,name=inner" json:"inner,omitempty"` - Others []*OtherMessage `protobuf:"bytes,6,rep,name=others" json:"others,omitempty"` - Bikeshed *MyMessage_Color `protobuf:"varint,7,opt,name=bikeshed,enum=testdata.MyMessage_Color" json:"bikeshed,omitempty"` - Somegroup *MyMessage_SomeGroup `protobuf:"group,8,opt,name=SomeGroup" json:"somegroup,omitempty"` - RepBytes [][]byte `protobuf:"bytes,10,rep,name=rep_bytes" json:"rep_bytes,omitempty"` - Bigfloat *float64 `protobuf:"fixed64,11,opt,name=bigfloat" json:"bigfloat,omitempty"` - XXX_extensions map[int32]proto.Extension `json:"-"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MyMessage) Reset() { *m = MyMessage{} } -func (m *MyMessage) String() string { return proto.CompactTextString(m) } -func (*MyMessage) ProtoMessage() {} - -var extRange_MyMessage = []proto.ExtensionRange{ - {100, 536870911}, -} - -func (*MyMessage) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_MyMessage -} -func (m *MyMessage) ExtensionMap() map[int32]proto.Extension { - if m.XXX_extensions == nil { - m.XXX_extensions = make(map[int32]proto.Extension) - } - return m.XXX_extensions -} - -func (m *MyMessage) GetCount() int32 { - if m != nil && m.Count != nil { - return *m.Count - } - return 0 -} - -func (m *MyMessage) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *MyMessage) GetQuote() string { - if m != nil && m.Quote != nil { - return *m.Quote - } - return "" -} - -func (m *MyMessage) GetPet() []string { - if m != nil { - return m.Pet - } - return nil -} - -func (m *MyMessage) GetInner() *InnerMessage { - if m != nil { - return m.Inner - } - return nil -} - -func (m *MyMessage) GetOthers() []*OtherMessage { - if m != nil { - return m.Others - } - return nil -} - -func (m *MyMessage) GetBikeshed() MyMessage_Color { - if m != nil && m.Bikeshed != nil { - return *m.Bikeshed - } - return 0 -} - -func (m *MyMessage) GetSomegroup() *MyMessage_SomeGroup { - if m != nil { - return m.Somegroup - } - return nil -} - -func (m *MyMessage) GetRepBytes() [][]byte { - if m != nil { - return m.RepBytes - } - return nil -} - -func (m *MyMessage) GetBigfloat() float64 { - if m != nil && m.Bigfloat != nil { - return *m.Bigfloat - } - return 0 -} - -type MyMessage_SomeGroup struct { - GroupField *int32 `protobuf:"varint,9,opt,name=group_field" json:"group_field,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MyMessage_SomeGroup) Reset() { *m = MyMessage_SomeGroup{} } - -func (m *MyMessage_SomeGroup) GetGroupField() int32 { - if m != nil && m.GroupField != nil { - return *m.GroupField - } - return 0 -} - -type Ext struct { - Data *string `protobuf:"bytes,1,opt,name=data" json:"data,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Ext) Reset() { *m = Ext{} } -func (m *Ext) String() string { return proto.CompactTextString(m) } -func (*Ext) ProtoMessage() {} - -func (m *Ext) GetData() string { - if m != nil && m.Data != nil { - return *m.Data - } - return "" -} - -var E_Ext_More = &proto.ExtensionDesc{ - ExtendedType: (*MyMessage)(nil), - ExtensionType: (*Ext)(nil), - Field: 103, - Name: "testdata.Ext.more", - Tag: "bytes,103,opt,name=more", -} - -var E_Ext_Text = &proto.ExtensionDesc{ - ExtendedType: (*MyMessage)(nil), - ExtensionType: (*string)(nil), - Field: 104, - Name: "testdata.Ext.text", - Tag: "bytes,104,opt,name=text", -} - -var E_Ext_Number = &proto.ExtensionDesc{ - ExtendedType: (*MyMessage)(nil), - ExtensionType: (*int32)(nil), - Field: 105, - Name: "testdata.Ext.number", - Tag: "varint,105,opt,name=number", -} - -type MessageList struct { - Message []*MessageList_Message `protobuf:"group,1,rep" json:"message,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MessageList) Reset() { *m = MessageList{} } -func (m *MessageList) String() string { return proto.CompactTextString(m) } -func (*MessageList) ProtoMessage() {} - -func (m *MessageList) GetMessage() []*MessageList_Message { - if m != nil { - return m.Message - } - return nil -} - -type MessageList_Message struct { - Name *string `protobuf:"bytes,2,req,name=name" json:"name,omitempty"` - Count *int32 `protobuf:"varint,3,req,name=count" json:"count,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MessageList_Message) Reset() { *m = MessageList_Message{} } - -func (m *MessageList_Message) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *MessageList_Message) GetCount() int32 { - if m != nil && m.Count != nil { - return *m.Count - } - return 0 -} - -type Strings struct { - StringField *string `protobuf:"bytes,1,opt,name=string_field" json:"string_field,omitempty"` - BytesField []byte `protobuf:"bytes,2,opt,name=bytes_field" json:"bytes_field,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Strings) Reset() { *m = Strings{} } -func (m *Strings) String() string { return proto.CompactTextString(m) } -func (*Strings) ProtoMessage() {} - -func (m *Strings) GetStringField() string { - if m != nil && m.StringField != nil { - return *m.StringField - } - return "" -} - -func (m *Strings) GetBytesField() []byte { - if m != nil { - return m.BytesField - } - return nil -} - -type Defaults struct { - F_Bool *bool `protobuf:"varint,1,opt,def=1" json:"F_Bool,omitempty"` - F_Int32 *int32 `protobuf:"varint,2,opt,def=32" json:"F_Int32,omitempty"` - F_Int64 *int64 `protobuf:"varint,3,opt,def=64" json:"F_Int64,omitempty"` - F_Fixed32 *uint32 `protobuf:"fixed32,4,opt,def=320" json:"F_Fixed32,omitempty"` - F_Fixed64 *uint64 `protobuf:"fixed64,5,opt,def=640" json:"F_Fixed64,omitempty"` - F_Uint32 *uint32 `protobuf:"varint,6,opt,def=3200" json:"F_Uint32,omitempty"` - F_Uint64 *uint64 `protobuf:"varint,7,opt,def=6400" json:"F_Uint64,omitempty"` - F_Float *float32 `protobuf:"fixed32,8,opt,def=314159" json:"F_Float,omitempty"` - F_Double *float64 `protobuf:"fixed64,9,opt,def=271828" json:"F_Double,omitempty"` - F_String *string `protobuf:"bytes,10,opt,def=hello, \"world!\"\n" json:"F_String,omitempty"` - F_Bytes []byte `protobuf:"bytes,11,opt,def=Bignose" json:"F_Bytes,omitempty"` - F_Sint32 *int32 `protobuf:"zigzag32,12,opt,def=-32" json:"F_Sint32,omitempty"` - F_Sint64 *int64 `protobuf:"zigzag64,13,opt,def=-64" json:"F_Sint64,omitempty"` - F_Enum *Defaults_Color `protobuf:"varint,14,opt,enum=testdata.Defaults_Color,def=1" json:"F_Enum,omitempty"` - F_Pinf *float32 `protobuf:"fixed32,15,opt,def=inf" json:"F_Pinf,omitempty"` - F_Ninf *float32 `protobuf:"fixed32,16,opt,def=-inf" json:"F_Ninf,omitempty"` - F_Nan *float32 `protobuf:"fixed32,17,opt,def=nan" json:"F_Nan,omitempty"` - Sub *SubDefaults `protobuf:"bytes,18,opt,name=sub" json:"sub,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Defaults) Reset() { *m = Defaults{} } -func (m *Defaults) String() string { return proto.CompactTextString(m) } -func (*Defaults) ProtoMessage() {} - -const Default_Defaults_F_Bool bool = true -const Default_Defaults_F_Int32 int32 = 32 -const Default_Defaults_F_Int64 int64 = 64 -const Default_Defaults_F_Fixed32 uint32 = 320 -const Default_Defaults_F_Fixed64 uint64 = 640 -const Default_Defaults_F_Uint32 uint32 = 3200 -const Default_Defaults_F_Uint64 uint64 = 6400 -const Default_Defaults_F_Float float32 = 314159 -const Default_Defaults_F_Double float64 = 271828 -const Default_Defaults_F_String string = "hello, \"world!\"\n" - -var Default_Defaults_F_Bytes []byte = []byte("Bignose") - -const Default_Defaults_F_Sint32 int32 = -32 -const Default_Defaults_F_Sint64 int64 = -64 -const Default_Defaults_F_Enum Defaults_Color = Defaults_GREEN - -var Default_Defaults_F_Pinf float32 = float32(math.Inf(1)) -var Default_Defaults_F_Ninf float32 = float32(math.Inf(-1)) -var Default_Defaults_F_Nan float32 = float32(math.NaN()) - -func (m *Defaults) GetF_Bool() bool { - if m != nil && m.F_Bool != nil { - return *m.F_Bool - } - return Default_Defaults_F_Bool -} - -func (m *Defaults) GetF_Int32() int32 { - if m != nil && m.F_Int32 != nil { - return *m.F_Int32 - } - return Default_Defaults_F_Int32 -} - -func (m *Defaults) GetF_Int64() int64 { - if m != nil && m.F_Int64 != nil { - return *m.F_Int64 - } - return Default_Defaults_F_Int64 -} - -func (m *Defaults) GetF_Fixed32() uint32 { - if m != nil && m.F_Fixed32 != nil { - return *m.F_Fixed32 - } - return Default_Defaults_F_Fixed32 -} - -func (m *Defaults) GetF_Fixed64() uint64 { - if m != nil && m.F_Fixed64 != nil { - return *m.F_Fixed64 - } - return Default_Defaults_F_Fixed64 -} - -func (m *Defaults) GetF_Uint32() uint32 { - if m != nil && m.F_Uint32 != nil { - return *m.F_Uint32 - } - return Default_Defaults_F_Uint32 -} - -func (m *Defaults) GetF_Uint64() uint64 { - if m != nil && m.F_Uint64 != nil { - return *m.F_Uint64 - } - return Default_Defaults_F_Uint64 -} - -func (m *Defaults) GetF_Float() float32 { - if m != nil && m.F_Float != nil { - return *m.F_Float - } - return Default_Defaults_F_Float -} - -func (m *Defaults) GetF_Double() float64 { - if m != nil && m.F_Double != nil { - return *m.F_Double - } - return Default_Defaults_F_Double -} - -func (m *Defaults) GetF_String() string { - if m != nil && m.F_String != nil { - return *m.F_String - } - return Default_Defaults_F_String -} - -func (m *Defaults) GetF_Bytes() []byte { - if m != nil && m.F_Bytes != nil { - return m.F_Bytes - } - return append([]byte(nil), Default_Defaults_F_Bytes...) -} - -func (m *Defaults) GetF_Sint32() int32 { - if m != nil && m.F_Sint32 != nil { - return *m.F_Sint32 - } - return Default_Defaults_F_Sint32 -} - -func (m *Defaults) GetF_Sint64() int64 { - if m != nil && m.F_Sint64 != nil { - return *m.F_Sint64 - } - return Default_Defaults_F_Sint64 -} - -func (m *Defaults) GetF_Enum() Defaults_Color { - if m != nil && m.F_Enum != nil { - return *m.F_Enum - } - return Default_Defaults_F_Enum -} - -func (m *Defaults) GetF_Pinf() float32 { - if m != nil && m.F_Pinf != nil { - return *m.F_Pinf - } - return Default_Defaults_F_Pinf -} - -func (m *Defaults) GetF_Ninf() float32 { - if m != nil && m.F_Ninf != nil { - return *m.F_Ninf - } - return Default_Defaults_F_Ninf -} - -func (m *Defaults) GetF_Nan() float32 { - if m != nil && m.F_Nan != nil { - return *m.F_Nan - } - return Default_Defaults_F_Nan -} - -func (m *Defaults) GetSub() *SubDefaults { - if m != nil { - return m.Sub - } - return nil -} - -type SubDefaults struct { - N *int64 `protobuf:"varint,1,opt,name=n,def=7" json:"n,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *SubDefaults) Reset() { *m = SubDefaults{} } -func (m *SubDefaults) String() string { return proto.CompactTextString(m) } -func (*SubDefaults) ProtoMessage() {} - -const Default_SubDefaults_N int64 = 7 - -func (m *SubDefaults) GetN() int64 { - if m != nil && m.N != nil { - return *m.N - } - return Default_SubDefaults_N -} - -type RepeatedEnum struct { - Color []RepeatedEnum_Color `protobuf:"varint,1,rep,name=color,enum=testdata.RepeatedEnum_Color" json:"color,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *RepeatedEnum) Reset() { *m = RepeatedEnum{} } -func (m *RepeatedEnum) String() string { return proto.CompactTextString(m) } -func (*RepeatedEnum) ProtoMessage() {} - -func (m *RepeatedEnum) GetColor() []RepeatedEnum_Color { - if m != nil { - return m.Color - } - return nil -} - -type MoreRepeated struct { - Bools []bool `protobuf:"varint,1,rep,name=bools" json:"bools,omitempty"` - BoolsPacked []bool `protobuf:"varint,2,rep,packed,name=bools_packed" json:"bools_packed,omitempty"` - Ints []int32 `protobuf:"varint,3,rep,name=ints" json:"ints,omitempty"` - IntsPacked []int32 `protobuf:"varint,4,rep,packed,name=ints_packed" json:"ints_packed,omitempty"` - Strings []string `protobuf:"bytes,5,rep,name=strings" json:"strings,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MoreRepeated) Reset() { *m = MoreRepeated{} } -func (m *MoreRepeated) String() string { return proto.CompactTextString(m) } -func (*MoreRepeated) ProtoMessage() {} - -func (m *MoreRepeated) GetBools() []bool { - if m != nil { - return m.Bools - } - return nil -} - -func (m *MoreRepeated) GetBoolsPacked() []bool { - if m != nil { - return m.BoolsPacked - } - return nil -} - -func (m *MoreRepeated) GetInts() []int32 { - if m != nil { - return m.Ints - } - return nil -} - -func (m *MoreRepeated) GetIntsPacked() []int32 { - if m != nil { - return m.IntsPacked - } - return nil -} - -func (m *MoreRepeated) GetStrings() []string { - if m != nil { - return m.Strings - } - return nil -} - -type GroupOld struct { - G *GroupOld_G `protobuf:"group,1,opt" json:"g,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GroupOld) Reset() { *m = GroupOld{} } -func (m *GroupOld) String() string { return proto.CompactTextString(m) } -func (*GroupOld) ProtoMessage() {} - -func (m *GroupOld) GetG() *GroupOld_G { - if m != nil { - return m.G - } - return nil -} - -type GroupOld_G struct { - X *int32 `protobuf:"varint,2,opt,name=x" json:"x,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GroupOld_G) Reset() { *m = GroupOld_G{} } - -func (m *GroupOld_G) GetX() int32 { - if m != nil && m.X != nil { - return *m.X - } - return 0 -} - -type GroupNew struct { - G *GroupNew_G `protobuf:"group,1,opt" json:"g,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GroupNew) Reset() { *m = GroupNew{} } -func (m *GroupNew) String() string { return proto.CompactTextString(m) } -func (*GroupNew) ProtoMessage() {} - -func (m *GroupNew) GetG() *GroupNew_G { - if m != nil { - return m.G - } - return nil -} - -type GroupNew_G struct { - X *int32 `protobuf:"varint,2,opt,name=x" json:"x,omitempty"` - Y *int32 `protobuf:"varint,3,opt,name=y" json:"y,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GroupNew_G) Reset() { *m = GroupNew_G{} } - -func (m *GroupNew_G) GetX() int32 { - if m != nil && m.X != nil { - return *m.X - } - return 0 -} - -func (m *GroupNew_G) GetY() int32 { - if m != nil && m.Y != nil { - return *m.Y - } - return 0 -} - -var E_Greeting = &proto.ExtensionDesc{ - ExtendedType: (*MyMessage)(nil), - ExtensionType: ([]string)(nil), - Field: 106, - Name: "testdata.greeting", - Tag: "bytes,106,rep,name=greeting", -} - -func init() { - proto.RegisterEnum("testdata.FOO", FOO_name, FOO_value) - proto.RegisterEnum("testdata.GoTest_KIND", GoTest_KIND_name, GoTest_KIND_value) - proto.RegisterEnum("testdata.MyMessage_Color", MyMessage_Color_name, MyMessage_Color_value) - proto.RegisterEnum("testdata.Defaults_Color", Defaults_Color_name, Defaults_Color_value) - proto.RegisterEnum("testdata.RepeatedEnum_Color", RepeatedEnum_Color_name, RepeatedEnum_Color_value) - proto.RegisterExtension(E_Ext_More) - proto.RegisterExtension(E_Ext_Text) - proto.RegisterExtension(E_Ext_Number) - proto.RegisterExtension(E_Greeting) -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.proto b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.proto deleted file mode 100644 index ac9542abc01..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.proto +++ /dev/null @@ -1,428 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// A feature-rich test file for the protocol compiler and libraries. - -syntax = "proto2"; - -package testdata; - -enum FOO { FOO1 = 1; }; - -message GoEnum { - required FOO foo = 1; -} - -message GoTestField { - required string Label = 1; - required string Type = 2; -} - -message GoTest { - // An enum, for completeness. - enum KIND { - VOID = 0; - - // Basic types - BOOL = 1; - BYTES = 2; - FINGERPRINT = 3; - FLOAT = 4; - INT = 5; - STRING = 6; - TIME = 7; - - // Groupings - TUPLE = 8; - ARRAY = 9; - MAP = 10; - - // Table types - TABLE = 11; - - // Functions - FUNCTION = 12; // last tag - }; - - // Some typical parameters - required KIND Kind = 1; - optional string Table = 2; - optional int32 Param = 3; - - // Required, repeated and optional foreign fields. - required GoTestField RequiredField = 4; - repeated GoTestField RepeatedField = 5; - optional GoTestField OptionalField = 6; - - // Required fields of all basic types - required bool F_Bool_required = 10; - required int32 F_Int32_required = 11; - required int64 F_Int64_required = 12; - required fixed32 F_Fixed32_required = 13; - required fixed64 F_Fixed64_required = 14; - required uint32 F_Uint32_required = 15; - required uint64 F_Uint64_required = 16; - required float F_Float_required = 17; - required double F_Double_required = 18; - required string F_String_required = 19; - required bytes F_Bytes_required = 101; - required sint32 F_Sint32_required = 102; - required sint64 F_Sint64_required = 103; - - // Repeated fields of all basic types - repeated bool F_Bool_repeated = 20; - repeated int32 F_Int32_repeated = 21; - repeated int64 F_Int64_repeated = 22; - repeated fixed32 F_Fixed32_repeated = 23; - repeated fixed64 F_Fixed64_repeated = 24; - repeated uint32 F_Uint32_repeated = 25; - repeated uint64 F_Uint64_repeated = 26; - repeated float F_Float_repeated = 27; - repeated double F_Double_repeated = 28; - repeated string F_String_repeated = 29; - repeated bytes F_Bytes_repeated = 201; - repeated sint32 F_Sint32_repeated = 202; - repeated sint64 F_Sint64_repeated = 203; - - // Optional fields of all basic types - optional bool F_Bool_optional = 30; - optional int32 F_Int32_optional = 31; - optional int64 F_Int64_optional = 32; - optional fixed32 F_Fixed32_optional = 33; - optional fixed64 F_Fixed64_optional = 34; - optional uint32 F_Uint32_optional = 35; - optional uint64 F_Uint64_optional = 36; - optional float F_Float_optional = 37; - optional double F_Double_optional = 38; - optional string F_String_optional = 39; - optional bytes F_Bytes_optional = 301; - optional sint32 F_Sint32_optional = 302; - optional sint64 F_Sint64_optional = 303; - - // Default-valued fields of all basic types - optional bool F_Bool_defaulted = 40 [default=true]; - optional int32 F_Int32_defaulted = 41 [default=32]; - optional int64 F_Int64_defaulted = 42 [default=64]; - optional fixed32 F_Fixed32_defaulted = 43 [default=320]; - optional fixed64 F_Fixed64_defaulted = 44 [default=640]; - optional uint32 F_Uint32_defaulted = 45 [default=3200]; - optional uint64 F_Uint64_defaulted = 46 [default=6400]; - optional float F_Float_defaulted = 47 [default=314159.]; - optional double F_Double_defaulted = 48 [default=271828.]; - optional string F_String_defaulted = 49 [default="hello, \"world!\"\n"]; - optional bytes F_Bytes_defaulted = 401 [default="Bignose"]; - optional sint32 F_Sint32_defaulted = 402 [default = -32]; - optional sint64 F_Sint64_defaulted = 403 [default = -64]; - - // Packed repeated fields (no string or bytes). - repeated bool F_Bool_repeated_packed = 50 [packed=true]; - repeated int32 F_Int32_repeated_packed = 51 [packed=true]; - repeated int64 F_Int64_repeated_packed = 52 [packed=true]; - repeated fixed32 F_Fixed32_repeated_packed = 53 [packed=true]; - repeated fixed64 F_Fixed64_repeated_packed = 54 [packed=true]; - repeated uint32 F_Uint32_repeated_packed = 55 [packed=true]; - repeated uint64 F_Uint64_repeated_packed = 56 [packed=true]; - repeated float F_Float_repeated_packed = 57 [packed=true]; - repeated double F_Double_repeated_packed = 58 [packed=true]; - repeated sint32 F_Sint32_repeated_packed = 502 [packed=true]; - repeated sint64 F_Sint64_repeated_packed = 503 [packed=true]; - - // Required, repeated, and optional groups. - required group RequiredGroup = 70 { - required string RequiredField = 71; - }; - - repeated group RepeatedGroup = 80 { - required string RequiredField = 81; - }; - - optional group OptionalGroup = 90 { - required string RequiredField = 91; - }; -} - -// For testing skipping of unrecognized fields. -// Numbers are all big, larger than tag numbers in GoTestField, -// the message used in the corresponding test. -message GoSkipTest { - required int32 skip_int32 = 11; - required fixed32 skip_fixed32 = 12; - required fixed64 skip_fixed64 = 13; - required string skip_string = 14; - required group SkipGroup = 15 { - required int32 group_int32 = 16; - required string group_string = 17; - } -} - -// For testing packed/non-packed decoder switching. -// A serialized instance of one should be deserializable as the other. -message NonPackedTest { - repeated int32 a = 1; -} - -message PackedTest { - repeated int32 b = 1 [packed=true]; -} - -message MaxTag { - // Maximum possible tag number. - optional string last_field = 536870911; -} - -message OldMessage { - message Nested { - optional string name = 1; - } - optional Nested nested = 1; - - optional int32 num = 2; -} - -// NewMessage is wire compatible with OldMessage; -// imagine it as a future version. -message NewMessage { - message Nested { - optional string name = 1; - optional string food_group = 2; - } - optional Nested nested = 1; - - // This is an int32 in OldMessage. - optional int64 num = 2; -} - -// Smaller tests for ASCII formatting. - -message InnerMessage { - required string host = 1; - optional int32 port = 2 [default=4000]; - optional bool connected = 3; -} - -message OtherMessage { - optional int64 key = 1; - optional bytes value = 2; - optional float weight = 3; - optional InnerMessage inner = 4; -} - -message MyMessage { - required int32 count = 1; - optional string name = 2; - optional string quote = 3; - repeated string pet = 4; - optional InnerMessage inner = 5; - repeated OtherMessage others = 6; - repeated InnerMessage rep_inner = 12; - - enum Color { - RED = 0; - GREEN = 1; - BLUE = 2; - }; - optional Color bikeshed = 7; - - optional group SomeGroup = 8 { - optional int32 group_field = 9; - } - - // This field becomes [][]byte in the generated code. - repeated bytes rep_bytes = 10; - - optional double bigfloat = 11; - - extensions 100 to max; -} - -message Ext { - extend MyMessage { - optional Ext more = 103; - optional string text = 104; - optional int32 number = 105; - } - - optional string data = 1; -} - -extend MyMessage { - repeated string greeting = 106; -} - -message MyMessageSet { - option message_set_wire_format = true; - extensions 100 to max; -} - -message Empty { -} - -extend MyMessageSet { - optional Empty x201 = 201; - optional Empty x202 = 202; - optional Empty x203 = 203; - optional Empty x204 = 204; - optional Empty x205 = 205; - optional Empty x206 = 206; - optional Empty x207 = 207; - optional Empty x208 = 208; - optional Empty x209 = 209; - optional Empty x210 = 210; - optional Empty x211 = 211; - optional Empty x212 = 212; - optional Empty x213 = 213; - optional Empty x214 = 214; - optional Empty x215 = 215; - optional Empty x216 = 216; - optional Empty x217 = 217; - optional Empty x218 = 218; - optional Empty x219 = 219; - optional Empty x220 = 220; - optional Empty x221 = 221; - optional Empty x222 = 222; - optional Empty x223 = 223; - optional Empty x224 = 224; - optional Empty x225 = 225; - optional Empty x226 = 226; - optional Empty x227 = 227; - optional Empty x228 = 228; - optional Empty x229 = 229; - optional Empty x230 = 230; - optional Empty x231 = 231; - optional Empty x232 = 232; - optional Empty x233 = 233; - optional Empty x234 = 234; - optional Empty x235 = 235; - optional Empty x236 = 236; - optional Empty x237 = 237; - optional Empty x238 = 238; - optional Empty x239 = 239; - optional Empty x240 = 240; - optional Empty x241 = 241; - optional Empty x242 = 242; - optional Empty x243 = 243; - optional Empty x244 = 244; - optional Empty x245 = 245; - optional Empty x246 = 246; - optional Empty x247 = 247; - optional Empty x248 = 248; - optional Empty x249 = 249; - optional Empty x250 = 250; -} - -message MessageList { - repeated group Message = 1 { - required string name = 2; - required int32 count = 3; - } -} - -message Strings { - optional string string_field = 1; - optional bytes bytes_field = 2; -} - -message Defaults { - enum Color { - RED = 0; - GREEN = 1; - BLUE = 2; - } - - // Default-valued fields of all basic types. - // Same as GoTest, but copied here to make testing easier. - optional bool F_Bool = 1 [default=true]; - optional int32 F_Int32 = 2 [default=32]; - optional int64 F_Int64 = 3 [default=64]; - optional fixed32 F_Fixed32 = 4 [default=320]; - optional fixed64 F_Fixed64 = 5 [default=640]; - optional uint32 F_Uint32 = 6 [default=3200]; - optional uint64 F_Uint64 = 7 [default=6400]; - optional float F_Float = 8 [default=314159.]; - optional double F_Double = 9 [default=271828.]; - optional string F_String = 10 [default="hello, \"world!\"\n"]; - optional bytes F_Bytes = 11 [default="Bignose"]; - optional sint32 F_Sint32 = 12 [default=-32]; - optional sint64 F_Sint64 = 13 [default=-64]; - optional Color F_Enum = 14 [default=GREEN]; - - // More fields with crazy defaults. - optional float F_Pinf = 15 [default=inf]; - optional float F_Ninf = 16 [default=-inf]; - optional float F_Nan = 17 [default=nan]; - - // Sub-message. - optional SubDefaults sub = 18; - - // Redundant but explicit defaults. - optional string str_zero = 19 [default=""]; -} - -message SubDefaults { - optional int64 n = 1 [default=7]; -} - -message RepeatedEnum { - enum Color { - RED = 1; - } - repeated Color color = 1; -} - -message MoreRepeated { - repeated bool bools = 1; - repeated bool bools_packed = 2 [packed=true]; - repeated int32 ints = 3; - repeated int32 ints_packed = 4 [packed=true]; - repeated int64 int64s_packed = 7 [packed=true]; - repeated string strings = 5; - repeated fixed32 fixeds = 6; -} - -// GroupOld and GroupNew have the same wire format. -// GroupNew has a new field inside a group. - -message GroupOld { - optional group G = 101 { - optional int32 x = 2; - } -} - -message GroupNew { - optional group G = 101 { - optional int32 x = 2; - optional int32 y = 3; - } -} - -message FloatingPoint { - required double f = 1; -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text.go deleted file mode 100644 index af6178989dc..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text.go +++ /dev/null @@ -1,730 +0,0 @@ -// Extensions for Protocol Buffers to create more go like structures. -// -// Copyright (c) 2013, Vastech SA (PTY) LTD. All rights reserved. -// http://github.com/gogo/protobuf/gogoproto -// -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -// Functions for writing the text protocol buffer format. - -import ( - "bufio" - "bytes" - "encoding" - "fmt" - "io" - "log" - "math" - "os" - "reflect" - "sort" - "strings" -) - -var ( - newline = []byte("\n") - spaces = []byte(" ") - gtNewline = []byte(">\n") - endBraceNewline = []byte("}\n") - backslashN = []byte{'\\', 'n'} - backslashR = []byte{'\\', 'r'} - backslashT = []byte{'\\', 't'} - backslashDQ = []byte{'\\', '"'} - backslashBS = []byte{'\\', '\\'} - posInf = []byte("inf") - negInf = []byte("-inf") - nan = []byte("nan") -) - -type writer interface { - io.Writer - WriteByte(byte) error -} - -// textWriter is an io.Writer that tracks its indentation level. -type textWriter struct { - ind int - complete bool // if the current position is a complete line - compact bool // whether to write out as a one-liner - w writer -} - -func (w *textWriter) WriteString(s string) (n int, err error) { - if !strings.Contains(s, "\n") { - if !w.compact && w.complete { - w.writeIndent() - } - w.complete = false - return io.WriteString(w.w, s) - } - // WriteString is typically called without newlines, so this - // codepath and its copy are rare. We copy to avoid - // duplicating all of Write's logic here. - return w.Write([]byte(s)) -} - -func (w *textWriter) Write(p []byte) (n int, err error) { - newlines := bytes.Count(p, newline) - if newlines == 0 { - if !w.compact && w.complete { - w.writeIndent() - } - n, err = w.w.Write(p) - w.complete = false - return n, err - } - - frags := bytes.SplitN(p, newline, newlines+1) - if w.compact { - for i, frag := range frags { - if i > 0 { - if err := w.w.WriteByte(' '); err != nil { - return n, err - } - n++ - } - nn, err := w.w.Write(frag) - n += nn - if err != nil { - return n, err - } - } - return n, nil - } - - for i, frag := range frags { - if w.complete { - w.writeIndent() - } - nn, err := w.w.Write(frag) - n += nn - if err != nil { - return n, err - } - if i+1 < len(frags) { - if err := w.w.WriteByte('\n'); err != nil { - return n, err - } - n++ - } - } - w.complete = len(frags[len(frags)-1]) == 0 - return n, nil -} - -func (w *textWriter) WriteByte(c byte) error { - if w.compact && c == '\n' { - c = ' ' - } - if !w.compact && w.complete { - w.writeIndent() - } - err := w.w.WriteByte(c) - w.complete = c == '\n' - return err -} - -func (w *textWriter) indent() { w.ind++ } - -func (w *textWriter) unindent() { - if w.ind == 0 { - log.Printf("proto: textWriter unindented too far") - return - } - w.ind-- -} - -func writeName(w *textWriter, props *Properties) error { - if _, err := w.WriteString(props.OrigName); err != nil { - return err - } - if props.Wire != "group" { - return w.WriteByte(':') - } - return nil -} - -var ( - messageSetType = reflect.TypeOf((*MessageSet)(nil)).Elem() -) - -// raw is the interface satisfied by RawMessage. -type raw interface { - Bytes() []byte -} - -func writeStruct(w *textWriter, sv reflect.Value) error { - if sv.Type() == messageSetType { - return writeMessageSet(w, sv.Addr().Interface().(*MessageSet)) - } - - st := sv.Type() - sprops := GetProperties(st) - for i := 0; i < sv.NumField(); i++ { - fv := sv.Field(i) - props := sprops.Prop[i] - name := st.Field(i).Name - - if strings.HasPrefix(name, "XXX_") { - // There are two XXX_ fields: - // XXX_unrecognized []byte - // XXX_extensions map[int32]proto.Extension - // The first is handled here; - // the second is handled at the bottom of this function. - if name == "XXX_unrecognized" && !fv.IsNil() { - if err := writeUnknownStruct(w, fv.Interface().([]byte)); err != nil { - return err - } - } - continue - } - if fv.Kind() == reflect.Ptr && fv.IsNil() { - // Field not filled in. This could be an optional field or - // a required field that wasn't filled in. Either way, there - // isn't anything we can show for it. - continue - } - if fv.Kind() == reflect.Slice && fv.IsNil() { - // Repeated field that is empty, or a bytes field that is unused. - continue - } - - if props.Repeated && fv.Kind() == reflect.Slice { - // Repeated field. - for j := 0; j < fv.Len(); j++ { - if err := writeName(w, props); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - v := fv.Index(j) - if v.Kind() == reflect.Ptr && v.IsNil() { - // A nil message in a repeated field is not valid, - // but we can handle that more gracefully than panicking. - if _, err := w.Write([]byte("\n")); err != nil { - return err - } - continue - } - if len(props.Enum) > 0 { - if err := writeEnum(w, v, props); err != nil { - return err - } - } else if err := writeAny(w, v, props); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - continue - } - - if err := writeName(w, props); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if b, ok := fv.Interface().(raw); ok { - if err := writeRaw(w, b.Bytes()); err != nil { - return err - } - continue - } - - if len(props.Enum) > 0 { - if err := writeEnum(w, fv, props); err != nil { - return err - } - } else if err := writeAny(w, fv, props); err != nil { - return err - } - - if err := w.WriteByte('\n'); err != nil { - return err - } - } - - // Extensions (the XXX_extensions field). - pv := sv.Addr() - if pv.Type().Implements(extendableProtoType) { - if err := writeExtensions(w, pv); err != nil { - return err - } - } - - return nil -} - -// writeRaw writes an uninterpreted raw message. -func writeRaw(w *textWriter, b []byte) error { - if err := w.WriteByte('<'); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte('\n'); err != nil { - return err - } - } - w.indent() - if err := writeUnknownStruct(w, b); err != nil { - return err - } - w.unindent() - if err := w.WriteByte('>'); err != nil { - return err - } - return nil -} - -// writeAny writes an arbitrary field. -func writeAny(w *textWriter, v reflect.Value, props *Properties) error { - v = reflect.Indirect(v) - - if props != nil && len(props.CustomType) > 0 { - var custom Marshaler = v.Interface().(Marshaler) - data, err := custom.Marshal() - if err != nil { - return err - } - if err := writeString(w, string(data)); err != nil { - return err - } - return nil - } - - // Floats have special cases. - if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { - x := v.Float() - var b []byte - switch { - case math.IsInf(x, 1): - b = posInf - case math.IsInf(x, -1): - b = negInf - case math.IsNaN(x): - b = nan - } - if b != nil { - _, err := w.Write(b) - return err - } - // Other values are handled below. - } - - // We don't attempt to serialise every possible value type; only those - // that can occur in protocol buffers. - switch v.Kind() { - case reflect.Slice: - // Should only be a []byte; repeated fields are handled in writeStruct. - if err := writeString(w, string(v.Interface().([]byte))); err != nil { - return err - } - case reflect.String: - if err := writeString(w, v.String()); err != nil { - return err - } - case reflect.Struct: - // Required/optional group/message. - var bra, ket byte = '<', '>' - if props != nil && props.Wire == "group" { - bra, ket = '{', '}' - } - if err := w.WriteByte(bra); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte('\n'); err != nil { - return err - } - } - w.indent() - if tm, ok := v.Interface().(encoding.TextMarshaler); ok { - text, err := tm.MarshalText() - if err != nil { - return err - } - if _, err = w.Write(text); err != nil { - return err - } - } else if err := writeStruct(w, v); err != nil { - return err - } - w.unindent() - if err := w.WriteByte(ket); err != nil { - return err - } - default: - _, err := fmt.Fprint(w, v.Interface()) - return err - } - return nil -} - -// equivalent to C's isprint. -func isprint(c byte) bool { - return c >= 0x20 && c < 0x7f -} - -// writeString writes a string in the protocol buffer text format. -// It is similar to strconv.Quote except we don't use Go escape sequences, -// we treat the string as a byte sequence, and we use octal escapes. -// These differences are to maintain interoperability with the other -// languages' implementations of the text format. -func writeString(w *textWriter, s string) error { - // use WriteByte here to get any needed indent - if err := w.WriteByte('"'); err != nil { - return err - } - // Loop over the bytes, not the runes. - for i := 0; i < len(s); i++ { - var err error - // Divergence from C++: we don't escape apostrophes. - // There's no need to escape them, and the C++ parser - // copes with a naked apostrophe. - switch c := s[i]; c { - case '\n': - _, err = w.w.Write(backslashN) - case '\r': - _, err = w.w.Write(backslashR) - case '\t': - _, err = w.w.Write(backslashT) - case '"': - _, err = w.w.Write(backslashDQ) - case '\\': - _, err = w.w.Write(backslashBS) - default: - if isprint(c) { - err = w.w.WriteByte(c) - } else { - _, err = fmt.Fprintf(w.w, "\\%03o", c) - } - } - if err != nil { - return err - } - } - return w.WriteByte('"') -} - -func writeMessageSet(w *textWriter, ms *MessageSet) error { - for _, item := range ms.Item { - id := *item.TypeId - if msd, ok := messageSetMap[id]; ok { - // Known message set type. - if _, err := fmt.Fprintf(w, "[%s]: <\n", msd.name); err != nil { - return err - } - w.indent() - - pb := reflect.New(msd.t.Elem()) - if err := Unmarshal(item.Message, pb.Interface().(Message)); err != nil { - if _, err := fmt.Fprintf(w, "/* bad message: %v */\n", err); err != nil { - return err - } - } else { - if err := writeStruct(w, pb.Elem()); err != nil { - return err - } - } - } else { - // Unknown type. - if _, err := fmt.Fprintf(w, "[%d]: <\n", id); err != nil { - return err - } - w.indent() - if err := writeUnknownStruct(w, item.Message); err != nil { - return err - } - } - w.unindent() - if _, err := w.Write(gtNewline); err != nil { - return err - } - } - return nil -} - -func writeUnknownStruct(w *textWriter, data []byte) (err error) { - if !w.compact { - if _, err := fmt.Fprintf(w, "/* %d unknown bytes */\n", len(data)); err != nil { - return err - } - } - b := NewBuffer(data) - for b.index < len(b.buf) { - x, err := b.DecodeVarint() - if err != nil { - _, err := fmt.Fprintf(w, "/* %v */\n", err) - return err - } - wire, tag := x&7, x>>3 - if wire == WireEndGroup { - w.unindent() - if _, err := w.Write(endBraceNewline); err != nil { - return err - } - continue - } - if _, err := fmt.Fprint(w, tag); err != nil { - return err - } - if wire != WireStartGroup { - if err := w.WriteByte(':'); err != nil { - return err - } - } - if !w.compact || wire == WireStartGroup { - if err := w.WriteByte(' '); err != nil { - return err - } - } - switch wire { - case WireBytes: - buf, e := b.DecodeRawBytes(false) - if e == nil { - _, err = fmt.Fprintf(w, "%q", buf) - } else { - _, err = fmt.Fprintf(w, "/* %v */", e) - } - case WireFixed32: - x, err = b.DecodeFixed32() - err = writeUnknownInt(w, x, err) - case WireFixed64: - x, err = b.DecodeFixed64() - err = writeUnknownInt(w, x, err) - case WireStartGroup: - err = w.WriteByte('{') - w.indent() - case WireVarint: - x, err = b.DecodeVarint() - err = writeUnknownInt(w, x, err) - default: - _, err = fmt.Fprintf(w, "/* unknown wire type %d */", wire) - } - if err != nil { - return err - } - if err = w.WriteByte('\n'); err != nil { - return err - } - } - return nil -} - -func writeUnknownInt(w *textWriter, x uint64, err error) error { - if err == nil { - _, err = fmt.Fprint(w, x) - } else { - _, err = fmt.Fprintf(w, "/* %v */", err) - } - return err -} - -type int32Slice []int32 - -func (s int32Slice) Len() int { return len(s) } -func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } -func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } - -// writeExtensions writes all the extensions in pv. -// pv is assumed to be a pointer to a protocol message struct that is extendable. -func writeExtensions(w *textWriter, pv reflect.Value) error { - emap := extensionMaps[pv.Type().Elem()] - ep := pv.Interface().(extendableProto) - - // Order the extensions by ID. - // This isn't strictly necessary, but it will give us - // canonical output, which will also make testing easier. - var m map[int32]Extension - if em, ok := ep.(extensionsMap); ok { - m = em.ExtensionMap() - } else if em, ok := ep.(extensionsBytes); ok { - eb := em.GetExtensions() - var err error - m, err = BytesToExtensionsMap(*eb) - if err != nil { - return err - } - } - - ids := make([]int32, 0, len(m)) - for id := range m { - ids = append(ids, id) - } - sort.Sort(int32Slice(ids)) - - for _, extNum := range ids { - ext := m[extNum] - var desc *ExtensionDesc - if emap != nil { - desc = emap[extNum] - } - if desc == nil { - // Unknown extension. - if err := writeUnknownStruct(w, ext.enc); err != nil { - return err - } - continue - } - - pb, err := GetExtension(ep, desc) - if err != nil { - if _, err := fmt.Fprintln(os.Stderr, "proto: failed getting extension: ", err); err != nil { - return err - } - continue - } - - // Repeated extensions will appear as a slice. - if !desc.repeated() { - if err := writeExtension(w, desc.Name, pb); err != nil { - return err - } - } else { - v := reflect.ValueOf(pb) - for i := 0; i < v.Len(); i++ { - if err := writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil { - return err - } - } - } - } - return nil -} - -func writeExtension(w *textWriter, name string, pb interface{}) error { - if _, err := fmt.Fprintf(w, "[%s]:", name); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if err := writeAny(w, reflect.ValueOf(pb), nil); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - return nil -} - -func (w *textWriter) writeIndent() { - if !w.complete { - return - } - remain := w.ind * 2 - for remain > 0 { - n := remain - if n > len(spaces) { - n = len(spaces) - } - w.w.Write(spaces[:n]) - remain -= n - } - w.complete = false -} - -func marshalText(w io.Writer, pb Message, compact bool) error { - val := reflect.ValueOf(pb) - if pb == nil || val.IsNil() { - w.Write([]byte("")) - return nil - } - var bw *bufio.Writer - ww, ok := w.(writer) - if !ok { - bw = bufio.NewWriter(w) - ww = bw - } - aw := &textWriter{ - w: ww, - complete: true, - compact: compact, - } - - if tm, ok := pb.(encoding.TextMarshaler); ok { - text, err := tm.MarshalText() - if err != nil { - return err - } - if _, err = aw.Write(text); err != nil { - return err - } - if bw != nil { - return bw.Flush() - } - return nil - } - // Dereference the received pointer so we don't have outer < and >. - v := reflect.Indirect(val) - if err := writeStruct(aw, v); err != nil { - return err - } - if bw != nil { - return bw.Flush() - } - return nil -} - -// MarshalText writes a given protocol buffer in text format. -// The only errors returned are from w. -func MarshalText(w io.Writer, pb Message) error { - return marshalText(w, pb, false) -} - -// MarshalTextString is the same as MarshalText, but returns the string directly. -func MarshalTextString(pb Message) string { - var buf bytes.Buffer - marshalText(&buf, pb, false) - return buf.String() -} - -// CompactText writes a given protocol buffer in compact text format (one line). -func CompactText(w io.Writer, pb Message) error { return marshalText(w, pb, true) } - -// CompactTextString is the same as CompactText, but returns the string directly. -func CompactTextString(pb Message) string { - var buf bytes.Buffer - marshalText(&buf, pb, true) - return buf.String() -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_gogo.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_gogo.go deleted file mode 100644 index cdb23373c39..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_gogo.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2013, Vastech SA (PTY) LTD. All rights reserved. -// http://github.com/gogo/protobuf/gogoproto -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "fmt" - "reflect" -) - -func writeEnum(w *textWriter, v reflect.Value, props *Properties) error { - m, ok := enumStringMaps[props.Enum] - if !ok { - if err := writeAny(w, v, props); err != nil { - return err - } - } - key := int32(0) - if v.Kind() == reflect.Ptr { - key = int32(v.Elem().Int()) - } else { - key = int32(v.Int()) - } - s, ok := m[key] - if !ok { - if err := writeAny(w, v, props); err != nil { - return err - } - } - _, err := fmt.Fprint(w, s) - return err -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_parser.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_parser.go deleted file mode 100644 index 151bf73ea22..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_parser.go +++ /dev/null @@ -1,730 +0,0 @@ -// Extensions for Protocol Buffers to create more go like structures. -// -// Copyright (c) 2013, Vastech SA (PTY) LTD. All rights reserved. -// http://github.com/gogo/protobuf/gogoproto -// -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -// Functions for parsing the Text protocol buffer format. -// TODO: message sets. - -import ( - "encoding" - "errors" - "fmt" - "reflect" - "strconv" - "strings" - "unicode/utf8" -) - -type ParseError struct { - Message string - Line int // 1-based line number - Offset int // 0-based byte offset from start of input -} - -func (p *ParseError) Error() string { - if p.Line == 1 { - // show offset only for first line - return fmt.Sprintf("line 1.%d: %v", p.Offset, p.Message) - } - return fmt.Sprintf("line %d: %v", p.Line, p.Message) -} - -type token struct { - value string - err *ParseError - line int // line number - offset int // byte number from start of input, not start of line - unquoted string // the unquoted version of value, if it was a quoted string -} - -func (t *token) String() string { - if t.err == nil { - return fmt.Sprintf("%q (line=%d, offset=%d)", t.value, t.line, t.offset) - } - return fmt.Sprintf("parse error: %v", t.err) -} - -type textParser struct { - s string // remaining input - done bool // whether the parsing is finished (success or error) - backed bool // whether back() was called - offset, line int - cur token -} - -func newTextParser(s string) *textParser { - p := new(textParser) - p.s = s - p.line = 1 - p.cur.line = 1 - return p -} - -func (p *textParser) errorf(format string, a ...interface{}) *ParseError { - pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset} - p.cur.err = pe - p.done = true - return pe -} - -// Numbers and identifiers are matched by [-+._A-Za-z0-9] -func isIdentOrNumberChar(c byte) bool { - switch { - case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z': - return true - case '0' <= c && c <= '9': - return true - } - switch c { - case '-', '+', '.', '_': - return true - } - return false -} - -func isWhitespace(c byte) bool { - switch c { - case ' ', '\t', '\n', '\r': - return true - } - return false -} - -func (p *textParser) skipWhitespace() { - i := 0 - for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') { - if p.s[i] == '#' { - // comment; skip to end of line or input - for i < len(p.s) && p.s[i] != '\n' { - i++ - } - if i == len(p.s) { - break - } - } - if p.s[i] == '\n' { - p.line++ - } - i++ - } - p.offset += i - p.s = p.s[i:len(p.s)] - if len(p.s) == 0 { - p.done = true - } -} - -func (p *textParser) advance() { - // Skip whitespace - p.skipWhitespace() - if p.done { - return - } - - // Start of non-whitespace - p.cur.err = nil - p.cur.offset, p.cur.line = p.offset, p.line - p.cur.unquoted = "" - switch p.s[0] { - case '<', '>', '{', '}', ':', '[', ']', ';', ',': - // Single symbol - p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)] - case '"', '\'': - // Quoted string - i := 1 - for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' { - if p.s[i] == '\\' && i+1 < len(p.s) { - // skip escaped char - i++ - } - i++ - } - if i >= len(p.s) || p.s[i] != p.s[0] { - p.errorf("unmatched quote") - return - } - unq, err := unquoteC(p.s[1:i], rune(p.s[0])) - if err != nil { - p.errorf("invalid quoted string %v", p.s[0:i+1]) - return - } - p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)] - p.cur.unquoted = unq - default: - i := 0 - for i < len(p.s) && isIdentOrNumberChar(p.s[i]) { - i++ - } - if i == 0 { - p.errorf("unexpected byte %#x", p.s[0]) - return - } - p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)] - } - p.offset += len(p.cur.value) -} - -var ( - errBadUTF8 = errors.New("proto: bad UTF-8") - errBadHex = errors.New("proto: bad hexadecimal") -) - -func unquoteC(s string, quote rune) (string, error) { - // This is based on C++'s tokenizer.cc. - // Despite its name, this is *not* parsing C syntax. - // For instance, "\0" is an invalid quoted string. - - // Avoid allocation in trivial cases. - simple := true - for _, r := range s { - if r == '\\' || r == quote { - simple = false - break - } - } - if simple { - return s, nil - } - - buf := make([]byte, 0, 3*len(s)/2) - for len(s) > 0 { - r, n := utf8.DecodeRuneInString(s) - if r == utf8.RuneError && n == 1 { - return "", errBadUTF8 - } - s = s[n:] - if r != '\\' { - if r < utf8.RuneSelf { - buf = append(buf, byte(r)) - } else { - buf = append(buf, string(r)...) - } - continue - } - - ch, tail, err := unescape(s) - if err != nil { - return "", err - } - buf = append(buf, ch...) - s = tail - } - return string(buf), nil -} - -func unescape(s string) (ch string, tail string, err error) { - r, n := utf8.DecodeRuneInString(s) - if r == utf8.RuneError && n == 1 { - return "", "", errBadUTF8 - } - s = s[n:] - switch r { - case 'a': - return "\a", s, nil - case 'b': - return "\b", s, nil - case 'f': - return "\f", s, nil - case 'n': - return "\n", s, nil - case 'r': - return "\r", s, nil - case 't': - return "\t", s, nil - case 'v': - return "\v", s, nil - case '?': - return "?", s, nil // trigraph workaround - case '\'', '"', '\\': - return string(r), s, nil - case '0', '1', '2', '3', '4', '5', '6', '7', 'x', 'X': - if len(s) < 2 { - return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) - } - base := 8 - ss := s[:2] - s = s[2:] - if r == 'x' || r == 'X' { - base = 16 - } else { - ss = string(r) + ss - } - i, err := strconv.ParseUint(ss, base, 8) - if err != nil { - return "", "", err - } - return string([]byte{byte(i)}), s, nil - case 'u', 'U': - n := 4 - if r == 'U' { - n = 8 - } - if len(s) < n { - return "", "", fmt.Errorf(`\%c requires %d digits`, r, n) - } - - bs := make([]byte, n/2) - for i := 0; i < n; i += 2 { - a, ok1 := unhex(s[i]) - b, ok2 := unhex(s[i+1]) - if !ok1 || !ok2 { - return "", "", errBadHex - } - bs[i/2] = a<<4 | b - } - s = s[n:] - return string(bs), s, nil - } - return "", "", fmt.Errorf(`unknown escape \%c`, r) -} - -// Adapted from src/pkg/strconv/quote.go. -func unhex(b byte) (v byte, ok bool) { - switch { - case '0' <= b && b <= '9': - return b - '0', true - case 'a' <= b && b <= 'f': - return b - 'a' + 10, true - case 'A' <= b && b <= 'F': - return b - 'A' + 10, true - } - return 0, false -} - -// Back off the parser by one token. Can only be done between calls to next(). -// It makes the next advance() a no-op. -func (p *textParser) back() { p.backed = true } - -// Advances the parser and returns the new current token. -func (p *textParser) next() *token { - if p.backed || p.done { - p.backed = false - return &p.cur - } - p.advance() - if p.done { - p.cur.value = "" - } else if len(p.cur.value) > 0 && p.cur.value[0] == '"' { - // Look for multiple quoted strings separated by whitespace, - // and concatenate them. - cat := p.cur - for { - p.skipWhitespace() - if p.done || p.s[0] != '"' { - break - } - p.advance() - if p.cur.err != nil { - return &p.cur - } - cat.value += " " + p.cur.value - cat.unquoted += p.cur.unquoted - } - p.done = false // parser may have seen EOF, but we want to return cat - p.cur = cat - } - return &p.cur -} - -// Return a RequiredNotSetError indicating which required field was not set. -func (p *textParser) missingRequiredFieldError(sv reflect.Value) *RequiredNotSetError { - st := sv.Type() - sprops := GetProperties(st) - for i := 0; i < st.NumField(); i++ { - if !isNil(sv.Field(i)) { - continue - } - - props := sprops.Prop[i] - if props.Required { - return &RequiredNotSetError{fmt.Sprintf("%v.%v", st, props.OrigName)} - } - } - return &RequiredNotSetError{fmt.Sprintf("%v.", st)} // should not happen -} - -// Returns the index in the struct for the named field, as well as the parsed tag properties. -func structFieldByName(st reflect.Type, name string) (int, *Properties, bool) { - sprops := GetProperties(st) - i, ok := sprops.decoderOrigNames[name] - if ok { - return i, sprops.Prop[i], true - } - return -1, nil, false -} - -// Consume a ':' from the input stream (if the next token is a colon), -// returning an error if a colon is needed but not present. -func (p *textParser) checkForColon(props *Properties, typ reflect.Type) *ParseError { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != ":" { - // Colon is optional when the field is a group or message. - needColon := true - switch props.Wire { - case "group": - needColon = false - case "bytes": - // A "bytes" field is either a message, a string, or a repeated field; - // those three become *T, *string and []T respectively, so we can check for - // this field being a pointer to a non-string. - if typ.Kind() == reflect.Ptr { - // *T or *string - if typ.Elem().Kind() == reflect.String { - break - } - } else if typ.Kind() == reflect.Slice { - // []T or []*T - if typ.Elem().Kind() != reflect.Ptr { - break - } - } - needColon = false - } - if needColon { - return p.errorf("expected ':', found %q", tok.value) - } - p.back() - } - return nil -} - -func (p *textParser) readStruct(sv reflect.Value, terminator string) error { - st := sv.Type() - reqCount := GetProperties(st).reqCount - var reqFieldErr error - fieldSet := make(map[string]bool) - // A struct is a sequence of "name: value", terminated by one of - // '>' or '}', or the end of the input. A name may also be - // "[extension]". - for { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == terminator { - break - } - if tok.value == "[" { - // Looks like an extension. - // - // TODO: Check whether we need to handle - // namespace rooted names (e.g. ".something.Foo"). - tok = p.next() - if tok.err != nil { - return tok.err - } - var desc *ExtensionDesc - // This could be faster, but it's functional. - // TODO: Do something smarter than a linear scan. - for _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) { - if d.Name == tok.value { - desc = d - break - } - } - if desc == nil { - return p.errorf("unrecognized extension %q", tok.value) - } - // Check the extension terminator. - tok = p.next() - if tok.err != nil { - return tok.err - } - if tok.value != "]" { - return p.errorf("unrecognized extension terminator %q", tok.value) - } - - props := &Properties{} - props.Parse(desc.Tag) - - typ := reflect.TypeOf(desc.ExtensionType) - if err := p.checkForColon(props, typ); err != nil { - return err - } - - rep := desc.repeated() - - // Read the extension structure, and set it in - // the value we're constructing. - var ext reflect.Value - if !rep { - ext = reflect.New(typ).Elem() - } else { - ext = reflect.New(typ.Elem()).Elem() - } - if err := p.readAny(ext, props); err != nil { - if _, ok := err.(*RequiredNotSetError); !ok { - return err - } - reqFieldErr = err - } - ep := sv.Addr().Interface().(extendableProto) - if !rep { - SetExtension(ep, desc, ext.Interface()) - } else { - old, err := GetExtension(ep, desc) - var sl reflect.Value - if err == nil { - sl = reflect.ValueOf(old) // existing slice - } else { - sl = reflect.MakeSlice(typ, 0, 1) - } - sl = reflect.Append(sl, ext) - SetExtension(ep, desc, sl.Interface()) - } - } else { - // This is a normal, non-extension field. - name := tok.value - fi, props, ok := structFieldByName(st, name) - if !ok { - return p.errorf("unknown field name %q in %v", name, st) - } - - dst := sv.Field(fi) - - // Check that it's not already set if it's not a repeated field. - if !props.Repeated && fieldSet[name] { - return p.errorf("non-repeated field %q was repeated", name) - } - - if err := p.checkForColon(props, st.Field(fi).Type); err != nil { - return err - } - - // Parse into the field. - fieldSet[name] = true - if err := p.readAny(dst, props); err != nil { - if _, ok := err.(*RequiredNotSetError); !ok { - return err - } - reqFieldErr = err - } else if props.Required { - reqCount-- - } - } - - // For backward compatibility, permit a semicolon or comma after a field. - tok = p.next() - if tok.err != nil { - return tok.err - } - if tok.value != ";" && tok.value != "," { - p.back() - } - } - - if reqCount > 0 { - return p.missingRequiredFieldError(sv) - } - return reqFieldErr -} - -func (p *textParser) readAny(v reflect.Value, props *Properties) error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == "" { - return p.errorf("unexpected EOF") - } - if len(props.CustomType) > 0 { - if props.Repeated { - t := reflect.TypeOf(v.Interface()) - if t.Kind() == reflect.Slice { - tc := reflect.TypeOf(new(Marshaler)) - ok := t.Elem().Implements(tc.Elem()) - if ok { - fv := v - flen := fv.Len() - if flen == fv.Cap() { - nav := reflect.MakeSlice(v.Type(), flen, 2*flen+1) - reflect.Copy(nav, fv) - fv.Set(nav) - } - fv.SetLen(flen + 1) - - // Read one. - p.back() - return p.readAny(fv.Index(flen), props) - } - } - } - if reflect.TypeOf(v.Interface()).Kind() == reflect.Ptr { - custom := reflect.New(props.ctype.Elem()).Interface().(Unmarshaler) - err := custom.Unmarshal([]byte(tok.unquoted)) - if err != nil { - return p.errorf("%v %v: %v", err, v.Type(), tok.value) - } - v.Set(reflect.ValueOf(custom)) - } else { - custom := reflect.New(reflect.TypeOf(v.Interface())).Interface().(Unmarshaler) - err := custom.Unmarshal([]byte(tok.unquoted)) - if err != nil { - return p.errorf("%v %v: %v", err, v.Type(), tok.value) - } - v.Set(reflect.Indirect(reflect.ValueOf(custom))) - } - return nil - } - switch fv := v; fv.Kind() { - case reflect.Slice: - at := v.Type() - if at.Elem().Kind() == reflect.Uint8 { - // Special case for []byte - if tok.value[0] != '"' && tok.value[0] != '\'' { - // Deliberately written out here, as the error after - // this switch statement would write "invalid []byte: ...", - // which is not as user-friendly. - return p.errorf("invalid string: %v", tok.value) - } - bytes := []byte(tok.unquoted) - fv.Set(reflect.ValueOf(bytes)) - return nil - } - // Repeated field. May already exist. - flen := fv.Len() - if flen == fv.Cap() { - nav := reflect.MakeSlice(at, flen, 2*flen+1) - reflect.Copy(nav, fv) - fv.Set(nav) - } - fv.SetLen(flen + 1) - - // Read one. - p.back() - return p.readAny(fv.Index(flen), props) - case reflect.Bool: - // Either "true", "false", 1 or 0. - switch tok.value { - case "true", "1": - fv.SetBool(true) - return nil - case "false", "0": - fv.SetBool(false) - return nil - } - case reflect.Float32, reflect.Float64: - v := tok.value - // Ignore 'f' for compatibility with output generated by C++, but don't - // remove 'f' when the value is "-inf" or "inf". - if strings.HasSuffix(v, "f") && tok.value != "-inf" && tok.value != "inf" { - v = v[:len(v)-1] - } - if f, err := strconv.ParseFloat(v, fv.Type().Bits()); err == nil { - fv.SetFloat(f) - return nil - } - case reflect.Int32: - if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { - fv.SetInt(x) - return nil - } - - if len(props.Enum) == 0 { - break - } - m, ok := enumValueMaps[props.Enum] - if !ok { - break - } - x, ok := m[tok.value] - if !ok { - break - } - fv.SetInt(int64(x)) - return nil - case reflect.Int64: - if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { - fv.SetInt(x) - return nil - } - - case reflect.Ptr: - // A basic field (indirected through pointer), or a repeated message/group - p.back() - fv.Set(reflect.New(fv.Type().Elem())) - return p.readAny(fv.Elem(), props) - case reflect.String: - if tok.value[0] == '"' || tok.value[0] == '\'' { - fv.SetString(tok.unquoted) - return nil - } - case reflect.Struct: - var terminator string - switch tok.value { - case "{": - terminator = "}" - case "<": - terminator = ">" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - // TODO: Handle nested messages which implement encoding.TextUnmarshaler. - return p.readStruct(fv, terminator) - case reflect.Uint32: - if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { - fv.SetUint(uint64(x)) - return nil - } - case reflect.Uint64: - if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { - fv.SetUint(x) - return nil - } - } - return p.errorf("invalid %v: %v", v.Type(), tok.value) -} - -// UnmarshalText reads a protocol buffer in Text format. UnmarshalText resets pb -// before starting to unmarshal, so any existing data in pb is always removed. -// If a required field is not set and no other error occurs, -// UnmarshalText returns *RequiredNotSetError. -func UnmarshalText(s string, pb Message) error { - if um, ok := pb.(encoding.TextUnmarshaler); ok { - err := um.UnmarshalText([]byte(s)) - return err - } - pb.Reset() - v := reflect.ValueOf(pb) - if pe := newTextParser(s).readStruct(v.Elem(), ""); pe != nil { - return pe - } - return nil -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_parser_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_parser_test.go deleted file mode 100644 index 9a2dcfaac59..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_parser_test.go +++ /dev/null @@ -1,468 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto_test - -import ( - "math" - "reflect" - "testing" - - . "./testdata" - . "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" -) - -type UnmarshalTextTest struct { - in string - err string // if "", no error expected - out *MyMessage -} - -func buildExtStructTest(text string) UnmarshalTextTest { - msg := &MyMessage{ - Count: Int32(42), - } - SetExtension(msg, E_Ext_More, &Ext{ - Data: String("Hello, world!"), - }) - return UnmarshalTextTest{in: text, out: msg} -} - -func buildExtDataTest(text string) UnmarshalTextTest { - msg := &MyMessage{ - Count: Int32(42), - } - SetExtension(msg, E_Ext_Text, String("Hello, world!")) - SetExtension(msg, E_Ext_Number, Int32(1729)) - return UnmarshalTextTest{in: text, out: msg} -} - -func buildExtRepStringTest(text string) UnmarshalTextTest { - msg := &MyMessage{ - Count: Int32(42), - } - if err := SetExtension(msg, E_Greeting, []string{"bula", "hola"}); err != nil { - panic(err) - } - return UnmarshalTextTest{in: text, out: msg} -} - -var unMarshalTextTests = []UnmarshalTextTest{ - // Basic - { - in: " count:42\n name:\"Dave\" ", - out: &MyMessage{ - Count: Int32(42), - Name: String("Dave"), - }, - }, - - // Empty quoted string - { - in: `count:42 name:""`, - out: &MyMessage{ - Count: Int32(42), - Name: String(""), - }, - }, - - // Quoted string concatenation - { - in: `count:42 name: "My name is "` + "\n" + `"elsewhere"`, - out: &MyMessage{ - Count: Int32(42), - Name: String("My name is elsewhere"), - }, - }, - - // Quoted string with escaped apostrophe - { - in: `count:42 name: "HOLIDAY - New Year\'s Day"`, - out: &MyMessage{ - Count: Int32(42), - Name: String("HOLIDAY - New Year's Day"), - }, - }, - - // Quoted string with single quote - { - in: `count:42 name: 'Roger "The Ramster" Ramjet'`, - out: &MyMessage{ - Count: Int32(42), - Name: String(`Roger "The Ramster" Ramjet`), - }, - }, - - // Quoted string with all the accepted special characters from the C++ test - { - in: `count:42 name: ` + "\"\\\"A string with \\' characters \\n and \\r newlines and \\t tabs and \\001 slashes \\\\ and multiple spaces\"", - out: &MyMessage{ - Count: Int32(42), - Name: String("\"A string with ' characters \n and \r newlines and \t tabs and \001 slashes \\ and multiple spaces"), - }, - }, - - // Quoted string with quoted backslash - { - in: `count:42 name: "\\'xyz"`, - out: &MyMessage{ - Count: Int32(42), - Name: String(`\'xyz`), - }, - }, - - // Quoted string with UTF-8 bytes. - { - in: "count:42 name: '\303\277\302\201\xAB'", - out: &MyMessage{ - Count: Int32(42), - Name: String("\303\277\302\201\xAB"), - }, - }, - - // Bad quoted string - { - in: `inner: < host: "\0" >` + "\n", - err: `line 1.15: invalid quoted string "\0"`, - }, - - // Number too large for int64 - { - in: "count: 1 others { key: 123456789012345678901 }", - err: "line 1.23: invalid int64: 123456789012345678901", - }, - - // Number too large for int32 - { - in: "count: 1234567890123", - err: "line 1.7: invalid int32: 1234567890123", - }, - - // Number in hexadecimal - { - in: "count: 0x2beef", - out: &MyMessage{ - Count: Int32(0x2beef), - }, - }, - - // Number in octal - { - in: "count: 024601", - out: &MyMessage{ - Count: Int32(024601), - }, - }, - - // Floating point number with "f" suffix - { - in: "count: 4 others:< weight: 17.0f >", - out: &MyMessage{ - Count: Int32(4), - Others: []*OtherMessage{ - { - Weight: Float32(17), - }, - }, - }, - }, - - // Floating point positive infinity - { - in: "count: 4 bigfloat: inf", - out: &MyMessage{ - Count: Int32(4), - Bigfloat: Float64(math.Inf(1)), - }, - }, - - // Floating point negative infinity - { - in: "count: 4 bigfloat: -inf", - out: &MyMessage{ - Count: Int32(4), - Bigfloat: Float64(math.Inf(-1)), - }, - }, - - // Number too large for float32 - { - in: "others:< weight: 12345678901234567890123456789012345678901234567890 >", - err: "line 1.17: invalid float32: 12345678901234567890123456789012345678901234567890", - }, - - // Number posing as a quoted string - { - in: `inner: < host: 12 >` + "\n", - err: `line 1.15: invalid string: 12`, - }, - - // Quoted string posing as int32 - { - in: `count: "12"`, - err: `line 1.7: invalid int32: "12"`, - }, - - // Quoted string posing a float32 - { - in: `others:< weight: "17.4" >`, - err: `line 1.17: invalid float32: "17.4"`, - }, - - // Enum - { - in: `count:42 bikeshed: BLUE`, - out: &MyMessage{ - Count: Int32(42), - Bikeshed: MyMessage_BLUE.Enum(), - }, - }, - - // Repeated field - { - in: `count:42 pet: "horsey" pet:"bunny"`, - out: &MyMessage{ - Count: Int32(42), - Pet: []string{"horsey", "bunny"}, - }, - }, - - // Repeated message with/without colon and <>/{} - { - in: `count:42 others:{} others{} others:<> others:{}`, - out: &MyMessage{ - Count: Int32(42), - Others: []*OtherMessage{ - {}, - {}, - {}, - {}, - }, - }, - }, - - // Missing colon for inner message - { - in: `count:42 inner < host: "cauchy.syd" >`, - out: &MyMessage{ - Count: Int32(42), - Inner: &InnerMessage{ - Host: String("cauchy.syd"), - }, - }, - }, - - // Missing colon for string field - { - in: `name "Dave"`, - err: `line 1.5: expected ':', found "\"Dave\""`, - }, - - // Missing colon for int32 field - { - in: `count 42`, - err: `line 1.6: expected ':', found "42"`, - }, - - // Missing required field - { - in: `name: "Pawel"`, - err: `proto: required field "testdata.MyMessage.count" not set`, - out: &MyMessage{ - Name: String("Pawel"), - }, - }, - - // Repeated non-repeated field - { - in: `name: "Rob" name: "Russ"`, - err: `line 1.12: non-repeated field "name" was repeated`, - }, - - // Group - { - in: `count: 17 SomeGroup { group_field: 12 }`, - out: &MyMessage{ - Count: Int32(17), - Somegroup: &MyMessage_SomeGroup{ - GroupField: Int32(12), - }, - }, - }, - - // Semicolon between fields - { - in: `count:3;name:"Calvin"`, - out: &MyMessage{ - Count: Int32(3), - Name: String("Calvin"), - }, - }, - // Comma between fields - { - in: `count:4,name:"Ezekiel"`, - out: &MyMessage{ - Count: Int32(4), - Name: String("Ezekiel"), - }, - }, - - // Extension - buildExtStructTest(`count: 42 [testdata.Ext.more]:`), - buildExtStructTest(`count: 42 [testdata.Ext.more] {data:"Hello, world!"}`), - buildExtDataTest(`count: 42 [testdata.Ext.text]:"Hello, world!" [testdata.Ext.number]:1729`), - buildExtRepStringTest(`count: 42 [testdata.greeting]:"bula" [testdata.greeting]:"hola"`), - - // Big all-in-one - { - in: "count:42 # Meaning\n" + - `name:"Dave" ` + - `quote:"\"I didn't want to go.\"" ` + - `pet:"bunny" ` + - `pet:"kitty" ` + - `pet:"horsey" ` + - `inner:<` + - ` host:"footrest.syd" ` + - ` port:7001 ` + - ` connected:true ` + - `> ` + - `others:<` + - ` key:3735928559 ` + - ` value:"\x01A\a\f" ` + - `> ` + - `others:<` + - " weight:58.9 # Atomic weight of Co\n" + - ` inner:<` + - ` host:"lesha.mtv" ` + - ` port:8002 ` + - ` >` + - `>`, - out: &MyMessage{ - Count: Int32(42), - Name: String("Dave"), - Quote: String(`"I didn't want to go."`), - Pet: []string{"bunny", "kitty", "horsey"}, - Inner: &InnerMessage{ - Host: String("footrest.syd"), - Port: Int32(7001), - Connected: Bool(true), - }, - Others: []*OtherMessage{ - { - Key: Int64(3735928559), - Value: []byte{0x1, 'A', '\a', '\f'}, - }, - { - Weight: Float32(58.9), - Inner: &InnerMessage{ - Host: String("lesha.mtv"), - Port: Int32(8002), - }, - }, - }, - }, - }, -} - -func TestUnmarshalText(t *testing.T) { - for i, test := range unMarshalTextTests { - pb := new(MyMessage) - err := UnmarshalText(test.in, pb) - if test.err == "" { - // We don't expect failure. - if err != nil { - t.Errorf("Test %d: Unexpected error: %v", i, err) - } else if !reflect.DeepEqual(pb, test.out) { - t.Errorf("Test %d: Incorrect populated \nHave: %v\nWant: %v", - i, pb, test.out) - } - } else { - // We do expect failure. - if err == nil { - t.Errorf("Test %d: Didn't get expected error: %v", i, test.err) - } else if err.Error() != test.err { - t.Errorf("Test %d: Incorrect error.\nHave: %v\nWant: %v", - i, err.Error(), test.err) - } else if _, ok := err.(*RequiredNotSetError); ok && test.out != nil && !reflect.DeepEqual(pb, test.out) { - t.Errorf("Test %d: Incorrect populated \nHave: %v\nWant: %v", - i, pb, test.out) - } - } - } -} - -func TestUnmarshalTextCustomMessage(t *testing.T) { - msg := &textMessage{} - if err := UnmarshalText("custom", msg); err != nil { - t.Errorf("Unexpected error from custom unmarshal: %v", err) - } - if UnmarshalText("not custom", msg) == nil { - t.Errorf("Didn't get expected error from custom unmarshal") - } -} - -// Regression test; this caused a panic. -func TestRepeatedEnum(t *testing.T) { - pb := new(RepeatedEnum) - if err := UnmarshalText("color: RED", pb); err != nil { - t.Fatal(err) - } - exp := &RepeatedEnum{ - Color: []RepeatedEnum_Color{RepeatedEnum_RED}, - } - if !Equal(pb, exp) { - t.Errorf("Incorrect populated \nHave: %v\nWant: %v", pb, exp) - } -} - -var benchInput string - -func init() { - benchInput = "count: 4\n" - for i := 0; i < 1000; i++ { - benchInput += "pet: \"fido\"\n" - } - - // Check it is valid input. - pb := new(MyMessage) - err := UnmarshalText(benchInput, pb) - if err != nil { - panic("Bad benchmark input: " + err.Error()) - } -} - -func BenchmarkUnmarshalText(b *testing.B) { - pb := new(MyMessage) - for i := 0; i < b.N; i++ { - UnmarshalText(benchInput, pb) - } - b.SetBytes(int64(len(benchInput))) -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_test.go deleted file mode 100644 index 0b750f62a5e..00000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_test.go +++ /dev/null @@ -1,407 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto_test - -import ( - "bytes" - "errors" - "io/ioutil" - "math" - "strings" - "testing" - - pb "./testdata" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" -) - -// textMessage implements the methods that allow it to marshal and unmarshal -// itself as text. -type textMessage struct { -} - -func (*textMessage) MarshalText() ([]byte, error) { - return []byte("custom"), nil -} - -func (*textMessage) UnmarshalText(bytes []byte) error { - if string(bytes) != "custom" { - return errors.New("expected 'custom'") - } - return nil -} - -func (*textMessage) Reset() {} -func (*textMessage) String() string { return "" } -func (*textMessage) ProtoMessage() {} - -func newTestMessage() *pb.MyMessage { - msg := &pb.MyMessage{ - Count: proto.Int32(42), - Name: proto.String("Dave"), - Quote: proto.String(`"I didn't want to go."`), - Pet: []string{"bunny", "kitty", "horsey"}, - Inner: &pb.InnerMessage{ - Host: proto.String("footrest.syd"), - Port: proto.Int32(7001), - Connected: proto.Bool(true), - }, - Others: []*pb.OtherMessage{ - { - Key: proto.Int64(0xdeadbeef), - Value: []byte{1, 65, 7, 12}, - }, - { - Weight: proto.Float32(6.022), - Inner: &pb.InnerMessage{ - Host: proto.String("lesha.mtv"), - Port: proto.Int32(8002), - }, - }, - }, - Bikeshed: pb.MyMessage_BLUE.Enum(), - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: proto.Int32(8), - }, - // One normally wouldn't do this. - // This is an undeclared tag 13, as a varint (wire type 0) with value 4. - XXX_unrecognized: []byte{13<<3 | 0, 4}, - } - ext := &pb.Ext{ - Data: proto.String("Big gobs for big rats"), - } - if err := proto.SetExtension(msg, pb.E_Ext_More, ext); err != nil { - panic(err) - } - greetings := []string{"adg", "easy", "cow"} - if err := proto.SetExtension(msg, pb.E_Greeting, greetings); err != nil { - panic(err) - } - - // Add an unknown extension. We marshal a pb.Ext, and fake the ID. - b, err := proto.Marshal(&pb.Ext{Data: proto.String("3G skiing")}) - if err != nil { - panic(err) - } - b = append(proto.EncodeVarint(201<<3|proto.WireBytes), b...) - proto.SetRawExtension(msg, 201, b) - - // Extensions can be plain fields, too, so let's test that. - b = append(proto.EncodeVarint(202<<3|proto.WireVarint), 19) - proto.SetRawExtension(msg, 202, b) - - return msg -} - -const text = `count: 42 -name: "Dave" -quote: "\"I didn't want to go.\"" -pet: "bunny" -pet: "kitty" -pet: "horsey" -inner: < - host: "footrest.syd" - port: 7001 - connected: true -> -others: < - key: 3735928559 - value: "\001A\007\014" -> -others: < - weight: 6.022 - inner: < - host: "lesha.mtv" - port: 8002 - > -> -bikeshed: BLUE -SomeGroup { - group_field: 8 -} -/* 2 unknown bytes */ -13: 4 -[testdata.Ext.more]: < - data: "Big gobs for big rats" -> -[testdata.greeting]: "adg" -[testdata.greeting]: "easy" -[testdata.greeting]: "cow" -/* 13 unknown bytes */ -201: "\t3G skiing" -/* 3 unknown bytes */ -202: 19 -` - -func TestMarshalText(t *testing.T) { - buf := new(bytes.Buffer) - if err := proto.MarshalText(buf, newTestMessage()); err != nil { - t.Fatalf("proto.MarshalText: %v", err) - } - s := buf.String() - if s != text { - t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", s, text) - } -} - -func TestMarshalTextCustomMessage(t *testing.T) { - buf := new(bytes.Buffer) - if err := proto.MarshalText(buf, &textMessage{}); err != nil { - t.Fatalf("proto.MarshalText: %v", err) - } - s := buf.String() - if s != "custom" { - t.Errorf("Got %q, expected %q", s, "custom") - } -} -func TestMarshalTextNil(t *testing.T) { - want := "" - tests := []proto.Message{nil, (*pb.MyMessage)(nil)} - for i, test := range tests { - buf := new(bytes.Buffer) - if err := proto.MarshalText(buf, test); err != nil { - t.Fatal(err) - } - if got := buf.String(); got != want { - t.Errorf("%d: got %q want %q", i, got, want) - } - } -} - -func TestMarshalTextUnknownEnum(t *testing.T) { - // The Color enum only specifies values 0-2. - m := &pb.MyMessage{Bikeshed: pb.MyMessage_Color(3).Enum()} - got := m.String() - const want = `bikeshed:3 ` - if got != want { - t.Errorf("\n got %q\nwant %q", got, want) - } -} - -func BenchmarkMarshalTextBuffered(b *testing.B) { - buf := new(bytes.Buffer) - m := newTestMessage() - for i := 0; i < b.N; i++ { - buf.Reset() - proto.MarshalText(buf, m) - } -} - -func BenchmarkMarshalTextUnbuffered(b *testing.B) { - w := ioutil.Discard - m := newTestMessage() - for i := 0; i < b.N; i++ { - proto.MarshalText(w, m) - } -} - -func compact(src string) string { - // s/[ \n]+/ /g; s/ $//; - dst := make([]byte, len(src)) - space, comment := false, false - j := 0 - for i := 0; i < len(src); i++ { - if strings.HasPrefix(src[i:], "/*") { - comment = true - i++ - continue - } - if comment && strings.HasPrefix(src[i:], "*/") { - comment = false - i++ - continue - } - if comment { - continue - } - c := src[i] - if c == ' ' || c == '\n' { - space = true - continue - } - if j > 0 && (dst[j-1] == ':' || dst[j-1] == '<' || dst[j-1] == '{') { - space = false - } - if c == '{' { - space = false - } - if space { - dst[j] = ' ' - j++ - space = false - } - dst[j] = c - j++ - } - if space { - dst[j] = ' ' - j++ - } - return string(dst[0:j]) -} - -var compactText = compact(text) - -func TestCompactText(t *testing.T) { - s := proto.CompactTextString(newTestMessage()) - if s != compactText { - t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v\n===\n", s, compactText) - } -} - -func TestStringEscaping(t *testing.T) { - testCases := []struct { - in *pb.Strings - out string - }{ - { - // Test data from C++ test (TextFormatTest.StringEscape). - // Single divergence: we don't escape apostrophes. - &pb.Strings{StringField: proto.String("\"A string with ' characters \n and \r newlines and \t tabs and \001 slashes \\ and multiple spaces")}, - "string_field: \"\\\"A string with ' characters \\n and \\r newlines and \\t tabs and \\001 slashes \\\\ and multiple spaces\"\n", - }, - { - // Test data from the same C++ test. - &pb.Strings{StringField: proto.String("\350\260\267\346\255\214")}, - "string_field: \"\\350\\260\\267\\346\\255\\214\"\n", - }, - { - // Some UTF-8. - &pb.Strings{StringField: proto.String("\x00\x01\xff\x81")}, - `string_field: "\000\001\377\201"` + "\n", - }, - } - - for i, tc := range testCases { - var buf bytes.Buffer - if err := proto.MarshalText(&buf, tc.in); err != nil { - t.Errorf("proto.MarsalText: %v", err) - continue - } - s := buf.String() - if s != tc.out { - t.Errorf("#%d: Got:\n%s\nExpected:\n%s\n", i, s, tc.out) - continue - } - - // Check round-trip. - pb := new(pb.Strings) - if err := proto.UnmarshalText(s, pb); err != nil { - t.Errorf("#%d: UnmarshalText: %v", i, err) - continue - } - if !proto.Equal(pb, tc.in) { - t.Errorf("#%d: Round-trip failed:\nstart: %v\n end: %v", i, tc.in, pb) - } - } -} - -// A limitedWriter accepts some output before it fails. -// This is a proxy for something like a nearly-full or imminently-failing disk, -// or a network connection that is about to die. -type limitedWriter struct { - b bytes.Buffer - limit int -} - -var outOfSpace = errors.New("proto: insufficient space") - -func (w *limitedWriter) Write(p []byte) (n int, err error) { - var avail = w.limit - w.b.Len() - if avail <= 0 { - return 0, outOfSpace - } - if len(p) <= avail { - return w.b.Write(p) - } - n, _ = w.b.Write(p[:avail]) - return n, outOfSpace -} - -func TestMarshalTextFailing(t *testing.T) { - // Try lots of different sizes to exercise more error code-paths. - for lim := 0; lim < len(text); lim++ { - buf := new(limitedWriter) - buf.limit = lim - err := proto.MarshalText(buf, newTestMessage()) - // We expect a certain error, but also some partial results in the buffer. - if err != outOfSpace { - t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", err, outOfSpace) - } - s := buf.b.String() - x := text[:buf.limit] - if s != x { - t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", s, x) - } - } -} - -func TestFloats(t *testing.T) { - tests := []struct { - f float64 - want string - }{ - {0, "0"}, - {4.7, "4.7"}, - {math.Inf(1), "inf"}, - {math.Inf(-1), "-inf"}, - {math.NaN(), "nan"}, - } - for _, test := range tests { - msg := &pb.FloatingPoint{F: &test.f} - got := strings.TrimSpace(msg.String()) - want := `f:` + test.want - if got != want { - t.Errorf("f=%f: got %q, want %q", test.f, got, want) - } - } -} - -func TestRepeatedNilText(t *testing.T) { - m := &pb.MessageList{ - Message: []*pb.MessageList_Message{ - nil, - { - Name: proto.String("Horse"), - }, - nil, - }, - } - want := `Message -Message { - name: "Horse" -} -Message -` - if s := proto.MarshalTextString(m); s != want { - t.Errorf(" got: %s\nwant: %s", s, want) - } -} diff --git a/diagnostics/diag.go b/diagnostics/diag.go index 398322b6682..193adcfa758 100644 --- a/diagnostics/diag.go +++ b/diagnostics/diag.go @@ -11,8 +11,8 @@ import ( "sync" "time" - ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ctxio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/io" pb "github.com/ipfs/go-ipfs/diagnostics/pb" host "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/host" diff --git a/diagnostics/pb/diagnostics.pb.go b/diagnostics/pb/diagnostics.pb.go index 904937ac0e7..a44e1d41f11 100644 --- a/diagnostics/pb/diagnostics.pb.go +++ b/diagnostics/pb/diagnostics.pb.go @@ -13,7 +13,7 @@ It has these top-level messages: */ package diagnostics_pb -import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" +import proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. diff --git a/exchange/bitswap/message/message.go b/exchange/bitswap/message/message.go index a0acf8d35d5..d8c7408e0d8 100644 --- a/exchange/bitswap/message/message.go +++ b/exchange/bitswap/message/message.go @@ -9,8 +9,8 @@ import ( wantlist "github.com/ipfs/go-ipfs/exchange/bitswap/wantlist" inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" - ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) // TODO move message.go into the bitswap package diff --git a/exchange/bitswap/message/message_test.go b/exchange/bitswap/message/message_test.go index 70d966e0a25..db79208d245 100644 --- a/exchange/bitswap/message/message_test.go +++ b/exchange/bitswap/message/message_test.go @@ -4,7 +4,7 @@ import ( "bytes" "testing" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/exchange/bitswap/message/pb/message.pb.go b/exchange/bitswap/message/pb/message.pb.go index 828d1a225cc..02f9f29447c 100644 --- a/exchange/bitswap/message/pb/message.pb.go +++ b/exchange/bitswap/message/pb/message.pb.go @@ -13,7 +13,7 @@ It has these top-level messages: */ package bitswap_message_pb -import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" +import proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. diff --git a/fuse/readonly/readonly_unix.go b/fuse/readonly/readonly_unix.go index 7384e62c7d1..062a892bbd8 100644 --- a/fuse/readonly/readonly_unix.go +++ b/fuse/readonly/readonly_unix.go @@ -11,7 +11,7 @@ import ( fuse "github.com/ipfs/go-ipfs/Godeps/_workspace/src/bazil.org/fuse" fs "github.com/ipfs/go-ipfs/Godeps/_workspace/src/bazil.org/fuse/fs" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" core "github.com/ipfs/go-ipfs/core" mdag "github.com/ipfs/go-ipfs/merkledag" path "github.com/ipfs/go-ipfs/path" diff --git a/merkledag/pb/merkledag.pb.go b/merkledag/pb/merkledag.pb.go index a0dfa91f8e5..a4c73580f93 100644 --- a/merkledag/pb/merkledag.pb.go +++ b/merkledag/pb/merkledag.pb.go @@ -14,14 +14,14 @@ */ package merkledag_pb -import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" +import proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" import math "math" // discarding unused import gogoproto "code.google.com/p/gogoprotobuf/gogoproto/gogo.pb" import io "io" import fmt "fmt" -import github_com_gogo_protobuf_proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" +import github_com_gogo_protobuf_proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" import strings "strings" import reflect "reflect" diff --git a/merkledag/pb/merkledagpb_test.go b/merkledag/pb/merkledagpb_test.go index dd55e22300a..b59fca7faf9 100644 --- a/merkledag/pb/merkledagpb_test.go +++ b/merkledag/pb/merkledagpb_test.go @@ -17,7 +17,7 @@ package merkledag_pb import testing "testing" import math_rand "math/rand" import time "time" -import github_com_gogo_protobuf_proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" +import github_com_gogo_protobuf_proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" import encoding_json "encoding/json" import fmt "fmt" import go_parser "go/parser" diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index beeb0ac7c9b..fb171e901d1 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" diff --git a/namesys/pb/namesys.pb.go b/namesys/pb/namesys.pb.go index 0508e772dfd..31e6355d7dd 100644 --- a/namesys/pb/namesys.pb.go +++ b/namesys/pb/namesys.pb.go @@ -13,7 +13,7 @@ It has these top-level messages: */ package namesys_pb -import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" +import proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. diff --git a/namesys/publisher.go b/namesys/publisher.go index 8cf44c9d756..241b40d3adb 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -6,7 +6,7 @@ import ( "fmt" "time" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 4c4ca9386cb..2647a395430 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -13,7 +13,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" gpctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" diff --git a/namesys/routing.go b/namesys/routing.go index 933bdd041b7..7d499fe61af 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -4,7 +4,7 @@ import ( "fmt" "time" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" lru "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/hashicorp/golang-lru" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/package.json b/package.json index f727583a08f..f09363df226 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,11 @@ "name": "randbo", "hash": "QmYvsG72GsfLgUeSojXArjnU6L4Wmwk7wuAxtNLuyXcc1T", "version": "0.0.0" + }, + { + "name": "gogo-protobuf", + "hash": "QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV", + "version": "0.0.0" } ], "language": "go", diff --git a/pin/internal/pb/header.pb.go b/pin/internal/pb/header.pb.go index eafb246e702..b77d37743e5 100644 --- a/pin/internal/pb/header.pb.go +++ b/pin/internal/pb/header.pb.go @@ -13,7 +13,7 @@ It has these top-level messages: */ package pb -import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" +import proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. diff --git a/pin/set.go b/pin/set.go index a07762a3195..f3d82581846 100644 --- a/pin/set.go +++ b/pin/set.go @@ -11,7 +11,7 @@ import ( "sort" "unsafe" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" diff --git a/routing/dht/dht.go b/routing/dht/dht.go index ddab5044f3d..aad30fa5136 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -20,7 +20,7 @@ import ( protocol "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/protocol" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index e88a94dc6b8..d54c678efc1 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -4,7 +4,7 @@ import ( "errors" "time" - ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" + ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" ctxio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/io" pb "github.com/ipfs/go-ipfs/routing/dht/pb" inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index adff49c90cb..dad0ac645d8 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -7,7 +7,7 @@ import ( "testing" "time" - ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" + ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 265ff49f916..84320ab5de5 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -5,7 +5,7 @@ import ( "fmt" "time" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" diff --git a/routing/dht/pb/dht.pb.go b/routing/dht/pb/dht.pb.go index 2d7ad1d9db9..24dc2e5be35 100644 --- a/routing/dht/pb/dht.pb.go +++ b/routing/dht/pb/dht.pb.go @@ -14,7 +14,7 @@ It has these top-level messages: */ package dht_pb -import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" +import proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 407f0c09424..15e7eebebab 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -4,7 +4,7 @@ import ( "errors" "time" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 7e5f80275fb..5dd6ceb87cc 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -4,7 +4,7 @@ import ( "errors" "time" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" diff --git a/routing/record/record.go b/routing/record/record.go index 2adcc21bc05..78051e6963e 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -3,7 +3,7 @@ package record import ( "bytes" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 8838b7aeb32..8f7d063b614 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -5,7 +5,7 @@ import ( "errors" "time" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index c067f634b3a..4fc7b7f04d7 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -1,7 +1,7 @@ package proxy import ( - ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" + ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 00892de88ba..e8ec2f4340c 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -3,7 +3,7 @@ package proxy import ( "errors" - ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" + ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 46caf03eac3..8c79d21728d 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -4,7 +4,7 @@ import ( "errors" "fmt" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" datastore "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 2d470b66753..32596618a23 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -6,7 +6,7 @@ import ( "path" "time" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" cxt "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" mdag "github.com/ipfs/go-ipfs/merkledag" diff --git a/unixfs/format.go b/unixfs/format.go index 0bf56943801..af62f994f6c 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -6,7 +6,7 @@ package unixfs import ( "errors" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pb "github.com/ipfs/go-ipfs/unixfs/pb" ) diff --git a/unixfs/format_test.go b/unixfs/format_test.go index f178b5615ef..ac35db56f17 100644 --- a/unixfs/format_test.go +++ b/unixfs/format_test.go @@ -3,7 +3,7 @@ package unixfs import ( "testing" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pb "github.com/ipfs/go-ipfs/unixfs/pb" ) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index a1a104e4421..5b2a8b112ea 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -7,7 +7,7 @@ import ( "io" "os" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" mdag "github.com/ipfs/go-ipfs/merkledag" diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 0f5793867f7..38d4459d955 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -6,7 +6,7 @@ import ( "io" "os" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/unixfs/pb/unixfs.pb.go b/unixfs/pb/unixfs.pb.go index e89fca29a33..55348ad7661 100644 --- a/unixfs/pb/unixfs.pb.go +++ b/unixfs/pb/unixfs.pb.go @@ -14,7 +14,7 @@ It has these top-level messages: */ package unixfs_pb -import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" +import proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. From d7dab3afea5f67b941b0be9e2a4ced3672d610c9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 9 Feb 2016 10:56:19 -0800 Subject: [PATCH 5/5] Use gx vendored go-ipfs-utils where possible For the rest of the packages in util, move them to thirdparty and update the references. util is gone! License: MIT Signed-off-by: Jeromy --- .../github.com/jbenet/go-multiaddr/codec.go | 2 +- .../jbenet/go-multihash/multihash/main.go | 4 +- .../jbenet/go-multihash/opts/coding.go | 2 +- .../jbenet/go-multihash/opts/opts.go | 2 +- blocks/blocks.go | 4 +- blocks/blockstore/blockstore.go | 2 +- blocks/key/key.go | 2 +- blocks/key/key_test.go | 2 +- blockservice/test/blocks_test.go | 2 +- cmd/ipfs/daemon.go | 2 +- cmd/ipfs/main.go | 2 +- commands/cli/parse.go | 2 +- commands/option.go | 2 +- commands/request.go | 2 +- core/bootstrap.go | 2 +- core/bootstrap_test.go | 2 +- core/commands/add.go | 2 +- core/commands/bitswap.go | 2 +- core/commands/block.go | 4 +- core/commands/bootstrap.go | 2 +- core/commands/config.go | 2 +- core/commands/dht.go | 2 +- core/commands/dns.go | 2 +- core/commands/id.go | 2 +- core/commands/ipns.go | 2 +- core/commands/object/object.go | 2 +- core/commands/object/patch.go | 2 +- core/commands/pin.go | 2 +- core/commands/ping.go | 2 +- core/commands/refs.go | 2 +- core/commands/repo.go | 2 +- core/commands/resolve.go | 2 +- core/commands/stat.go | 2 +- core/commands/swarm.go | 2 +- core/core.go | 2 +- core/core_test.go | 2 +- core/corehttp/gateway_test.go | 2 +- core/coreunix/add_test.go | 2 +- core/coreunix/metadata_test.go | 2 +- core/mock/mock.go | 4 +- exchange/bitswap/bitswap_test.go | 2 +- exchange/bitswap/decision/bench_test.go | 2 +- exchange/bitswap/decision/engine_test.go | 2 +- .../decision/peer_request_queue_test.go | 2 +- exchange/bitswap/testnet/interface.go | 2 +- exchange/bitswap/testnet/network_test.go | 2 +- exchange/bitswap/testnet/peernet.go | 2 +- exchange/bitswap/testnet/virtual.go | 2 +- exchange/bitswap/testutils.go | 4 +- exchange/reprovide/reprovide_test.go | 2 +- fuse/ipns/ipns_test.go | 4 +- fuse/node/mount_test.go | 2 +- fuse/readonly/ipfs_test.go | 4 +- fuse/readonly/readonly_unix.go | 4 +- importer/balanced/balanced_test.go | 2 +- importer/chunk/rabin_test.go | 2 +- importer/chunk/splitting_test.go | 2 +- importer/importer_test.go | 2 +- importer/trickle/trickle_test.go | 2 +- merkledag/coding.go | 4 +- merkledag/merkledag_test.go | 2 +- merkledag/node.go | 2 +- mfs/mfs_test.go | 2 +- mfs/repub_test.go | 2 +- namesys/ipns_select_test.go | 2 +- namesys/publisher.go | 2 +- namesys/resolve_test.go | 4 +- namesys/routing.go | 4 +- path/path.go | 2 +- path/resolver.go | 2 +- path/resolver_test.go | 2 +- pin/pin_test.go | 2 +- repo/config/bootstrap_peers.go | 2 +- repo/config/config.go | 4 +- repo/config/supernode.go | 2 +- repo/fsrepo/fsrepo.go | 5 +- repo/fsrepo/lock/lock.go | 2 +- repo/fsrepo/serialize/serialize.go | 2 +- routing/dht/dht_bootstrap.go | 2 +- routing/dht/dht_test.go | 6 +- routing/dht/ext_test.go | 2 +- routing/dht/handlers.go | 6 +- routing/dht/lookup.go | 2 +- routing/dht/query.go | 6 +- routing/dht/routing.go | 2 +- routing/kbucket/table_test.go | 2 +- routing/kbucket/util.go | 2 +- routing/keyspace/xor.go | 2 +- routing/keyspace/xor_test.go | 2 +- routing/mock/centralized_client.go | 6 +- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 2 +- routing/mock/interface.go | 2 +- routing/record/validation.go | 2 +- test/integration/addcat_test.go | 2 +- test/integration/bench_cat_test.go | 2 +- test/integration/bench_test.go | 2 +- test/integration/grandcentral_test.go | 4 +- test/integration/three_legged_cat_test.go | 2 +- test/supernode_client/main.go | 4 +- .../datastore2/datastore_closer.go | 0 {util => thirdparty}/datastore2/delayed.go | 0 {util => thirdparty}/datastore2/threadsafe.go | 0 {util => thirdparty}/ipfsaddr/ipfsaddr.go | 0 .../ipfsaddr/ipfsaddr_test.go | 0 .../loggables/loggables.go | 0 {util => thirdparty}/peerset/peerset.go | 0 {util => thirdparty}/testutil/ci/ci.go | 2 +- .../testutil/ci/travis/travis.go | 0 .../testutil/ci/travis/travis_test.go | 0 {util => thirdparty}/testutil/datastore.go | 2 +- {util => thirdparty}/testutil/gen.go | 2 +- {util => thirdparty}/testutil/identity.go | 0 .../testutil/latency_config.go | 0 {util => thirdparty}/testutil/rand.go | 0 {util => thirdparty}/todocounter/counter.go | 0 unixfs/mod/dagmodifier.go | 2 +- unixfs/mod/dagmodifier_test.go | 2 +- util/context.go | 35 ---- util/context_test.go | 28 --- util/do.go | 22 --- util/do_test.go | 42 ----- util/file.go | 11 -- util/file_test.go | 10 -- util/pipes/duplex.go | 14 -- util/sadhack/godep.go | 9 - util/time.go | 17 -- util/time_test.go | 16 -- util/util.go | 159 ------------------ util/util_test.go | 63 ------- 131 files changed, 130 insertions(+), 555 deletions(-) rename {util => thirdparty}/datastore2/datastore_closer.go (100%) rename {util => thirdparty}/datastore2/delayed.go (100%) rename {util => thirdparty}/datastore2/threadsafe.go (100%) rename {util => thirdparty}/ipfsaddr/ipfsaddr.go (100%) rename {util => thirdparty}/ipfsaddr/ipfsaddr_test.go (100%) rename {util/eventlog => thirdparty}/loggables/loggables.go (100%) rename {util => thirdparty}/peerset/peerset.go (100%) rename {util => thirdparty}/testutil/ci/ci.go (94%) rename {util => thirdparty}/testutil/ci/travis/travis.go (100%) rename {util => thirdparty}/testutil/ci/travis/travis_test.go (100%) rename {util => thirdparty}/testutil/datastore.go (86%) rename {util => thirdparty}/testutil/gen.go (98%) rename {util => thirdparty}/testutil/identity.go (100%) rename {util => thirdparty}/testutil/latency_config.go (100%) rename {util => thirdparty}/testutil/rand.go (100%) rename {util => thirdparty}/todocounter/counter.go (100%) delete mode 100644 util/context.go delete mode 100644 util/context_test.go delete mode 100644 util/do.go delete mode 100644 util/do_test.go delete mode 100644 util/file.go delete mode 100644 util/file_test.go delete mode 100644 util/pipes/duplex.go delete mode 100644 util/sadhack/godep.go delete mode 100644 util/time.go delete mode 100644 util/time_test.go delete mode 100644 util/util.go delete mode 100644 util/util_test.go diff --git a/Godeps/_workspace/src/github.com/jbenet/go-multiaddr/codec.go b/Godeps/_workspace/src/github.com/jbenet/go-multiaddr/codec.go index 9fbd1ca72ab..8a7d9b7dfd0 100644 --- a/Godeps/_workspace/src/github.com/jbenet/go-multiaddr/codec.go +++ b/Godeps/_workspace/src/github.com/jbenet/go-multiaddr/codec.go @@ -8,7 +8,7 @@ import ( "strconv" "strings" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" ) func stringToBytes(s string) ([]byte, error) { diff --git a/Godeps/_workspace/src/github.com/jbenet/go-multihash/multihash/main.go b/Godeps/_workspace/src/github.com/jbenet/go-multihash/multihash/main.go index 9a569aebc52..c3aea281da9 100644 --- a/Godeps/_workspace/src/github.com/jbenet/go-multihash/multihash/main.go +++ b/Godeps/_workspace/src/github.com/jbenet/go-multihash/multihash/main.go @@ -6,8 +6,8 @@ import ( "io" "os" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - mhopts "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash/opts" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" + mhopts "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash/opts" ) var usage = `usage: %s [options] [FILE] diff --git a/Godeps/_workspace/src/github.com/jbenet/go-multihash/opts/coding.go b/Godeps/_workspace/src/github.com/jbenet/go-multihash/opts/coding.go index c0f40c4506f..47fab4070f4 100644 --- a/Godeps/_workspace/src/github.com/jbenet/go-multihash/opts/coding.go +++ b/Godeps/_workspace/src/github.com/jbenet/go-multihash/opts/coding.go @@ -6,7 +6,7 @@ import ( "fmt" base58 "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" ) func Decode(encoding, digest string) (mh.Multihash, error) { diff --git a/Godeps/_workspace/src/github.com/jbenet/go-multihash/opts/opts.go b/Godeps/_workspace/src/github.com/jbenet/go-multihash/opts/opts.go index 1ab63eda860..ff880281807 100644 --- a/Godeps/_workspace/src/github.com/jbenet/go-multihash/opts/opts.go +++ b/Godeps/_workspace/src/github.com/jbenet/go-multihash/opts/opts.go @@ -11,7 +11,7 @@ import ( "io/ioutil" "strings" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" ) // package errors diff --git a/blocks/blocks.go b/blocks/blocks.go index ccd779c627f..bcf58f7479d 100644 --- a/blocks/blocks.go +++ b/blocks/blocks.go @@ -6,9 +6,9 @@ import ( "errors" "fmt" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" key "github.com/ipfs/go-ipfs/blocks/key" - u "github.com/ipfs/go-ipfs/util" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) // Block is a singular block of data in ipfs diff --git a/blocks/blockstore/blockstore.go b/blocks/blockstore/blockstore.go index 51979e6534d..42c83b64ba5 100644 --- a/blocks/blockstore/blockstore.go +++ b/blocks/blockstore/blockstore.go @@ -10,9 +10,9 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dsns "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/namespace" dsq "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/query" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/blocks/key/key.go b/blocks/key/key.go index 656458c1aef..edb5de5c26a 100644 --- a/blocks/key/key.go +++ b/blocks/key/key.go @@ -6,7 +6,7 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" b58 "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" ) // Key is a string representation of multihash for use with maps. diff --git a/blocks/key/key_test.go b/blocks/key/key_test.go index 6699c45d65e..bdb1a06750d 100644 --- a/blocks/key/key_test.go +++ b/blocks/key/key_test.go @@ -4,7 +4,7 @@ import ( "bytes" "testing" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" ) func TestKey(t *testing.T) { diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 8cd5e6dfb95..ab6a476aaeb 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -13,7 +13,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/cmd/ipfs/daemon.go b/cmd/ipfs/daemon.go index f3c3a9203b1..04da542492e 100644 --- a/cmd/ipfs/daemon.go +++ b/cmd/ipfs/daemon.go @@ -23,7 +23,7 @@ import ( "github.com/ipfs/go-ipfs/core/corerouting" nodeMount "github.com/ipfs/go-ipfs/fuse/node" fsrepo "github.com/ipfs/go-ipfs/repo/fsrepo" - util "github.com/ipfs/go-ipfs/util" + util "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" conn "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net/conn" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) diff --git a/cmd/ipfs/main.go b/cmd/ipfs/main.go index 5fe667c3bc4..9d74b6049ed 100644 --- a/cmd/ipfs/main.go +++ b/cmd/ipfs/main.go @@ -28,7 +28,7 @@ import ( repo "github.com/ipfs/go-ipfs/repo" config "github.com/ipfs/go-ipfs/repo/config" fsrepo "github.com/ipfs/go-ipfs/repo/fsrepo" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/commands/cli/parse.go b/commands/cli/parse.go index ce56d327dd4..ba658a89c39 100644 --- a/commands/cli/parse.go +++ b/commands/cli/parse.go @@ -12,7 +12,7 @@ import ( cmds "github.com/ipfs/go-ipfs/commands" files "github.com/ipfs/go-ipfs/commands/files" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) // Parse parses the input commandline string (cmd, flags, and args). diff --git a/commands/option.go b/commands/option.go index f7ec2243b40..72c48871326 100644 --- a/commands/option.go +++ b/commands/option.go @@ -3,7 +3,7 @@ package commands import ( "reflect" - "github.com/ipfs/go-ipfs/util" + "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) // Types of Command options diff --git a/commands/request.go b/commands/request.go index ccc7c0f8967..3bd8af694cd 100644 --- a/commands/request.go +++ b/commands/request.go @@ -12,7 +12,7 @@ import ( "github.com/ipfs/go-ipfs/commands/files" "github.com/ipfs/go-ipfs/core" "github.com/ipfs/go-ipfs/repo/config" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/core/bootstrap.go b/core/bootstrap.go index 46c8451faa4..873ca10bdc9 100644 --- a/core/bootstrap.go +++ b/core/bootstrap.go @@ -9,8 +9,8 @@ import ( "time" config "github.com/ipfs/go-ipfs/repo/config" + lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" math2 "github.com/ipfs/go-ipfs/thirdparty/math2" - lgbl "github.com/ipfs/go-ipfs/util/eventlog/loggables" host "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/host" inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" diff --git a/core/bootstrap_test.go b/core/bootstrap_test.go index 0a2fb8b8239..2e752f4ed0f 100644 --- a/core/bootstrap_test.go +++ b/core/bootstrap_test.go @@ -5,7 +5,7 @@ import ( "testing" config "github.com/ipfs/go-ipfs/repo/config" - testutil "github.com/ipfs/go-ipfs/util/testutil" + testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) diff --git a/core/commands/add.go b/core/commands/add.go index 5d73d9d04e4..814afc9dfc9 100644 --- a/core/commands/add.go +++ b/core/commands/add.go @@ -10,7 +10,7 @@ import ( cmds "github.com/ipfs/go-ipfs/commands" files "github.com/ipfs/go-ipfs/commands/files" core "github.com/ipfs/go-ipfs/core" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) // Error indicating the max depth has been exceded. diff --git a/core/commands/bitswap.go b/core/commands/bitswap.go index ece9a3f5278..3e49c0879eb 100644 --- a/core/commands/bitswap.go +++ b/core/commands/bitswap.go @@ -10,7 +10,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" cmds "github.com/ipfs/go-ipfs/commands" bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) diff --git a/core/commands/block.go b/core/commands/block.go index 3b029430e25..dc734d999e8 100644 --- a/core/commands/block.go +++ b/core/commands/block.go @@ -8,11 +8,11 @@ import ( "io/ioutil" "strings" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" cmds "github.com/ipfs/go-ipfs/commands" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) type BlockStat struct { diff --git a/core/commands/bootstrap.go b/core/commands/bootstrap.go index 9b23122f55f..eb3745d2697 100644 --- a/core/commands/bootstrap.go +++ b/core/commands/bootstrap.go @@ -10,7 +10,7 @@ import ( repo "github.com/ipfs/go-ipfs/repo" config "github.com/ipfs/go-ipfs/repo/config" "github.com/ipfs/go-ipfs/repo/fsrepo" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) type BootstrapOutput struct { diff --git a/core/commands/config.go b/core/commands/config.go index a776c3bdf77..798a0b2a1bc 100644 --- a/core/commands/config.go +++ b/core/commands/config.go @@ -14,7 +14,7 @@ import ( repo "github.com/ipfs/go-ipfs/repo" config "github.com/ipfs/go-ipfs/repo/config" fsrepo "github.com/ipfs/go-ipfs/repo/fsrepo" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) type ConfigField struct { diff --git a/core/commands/dht.go b/core/commands/dht.go index 782d599a8e5..094db240ee5 100644 --- a/core/commands/dht.go +++ b/core/commands/dht.go @@ -12,7 +12,7 @@ import ( notif "github.com/ipfs/go-ipfs/notifications" path "github.com/ipfs/go-ipfs/path" ipdht "github.com/ipfs/go-ipfs/routing/dht" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) diff --git a/core/commands/dns.go b/core/commands/dns.go index 2cbdccd40c7..c1e5ed3f165 100644 --- a/core/commands/dns.go +++ b/core/commands/dns.go @@ -6,7 +6,7 @@ import ( cmds "github.com/ipfs/go-ipfs/commands" namesys "github.com/ipfs/go-ipfs/namesys" - util "github.com/ipfs/go-ipfs/util" + util "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) var DNSCmd = &cmds.Command{ diff --git a/core/commands/id.go b/core/commands/id.go index ad0895b34fa..3e8557d0213 100644 --- a/core/commands/id.go +++ b/core/commands/id.go @@ -13,7 +13,7 @@ import ( cmds "github.com/ipfs/go-ipfs/commands" core "github.com/ipfs/go-ipfs/core" kb "github.com/ipfs/go-ipfs/routing/kbucket" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ic "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" identify "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/protocol/identify" diff --git a/core/commands/ipns.go b/core/commands/ipns.go index a542c59b62f..063a9835068 100644 --- a/core/commands/ipns.go +++ b/core/commands/ipns.go @@ -8,7 +8,7 @@ import ( cmds "github.com/ipfs/go-ipfs/commands" namesys "github.com/ipfs/go-ipfs/namesys" offline "github.com/ipfs/go-ipfs/routing/offline" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) var IpnsCmd = &cmds.Command{ diff --git a/core/commands/object/object.go b/core/commands/object/object.go index 37dbfee4c56..5705d1aec23 100644 --- a/core/commands/object/object.go +++ b/core/commands/object/object.go @@ -11,7 +11,7 @@ import ( "strings" "text/tabwriter" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" cmds "github.com/ipfs/go-ipfs/commands" core "github.com/ipfs/go-ipfs/core" diff --git a/core/commands/object/patch.go b/core/commands/object/patch.go index 2b5741bb28c..df9933fe5df 100644 --- a/core/commands/object/patch.go +++ b/core/commands/object/patch.go @@ -12,7 +12,7 @@ import ( dagutils "github.com/ipfs/go-ipfs/merkledag/utils" path "github.com/ipfs/go-ipfs/path" ft "github.com/ipfs/go-ipfs/unixfs" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) var ObjectPatchCmd = &cmds.Command{ diff --git a/core/commands/pin.go b/core/commands/pin.go index cc3333328fc..28780940f75 100644 --- a/core/commands/pin.go +++ b/core/commands/pin.go @@ -11,7 +11,7 @@ import ( corerepo "github.com/ipfs/go-ipfs/core/corerepo" dag "github.com/ipfs/go-ipfs/merkledag" path "github.com/ipfs/go-ipfs/path" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/core/commands/ping.go b/core/commands/ping.go index 430252a659d..1766bdb10f0 100644 --- a/core/commands/ping.go +++ b/core/commands/ping.go @@ -10,7 +10,7 @@ import ( cmds "github.com/ipfs/go-ipfs/commands" core "github.com/ipfs/go-ipfs/core" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" diff --git a/core/commands/refs.go b/core/commands/refs.go index 2deb5a85ae8..21ebdd82e9b 100644 --- a/core/commands/refs.go +++ b/core/commands/refs.go @@ -12,7 +12,7 @@ import ( "github.com/ipfs/go-ipfs/core" dag "github.com/ipfs/go-ipfs/merkledag" path "github.com/ipfs/go-ipfs/path" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/core/commands/repo.go b/core/commands/repo.go index 7014368a6d2..3b634e6311c 100644 --- a/core/commands/repo.go +++ b/core/commands/repo.go @@ -7,7 +7,7 @@ import ( cmds "github.com/ipfs/go-ipfs/commands" corerepo "github.com/ipfs/go-ipfs/core/corerepo" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) var RepoCmd = &cmds.Command{ diff --git a/core/commands/resolve.go b/core/commands/resolve.go index 430b9008b54..85d1a6216a1 100644 --- a/core/commands/resolve.go +++ b/core/commands/resolve.go @@ -7,7 +7,7 @@ import ( cmds "github.com/ipfs/go-ipfs/commands" "github.com/ipfs/go-ipfs/core" path "github.com/ipfs/go-ipfs/path" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) type ResolvedPath struct { diff --git a/core/commands/stat.go b/core/commands/stat.go index e9d13f0bb12..ce3b2743133 100644 --- a/core/commands/stat.go +++ b/core/commands/stat.go @@ -10,7 +10,7 @@ import ( humanize "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/dustin/go-humanize" cmds "github.com/ipfs/go-ipfs/commands" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" metrics "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/metrics" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" protocol "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/protocol" diff --git a/core/commands/swarm.go b/core/commands/swarm.go index b99a7edd7b6..1a0e646ed84 100644 --- a/core/commands/swarm.go +++ b/core/commands/swarm.go @@ -9,7 +9,7 @@ import ( "sort" cmds "github.com/ipfs/go-ipfs/commands" - iaddr "github.com/ipfs/go-ipfs/util/ipfsaddr" + iaddr "github.com/ipfs/go-ipfs/thirdparty/ipfsaddr" swarm "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net/swarm" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" diff --git a/core/core.go b/core/core.go index 1563511f768..fffcde34e8c 100644 --- a/core/core.go +++ b/core/core.go @@ -58,7 +58,7 @@ import ( repo "github.com/ipfs/go-ipfs/repo" config "github.com/ipfs/go-ipfs/repo/config" uio "github.com/ipfs/go-ipfs/unixfs/io" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) const IpnsValidatorTag = "ipns" diff --git a/core/core_test.go b/core/core_test.go index 027a721d03c..862956b4bc6 100644 --- a/core/core_test.go +++ b/core/core_test.go @@ -5,7 +5,7 @@ import ( "github.com/ipfs/go-ipfs/repo" config "github.com/ipfs/go-ipfs/repo/config" - "github.com/ipfs/go-ipfs/util/testutil" + "github.com/ipfs/go-ipfs/thirdparty/testutil" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/core/corehttp/gateway_test.go b/core/corehttp/gateway_test.go index 7624714fae1..551fbf6f527 100644 --- a/core/corehttp/gateway_test.go +++ b/core/corehttp/gateway_test.go @@ -15,7 +15,7 @@ import ( path "github.com/ipfs/go-ipfs/path" repo "github.com/ipfs/go-ipfs/repo" config "github.com/ipfs/go-ipfs/repo/config" - testutil "github.com/ipfs/go-ipfs/util/testutil" + testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" id "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/protocol/identify" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/core/coreunix/add_test.go b/core/coreunix/add_test.go index f2b2b212d37..c773f46216e 100644 --- a/core/coreunix/add_test.go +++ b/core/coreunix/add_test.go @@ -14,7 +14,7 @@ import ( "github.com/ipfs/go-ipfs/pin/gc" "github.com/ipfs/go-ipfs/repo" "github.com/ipfs/go-ipfs/repo/config" - "github.com/ipfs/go-ipfs/util/testutil" + "github.com/ipfs/go-ipfs/thirdparty/testutil" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/core/coreunix/metadata_test.go b/core/coreunix/metadata_test.go index b180927b26b..5d75a542b1c 100644 --- a/core/coreunix/metadata_test.go +++ b/core/coreunix/metadata_test.go @@ -19,7 +19,7 @@ import ( merkledag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) func getDagserv(t *testing.T) merkledag.DAGService { diff --git a/core/mock/mock.go b/core/mock/mock.go index c9b3cea1054..5d1da966dcb 100644 --- a/core/mock/mock.go +++ b/core/mock/mock.go @@ -11,8 +11,8 @@ import ( core "github.com/ipfs/go-ipfs/core" "github.com/ipfs/go-ipfs/repo" config "github.com/ipfs/go-ipfs/repo/config" - ds2 "github.com/ipfs/go-ipfs/util/datastore2" - testutil "github.com/ipfs/go-ipfs/util/testutil" + ds2 "github.com/ipfs/go-ipfs/thirdparty/datastore2" + testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" host "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/host" metrics "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/metrics" mocknet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net/mock" diff --git a/exchange/bitswap/bitswap_test.go b/exchange/bitswap/bitswap_test.go index 435779fd82d..22ff046068b 100644 --- a/exchange/bitswap/bitswap_test.go +++ b/exchange/bitswap/bitswap_test.go @@ -7,7 +7,7 @@ import ( "time" detectrace "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-detect-race" - travis "github.com/ipfs/go-ipfs/util/testutil/ci/travis" + travis "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" blocks "github.com/ipfs/go-ipfs/blocks" diff --git a/exchange/bitswap/decision/bench_test.go b/exchange/bitswap/decision/bench_test.go index 7a230fa5786..a761c5b9687 100644 --- a/exchange/bitswap/decision/bench_test.go +++ b/exchange/bitswap/decision/bench_test.go @@ -6,7 +6,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/exchange/bitswap/wantlist" - "github.com/ipfs/go-ipfs/util/testutil" + "github.com/ipfs/go-ipfs/thirdparty/testutil" "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) diff --git a/exchange/bitswap/decision/engine_test.go b/exchange/bitswap/decision/engine_test.go index 53a660c7d23..b47d4063a49 100644 --- a/exchange/bitswap/decision/engine_test.go +++ b/exchange/bitswap/decision/engine_test.go @@ -13,7 +13,7 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" message "github.com/ipfs/go-ipfs/exchange/bitswap/message" - testutil "github.com/ipfs/go-ipfs/util/testutil" + testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/exchange/bitswap/decision/peer_request_queue_test.go b/exchange/bitswap/decision/peer_request_queue_test.go index e71782f0710..a2d96a9c6ae 100644 --- a/exchange/bitswap/decision/peer_request_queue_test.go +++ b/exchange/bitswap/decision/peer_request_queue_test.go @@ -9,7 +9,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/exchange/bitswap/wantlist" - "github.com/ipfs/go-ipfs/util/testutil" + "github.com/ipfs/go-ipfs/thirdparty/testutil" ) func TestPushPop(t *testing.T) { diff --git a/exchange/bitswap/testnet/interface.go b/exchange/bitswap/testnet/interface.go index f79af6d629f..11be6249b9f 100644 --- a/exchange/bitswap/testnet/interface.go +++ b/exchange/bitswap/testnet/interface.go @@ -2,7 +2,7 @@ package bitswap import ( bsnet "github.com/ipfs/go-ipfs/exchange/bitswap/network" - "github.com/ipfs/go-ipfs/util/testutil" + "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) diff --git a/exchange/bitswap/testnet/network_test.go b/exchange/bitswap/testnet/network_test.go index 69f1fa73efa..59c912b2598 100644 --- a/exchange/bitswap/testnet/network_test.go +++ b/exchange/bitswap/testnet/network_test.go @@ -9,7 +9,7 @@ import ( bsnet "github.com/ipfs/go-ipfs/exchange/bitswap/network" mockrouting "github.com/ipfs/go-ipfs/routing/mock" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - testutil "github.com/ipfs/go-ipfs/util/testutil" + testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/exchange/bitswap/testnet/peernet.go b/exchange/bitswap/testnet/peernet.go index 8b0d7aabe0d..4224ad73de0 100644 --- a/exchange/bitswap/testnet/peernet.go +++ b/exchange/bitswap/testnet/peernet.go @@ -4,7 +4,7 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" bsnet "github.com/ipfs/go-ipfs/exchange/bitswap/network" mockrouting "github.com/ipfs/go-ipfs/routing/mock" - testutil "github.com/ipfs/go-ipfs/util/testutil" + testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" mockpeernet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net/mock" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/exchange/bitswap/testnet/virtual.go b/exchange/bitswap/testnet/virtual.go index b7b2e74724e..1c69337e9b2 100644 --- a/exchange/bitswap/testnet/virtual.go +++ b/exchange/bitswap/testnet/virtual.go @@ -9,7 +9,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" mockrouting "github.com/ipfs/go-ipfs/routing/mock" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - testutil "github.com/ipfs/go-ipfs/util/testutil" + testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/exchange/bitswap/testutils.go b/exchange/bitswap/testutils.go index 8a886177193..19037dafeac 100644 --- a/exchange/bitswap/testutils.go +++ b/exchange/bitswap/testutils.go @@ -7,9 +7,9 @@ import ( ds_sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" tn "github.com/ipfs/go-ipfs/exchange/bitswap/testnet" + datastore2 "github.com/ipfs/go-ipfs/thirdparty/datastore2" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - datastore2 "github.com/ipfs/go-ipfs/util/datastore2" - testutil "github.com/ipfs/go-ipfs/util/testutil" + testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" p2ptestutil "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/test/util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/exchange/reprovide/reprovide_test.go b/exchange/reprovide/reprovide_test.go index ea49ed93217..c593ae00a36 100644 --- a/exchange/reprovide/reprovide_test.go +++ b/exchange/reprovide/reprovide_test.go @@ -8,7 +8,7 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" mock "github.com/ipfs/go-ipfs/routing/mock" - testutil "github.com/ipfs/go-ipfs/util/testutil" + testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" . "github.com/ipfs/go-ipfs/exchange/reprovide" diff --git a/fuse/ipns/ipns_test.go b/fuse/ipns/ipns_test.go index 15b02eea997..c4456298d77 100644 --- a/fuse/ipns/ipns_test.go +++ b/fuse/ipns/ipns_test.go @@ -17,8 +17,8 @@ import ( core "github.com/ipfs/go-ipfs/core" namesys "github.com/ipfs/go-ipfs/namesys" offroute "github.com/ipfs/go-ipfs/routing/offline" - u "github.com/ipfs/go-ipfs/util" - ci "github.com/ipfs/go-ipfs/util/testutil/ci" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + ci "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util/testutil/ci" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/fuse/node/mount_test.go b/fuse/node/mount_test.go index 6b50ea2947e..ec446b3e8d5 100644 --- a/fuse/node/mount_test.go +++ b/fuse/node/mount_test.go @@ -15,7 +15,7 @@ import ( mount "github.com/ipfs/go-ipfs/fuse/mount" namesys "github.com/ipfs/go-ipfs/namesys" offroute "github.com/ipfs/go-ipfs/routing/offline" - ci "github.com/ipfs/go-ipfs/util/testutil/ci" + ci "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util/testutil/ci" ) func maybeSkipFuseTests(t *testing.T) { diff --git a/fuse/readonly/ipfs_test.go b/fuse/readonly/ipfs_test.go index 7bfba7497f2..ad8a5bb5864 100644 --- a/fuse/readonly/ipfs_test.go +++ b/fuse/readonly/ipfs_test.go @@ -23,8 +23,8 @@ import ( chunk "github.com/ipfs/go-ipfs/importer/chunk" dag "github.com/ipfs/go-ipfs/merkledag" uio "github.com/ipfs/go-ipfs/unixfs/io" - u "github.com/ipfs/go-ipfs/util" - ci "github.com/ipfs/go-ipfs/util/testutil/ci" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + ci "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util/testutil/ci" ) func maybeSkipFuseTests(t *testing.T) { diff --git a/fuse/readonly/readonly_unix.go b/fuse/readonly/readonly_unix.go index 062a892bbd8..f2585f578b5 100644 --- a/fuse/readonly/readonly_unix.go +++ b/fuse/readonly/readonly_unix.go @@ -11,13 +11,13 @@ import ( fuse "github.com/ipfs/go-ipfs/Godeps/_workspace/src/bazil.org/fuse" fs "github.com/ipfs/go-ipfs/Godeps/_workspace/src/bazil.org/fuse/fs" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" core "github.com/ipfs/go-ipfs/core" mdag "github.com/ipfs/go-ipfs/merkledag" path "github.com/ipfs/go-ipfs/path" + lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" uio "github.com/ipfs/go-ipfs/unixfs/io" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" - lgbl "github.com/ipfs/go-ipfs/util/eventlog/loggables" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/importer/balanced/balanced_test.go b/importer/balanced/balanced_test.go index 2182615c5fd..60a479fdfb8 100644 --- a/importer/balanced/balanced_test.go +++ b/importer/balanced/balanced_test.go @@ -15,7 +15,7 @@ import ( mdtest "github.com/ipfs/go-ipfs/merkledag/test" pin "github.com/ipfs/go-ipfs/pin" uio "github.com/ipfs/go-ipfs/unixfs/io" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/importer/chunk/rabin_test.go b/importer/chunk/rabin_test.go index b4e1b2dc4ea..7702d3e76e1 100644 --- a/importer/chunk/rabin_test.go +++ b/importer/chunk/rabin_test.go @@ -5,7 +5,7 @@ import ( "fmt" "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/key" - "github.com/ipfs/go-ipfs/util" + "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "io" "testing" ) diff --git a/importer/chunk/splitting_test.go b/importer/chunk/splitting_test.go index 27b2a7b7a65..83dcaadba35 100644 --- a/importer/chunk/splitting_test.go +++ b/importer/chunk/splitting_test.go @@ -5,7 +5,7 @@ import ( "io" "testing" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) func randBuf(t *testing.T, size int) []byte { diff --git a/importer/importer_test.go b/importer/importer_test.go index 306e6221966..02e24c6fa4a 100644 --- a/importer/importer_test.go +++ b/importer/importer_test.go @@ -10,7 +10,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" mdtest "github.com/ipfs/go-ipfs/merkledag/test" uio "github.com/ipfs/go-ipfs/unixfs/io" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/importer/trickle/trickle_test.go b/importer/trickle/trickle_test.go index 9581907ffd6..1dd4350882c 100644 --- a/importer/trickle/trickle_test.go +++ b/importer/trickle/trickle_test.go @@ -16,7 +16,7 @@ import ( pin "github.com/ipfs/go-ipfs/pin" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/merkledag/coding.go b/merkledag/coding.go index b678c3b44e7..1c57125fb8d 100644 --- a/merkledag/coding.go +++ b/merkledag/coding.go @@ -4,10 +4,10 @@ import ( "fmt" "sort" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" pb "github.com/ipfs/go-ipfs/merkledag/pb" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) // for now, we use a PBNode intermediate thing. diff --git a/merkledag/merkledag_test.go b/merkledag/merkledag_test.go index d9622082e03..91bc2c0f770 100644 --- a/merkledag/merkledag_test.go +++ b/merkledag/merkledag_test.go @@ -22,7 +22,7 @@ import ( . "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin" uio "github.com/ipfs/go-ipfs/unixfs/io" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/merkledag/node.go b/merkledag/node.go index c5e1c4e33cd..b5e95f81baa 100644 --- a/merkledag/node.go +++ b/merkledag/node.go @@ -5,7 +5,7 @@ import ( "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" key "github.com/ipfs/go-ipfs/blocks/key" ) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 060f8083c6d..a56b689394d 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -28,7 +28,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) func getDagserv(t *testing.T) dag.DAGService { diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 4ba7bae4fb0..32e0b2b27be 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -5,7 +5,7 @@ import ( "time" key "github.com/ipfs/go-ipfs/blocks/key" - ci "github.com/ipfs/go-ipfs/util/testutil/ci" + ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index fb171e901d1..b6ffe1c4070 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -10,7 +10,7 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 241b40d3adb..4f3cfaf2efe 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -19,7 +19,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" ft "github.com/ipfs/go-ipfs/unixfs" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 555b3055a61..69f03f035c2 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -10,9 +10,9 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" - u "github.com/ipfs/go-ipfs/util" - testutil "github.com/ipfs/go-ipfs/util/testutil" + testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/routing.go b/namesys/routing.go index 7d499fe61af..b10c224907f 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,14 +6,14 @@ import ( proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" lru "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/hashicorp/golang-lru" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/path/path.go b/path/path.go index 0891e846685..c0697341710 100644 --- a/path/path.go +++ b/path/path.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" b58 "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" ) // ErrBadPath is returned when a given path is incorrectly formatted diff --git a/path/resolver.go b/path/resolver.go index 569a4d1be72..10368bbfdc2 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -6,7 +6,7 @@ import ( "fmt" "time" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/path/resolver_test.go b/path/resolver_test.go index 9ebb3f7a95c..7f5f756c49f 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -10,7 +10,7 @@ import ( merkledag "github.com/ipfs/go-ipfs/merkledag" dagmock "github.com/ipfs/go-ipfs/merkledag/test" path "github.com/ipfs/go-ipfs/path" - util "github.com/ipfs/go-ipfs/util" + util "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) func randNode() (*merkledag.Node, key.Key) { diff --git a/pin/pin_test.go b/pin/pin_test.go index 5dd9c45cfd3..9eb61acefe0 100644 --- a/pin/pin_test.go +++ b/pin/pin_test.go @@ -13,7 +13,7 @@ import ( bs "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" mdag "github.com/ipfs/go-ipfs/merkledag" - "github.com/ipfs/go-ipfs/util" + "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) func randNode() (*mdag.Node, key.Key) { diff --git a/repo/config/bootstrap_peers.go b/repo/config/bootstrap_peers.go index fa607c84252..c880913a170 100644 --- a/repo/config/bootstrap_peers.go +++ b/repo/config/bootstrap_peers.go @@ -4,7 +4,7 @@ import ( "errors" "fmt" - iaddr "github.com/ipfs/go-ipfs/util/ipfsaddr" + iaddr "github.com/ipfs/go-ipfs/thirdparty/ipfsaddr" ) // DefaultBootstrapAddresses are the hardcoded bootstrap addresses diff --git a/repo/config/config.go b/repo/config/config.go index 76280256164..bfe9be1de64 100644 --- a/repo/config/config.go +++ b/repo/config/config.go @@ -9,7 +9,7 @@ import ( "path/filepath" "strings" - u "github.com/ipfs/go-ipfs/util" + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/mitchellh/go-homedir" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) @@ -48,7 +48,7 @@ func PathRoot() (string, error) { dir := os.Getenv(EnvDir) var err error if len(dir) == 0 { - dir, err = u.TildeExpansion(DefaultPathRoot) + dir, err = homedir.Expand(DefaultPathRoot) } return dir, err } diff --git a/repo/config/supernode.go b/repo/config/supernode.go index 30ee6f22e55..de403fadd7d 100644 --- a/repo/config/supernode.go +++ b/repo/config/supernode.go @@ -1,6 +1,6 @@ package config -import "github.com/ipfs/go-ipfs/util/ipfsaddr" +import "github.com/ipfs/go-ipfs/thirdparty/ipfsaddr" // TODO replace with final servers before merge diff --git a/repo/fsrepo/fsrepo.go b/repo/fsrepo/fsrepo.go index 356e33cd191..0e21cfa6acf 100644 --- a/repo/fsrepo/fsrepo.go +++ b/repo/fsrepo/fsrepo.go @@ -12,6 +12,7 @@ import ( "sync" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/measure" + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/mitchellh/go-homedir" repo "github.com/ipfs/go-ipfs/repo" "github.com/ipfs/go-ipfs/repo/common" config "github.com/ipfs/go-ipfs/repo/config" @@ -19,7 +20,7 @@ import ( mfsr "github.com/ipfs/go-ipfs/repo/fsrepo/migrations" serialize "github.com/ipfs/go-ipfs/repo/fsrepo/serialize" dir "github.com/ipfs/go-ipfs/thirdparty/dir" - util "github.com/ipfs/go-ipfs/util" + util "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) @@ -156,7 +157,7 @@ func open(repoPath string) (repo.Repo, error) { } func newFSRepo(rpath string) (*FSRepo, error) { - expPath, err := util.TildeExpansion(filepath.Clean(rpath)) + expPath, err := homedir.Expand(filepath.Clean(rpath)) if err != nil { return nil, err } diff --git a/repo/fsrepo/lock/lock.go b/repo/fsrepo/lock/lock.go index c8f953f7eb3..34f2d23391d 100644 --- a/repo/fsrepo/lock/lock.go +++ b/repo/fsrepo/lock/lock.go @@ -9,7 +9,7 @@ import ( "syscall" lock "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/camlistore/lock" - "github.com/ipfs/go-ipfs/util" + "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) // LockFile is the filename of the repo lock, relative to config dir diff --git a/repo/fsrepo/serialize/serialize.go b/repo/fsrepo/serialize/serialize.go index 64e897b78c9..0c93727fd55 100644 --- a/repo/fsrepo/serialize/serialize.go +++ b/repo/fsrepo/serialize/serialize.go @@ -10,7 +10,7 @@ import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/facebookgo/atomicfile" "github.com/ipfs/go-ipfs/repo/config" - "github.com/ipfs/go-ipfs/util" + "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index b059c11d670..b544884fc0f 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -9,7 +9,7 @@ import ( "time" routing "github.com/ipfs/go-ipfs/routing" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 55ed11c55ca..3834c75e7c0 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -17,12 +17,12 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" - u "github.com/ipfs/go-ipfs/util" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" netutil "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/test/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - ci "github.com/ipfs/go-ipfs/util/testutil/ci" - travisci "github.com/ipfs/go-ipfs/util/testutil/ci/travis" + ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" + travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" ) var testCaseValues = map[key.Key][]byte{} diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index dad0ac645d8..41048df2a72 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -16,7 +16,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" mocknet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net/mock" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 84320ab5de5..ea8996416b1 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -5,13 +5,13 @@ import ( "fmt" "time" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - u "github.com/ipfs/go-ipfs/util" - lgbl "github.com/ipfs/go-ipfs/util/eventlog/loggables" + lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index 140fcae213e..2def4046bc1 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -4,7 +4,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" notif "github.com/ipfs/go-ipfs/notifications" kb "github.com/ipfs/go-ipfs/routing/kbucket" - pset "github.com/ipfs/go-ipfs/util/peerset" + pset "github.com/ipfs/go-ipfs/thirdparty/peerset" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/query.go b/routing/dht/query.go index e7dc7a8e1be..518f1e11fae 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -6,11 +6,11 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" notif "github.com/ipfs/go-ipfs/notifications" "github.com/ipfs/go-ipfs/routing" - u "github.com/ipfs/go-ipfs/util" - pset "github.com/ipfs/go-ipfs/util/peerset" - todoctr "github.com/ipfs/go-ipfs/util/todocounter" + pset "github.com/ipfs/go-ipfs/thirdparty/peerset" + todoctr "github.com/ipfs/go-ipfs/thirdparty/todocounter" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" queue "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer/queue" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" process "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/routing/dht/routing.go b/routing/dht/routing.go index e0feda4ec89..5a74301220c 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -11,7 +11,7 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - pset "github.com/ipfs/go-ipfs/util/peerset" + pset "github.com/ipfs/go-ipfs/thirdparty/peerset" inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 13f02df897f..a023dba4e6f 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - tu "github.com/ipfs/go-ipfs/util/testutil" + tu "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index 73602d185d5..df32378224e 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) diff --git a/routing/keyspace/xor.go b/routing/keyspace/xor.go index 8fae7744f2b..fd96fd65b3d 100644 --- a/routing/keyspace/xor.go +++ b/routing/keyspace/xor.go @@ -5,7 +5,7 @@ import ( "crypto/sha256" "math/big" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) // XORKeySpace is a KeySpace which: diff --git a/routing/keyspace/xor_test.go b/routing/keyspace/xor_test.go index cac274278a3..a461c094e72 100644 --- a/routing/keyspace/xor_test.go +++ b/routing/keyspace/xor_test.go @@ -5,7 +5,7 @@ import ( "math/big" "testing" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) func TestPrefixLen(t *testing.T) { diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 15e7eebebab..4f29a57761f 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -4,15 +4,15 @@ import ( "errors" "time" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - u "github.com/ipfs/go-ipfs/util" - "github.com/ipfs/go-ipfs/util/testutil" + "github.com/ipfs/go-ipfs/thirdparty/testutil" ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index c05ca9460bd..cc57e6a076b 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -8,7 +8,7 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" - "github.com/ipfs/go-ipfs/util/testutil" + "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index d71b24c0bdd..0bafda9b262 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -6,7 +6,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "github.com/ipfs/go-ipfs/util/testutil" + "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 99ef8ba8825..96be2a4895e 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -4,7 +4,7 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" dht "github.com/ipfs/go-ipfs/routing/dht" - "github.com/ipfs/go-ipfs/util/testutil" + "github.com/ipfs/go-ipfs/thirdparty/testutil" mocknet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 75daee9e96a..69035c2324e 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -9,7 +9,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "github.com/ipfs/go-ipfs/util/testutil" + "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/record/validation.go b/routing/record/validation.go index 32c33e966d0..a898259c62d 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" ) diff --git a/test/integration/addcat_test.go b/test/integration/addcat_test.go index b59fb463795..21a4cc2081b 100644 --- a/test/integration/addcat_test.go +++ b/test/integration/addcat_test.go @@ -16,8 +16,8 @@ import ( "github.com/ipfs/go-ipfs/core" coreunix "github.com/ipfs/go-ipfs/core/coreunix" mock "github.com/ipfs/go-ipfs/core/mock" + testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" "github.com/ipfs/go-ipfs/thirdparty/unit" - testutil "github.com/ipfs/go-ipfs/util/testutil" mocknet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net/mock" "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" diff --git a/test/integration/bench_cat_test.go b/test/integration/bench_cat_test.go index a54b8d957ae..598ee3b25ca 100644 --- a/test/integration/bench_cat_test.go +++ b/test/integration/bench_cat_test.go @@ -10,8 +10,8 @@ import ( "github.com/ipfs/go-ipfs/core" coreunix "github.com/ipfs/go-ipfs/core/coreunix" mock "github.com/ipfs/go-ipfs/core/mock" + testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" "github.com/ipfs/go-ipfs/thirdparty/unit" - testutil "github.com/ipfs/go-ipfs/util/testutil" mocknet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net/mock" "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/test/integration/bench_test.go b/test/integration/bench_test.go index eaadf270277..702e5ea2c7e 100644 --- a/test/integration/bench_test.go +++ b/test/integration/bench_test.go @@ -3,8 +3,8 @@ package integrationtest import ( "testing" + testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" "github.com/ipfs/go-ipfs/thirdparty/unit" - testutil "github.com/ipfs/go-ipfs/util/testutil" ) func benchmarkAddCat(numBytes int64, conf testutil.LatencyConfig, b *testing.B) { diff --git a/test/integration/grandcentral_test.go b/test/integration/grandcentral_test.go index 873e95ffda1..6273aa3456c 100644 --- a/test/integration/grandcentral_test.go +++ b/test/integration/grandcentral_test.go @@ -17,9 +17,9 @@ import ( "github.com/ipfs/go-ipfs/core/corerouting" "github.com/ipfs/go-ipfs/core/coreunix" mock "github.com/ipfs/go-ipfs/core/mock" + ds2 "github.com/ipfs/go-ipfs/thirdparty/datastore2" + testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" "github.com/ipfs/go-ipfs/thirdparty/unit" - ds2 "github.com/ipfs/go-ipfs/util/datastore2" - testutil "github.com/ipfs/go-ipfs/util/testutil" mocknet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net/mock" "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) diff --git a/test/integration/three_legged_cat_test.go b/test/integration/three_legged_cat_test.go index 5d48affdd29..6c0844a557d 100644 --- a/test/integration/three_legged_cat_test.go +++ b/test/integration/three_legged_cat_test.go @@ -13,8 +13,8 @@ import ( core "github.com/ipfs/go-ipfs/core" coreunix "github.com/ipfs/go-ipfs/core/coreunix" mock "github.com/ipfs/go-ipfs/core/mock" + testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" "github.com/ipfs/go-ipfs/thirdparty/unit" - testutil "github.com/ipfs/go-ipfs/util/testutil" mocknet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net/mock" "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) diff --git a/test/supernode_client/main.go b/test/supernode_client/main.go index 4643dcc5cec..cb27d12ecdb 100644 --- a/test/supernode_client/main.go +++ b/test/supernode_client/main.go @@ -13,7 +13,7 @@ import ( "time" random "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-random" - "github.com/ipfs/go-ipfs/util/ipfsaddr" + "github.com/ipfs/go-ipfs/thirdparty/ipfsaddr" ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" @@ -27,8 +27,8 @@ import ( "github.com/ipfs/go-ipfs/repo" config "github.com/ipfs/go-ipfs/repo/config" fsrepo "github.com/ipfs/go-ipfs/repo/fsrepo" + ds2 "github.com/ipfs/go-ipfs/thirdparty/datastore2" unit "github.com/ipfs/go-ipfs/thirdparty/unit" - ds2 "github.com/ipfs/go-ipfs/util/datastore2" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/util/datastore2/datastore_closer.go b/thirdparty/datastore2/datastore_closer.go similarity index 100% rename from util/datastore2/datastore_closer.go rename to thirdparty/datastore2/datastore_closer.go diff --git a/util/datastore2/delayed.go b/thirdparty/datastore2/delayed.go similarity index 100% rename from util/datastore2/delayed.go rename to thirdparty/datastore2/delayed.go diff --git a/util/datastore2/threadsafe.go b/thirdparty/datastore2/threadsafe.go similarity index 100% rename from util/datastore2/threadsafe.go rename to thirdparty/datastore2/threadsafe.go diff --git a/util/ipfsaddr/ipfsaddr.go b/thirdparty/ipfsaddr/ipfsaddr.go similarity index 100% rename from util/ipfsaddr/ipfsaddr.go rename to thirdparty/ipfsaddr/ipfsaddr.go diff --git a/util/ipfsaddr/ipfsaddr_test.go b/thirdparty/ipfsaddr/ipfsaddr_test.go similarity index 100% rename from util/ipfsaddr/ipfsaddr_test.go rename to thirdparty/ipfsaddr/ipfsaddr_test.go diff --git a/util/eventlog/loggables/loggables.go b/thirdparty/loggables/loggables.go similarity index 100% rename from util/eventlog/loggables/loggables.go rename to thirdparty/loggables/loggables.go diff --git a/util/peerset/peerset.go b/thirdparty/peerset/peerset.go similarity index 100% rename from util/peerset/peerset.go rename to thirdparty/peerset/peerset.go diff --git a/util/testutil/ci/ci.go b/thirdparty/testutil/ci/ci.go similarity index 94% rename from util/testutil/ci/ci.go rename to thirdparty/testutil/ci/ci.go index 45b0b7767a8..490b890001a 100644 --- a/util/testutil/ci/ci.go +++ b/thirdparty/testutil/ci/ci.go @@ -6,7 +6,7 @@ package ci import ( "os" - travis "github.com/ipfs/go-ipfs/util/testutil/ci/travis" + travis "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" ) // EnvVar is a type to use travis-only env var names with diff --git a/util/testutil/ci/travis/travis.go b/thirdparty/testutil/ci/travis/travis.go similarity index 100% rename from util/testutil/ci/travis/travis.go rename to thirdparty/testutil/ci/travis/travis.go diff --git a/util/testutil/ci/travis/travis_test.go b/thirdparty/testutil/ci/travis/travis_test.go similarity index 100% rename from util/testutil/ci/travis/travis_test.go rename to thirdparty/testutil/ci/travis/travis_test.go diff --git a/util/testutil/datastore.go b/thirdparty/testutil/datastore.go similarity index 86% rename from util/testutil/datastore.go rename to thirdparty/testutil/datastore.go index 41a9cc1fc44..b60c755c86f 100644 --- a/util/testutil/datastore.go +++ b/thirdparty/testutil/datastore.go @@ -3,7 +3,7 @@ package testutil import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" syncds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" - ds2 "github.com/ipfs/go-ipfs/util/datastore2" + ds2 "github.com/ipfs/go-ipfs/thirdparty/datastore2" ) func ThreadSafeCloserMapDatastore() ds2.ThreadSafeDatastoreCloser { diff --git a/util/testutil/gen.go b/thirdparty/testutil/gen.go similarity index 98% rename from util/testutil/gen.go rename to thirdparty/testutil/gen.go index 4ac55a0f47f..2a2b3b9b129 100644 --- a/util/testutil/gen.go +++ b/thirdparty/testutil/gen.go @@ -8,7 +8,7 @@ import ( "sync" "testing" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" diff --git a/util/testutil/identity.go b/thirdparty/testutil/identity.go similarity index 100% rename from util/testutil/identity.go rename to thirdparty/testutil/identity.go diff --git a/util/testutil/latency_config.go b/thirdparty/testutil/latency_config.go similarity index 100% rename from util/testutil/latency_config.go rename to thirdparty/testutil/latency_config.go diff --git a/util/testutil/rand.go b/thirdparty/testutil/rand.go similarity index 100% rename from util/testutil/rand.go rename to thirdparty/testutil/rand.go diff --git a/util/todocounter/counter.go b/thirdparty/todocounter/counter.go similarity index 100% rename from util/todocounter/counter.go rename to thirdparty/todocounter/counter.go diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 38d4459d955..ec707259718 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -7,7 +7,7 @@ import ( "os" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 0cd4a2f10ae..a5ed5dc1b59 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -18,7 +18,7 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/util/context.go b/util/context.go deleted file mode 100644 index 77504b16dbf..00000000000 --- a/util/context.go +++ /dev/null @@ -1,35 +0,0 @@ -package util - -import ( - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" -) - -// privateChanType protects the channel. Since this is a package-private type, -// only methods defined in this package can get the error value from the -// context. -type privateChanType chan error - -const errLogKey = "the key used to extract the error log from the context" - -// ContextWithErrorLog returns a copy of parent and an error channel that can -// be used to receive errors sent with the LogError method. -func ContextWithErrorLog(parent context.Context) (context.Context, <-chan error) { - errs := make(privateChanType) - ctx := context.WithValue(parent, errLogKey, errs) - return ctx, errs -} - -// LogError logs the error to the owner of the context. -// -// If this context was created with ContextWithErrorLog, then this method -// passes the error to context creator over an unbuffered channel. -// -// If this context was created by other means, this method is a no-op. -func LogError(ctx context.Context, err error) { - v := ctx.Value(errLogKey) - errs, ok := v.(privateChanType) - if !ok { - return - } - errs <- err -} diff --git a/util/context_test.go b/util/context_test.go deleted file mode 100644 index d9428d6b56b..00000000000 --- a/util/context_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package util - -import ( - "errors" - "testing" - - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" -) - -func TestLogErrorDoesNotBlockWhenCtxIsNotSetUpForLogging(t *testing.T) { - ctx := context.Background() - LogError(ctx, errors.New("ignore me")) -} - -func TestLogErrorReceivedByParent(t *testing.T) { - - expected := errors.New("From child to parent") - - ctx, errs := ContextWithErrorLog(context.Background()) - - go func() { - LogError(ctx, expected) - }() - - if err := <-errs; err != expected { - t.Fatal("didn't receive the expected error") - } -} diff --git a/util/do.go b/util/do.go deleted file mode 100644 index 84384d7096e..00000000000 --- a/util/do.go +++ /dev/null @@ -1,22 +0,0 @@ -package util - -import "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - -func ContextDo(ctx context.Context, f func() error) error { - - ch := make(chan error) - - go func() { - select { - case <-ctx.Done(): - case ch <- f(): - } - }() - select { - case <-ctx.Done(): - return ctx.Err() - case val := <-ch: - return val - } - return nil -} diff --git a/util/do_test.go b/util/do_test.go deleted file mode 100644 index 7b77a48bb22..00000000000 --- a/util/do_test.go +++ /dev/null @@ -1,42 +0,0 @@ -package util - -import ( - "errors" - "testing" - - "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" -) - -func TestDoReturnsContextErr(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - ch := make(chan struct{}) - err := ContextDo(ctx, func() error { - cancel() - ch <- struct{}{} // won't return - return nil - }) - if err != ctx.Err() { - t.Fail() - } -} - -func TestDoReturnsFuncError(t *testing.T) { - ctx := context.Background() - expected := errors.New("expected to be returned by ContextDo") - err := ContextDo(ctx, func() error { - return expected - }) - if err != expected { - t.Fail() - } -} - -func TestDoReturnsNil(t *testing.T) { - ctx := context.Background() - err := ContextDo(ctx, func() error { - return nil - }) - if err != nil { - t.Fail() - } -} diff --git a/util/file.go b/util/file.go deleted file mode 100644 index e3bd49d717c..00000000000 --- a/util/file.go +++ /dev/null @@ -1,11 +0,0 @@ -package util - -import "os" - -func FileExists(filename string) bool { - fi, err := os.Lstat(filename) - if fi != nil || (err != nil && !os.IsNotExist(err)) { - return true - } - return false -} diff --git a/util/file_test.go b/util/file_test.go deleted file mode 100644 index 040b229270a..00000000000 --- a/util/file_test.go +++ /dev/null @@ -1,10 +0,0 @@ -package util - -import "testing" - -func TestFileDoesNotExist(t *testing.T) { - t.Parallel() - if FileExists("i would be surprised to discover that this file exists") { - t.Fail() - } -} diff --git a/util/pipes/duplex.go b/util/pipes/duplex.go deleted file mode 100644 index 14f5e480c2e..00000000000 --- a/util/pipes/duplex.go +++ /dev/null @@ -1,14 +0,0 @@ -package pipes - -// Duplex is a simple duplex channel -type Duplex struct { - In chan []byte - Out chan []byte -} - -func NewDuplex(bufsize int) Duplex { - return Duplex{ - In: make(chan []byte, bufsize), - Out: make(chan []byte, bufsize), - } -} diff --git a/util/sadhack/godep.go b/util/sadhack/godep.go deleted file mode 100644 index b7515531cb3..00000000000 --- a/util/sadhack/godep.go +++ /dev/null @@ -1,9 +0,0 @@ -package util - -// FIXME: we need the go-random/random utility for our sharness test wich depends on go-humanize -// Godep will drop it if we dont use it in ipfs. There should be a better way to do this. -import _ "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/dustin/go-humanize" - -// imported by chegga/pb on windows, this is here so running godeps on non-windows doesnt -// drop it from our vendoring -import _ "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/olekukonko/ts" diff --git a/util/time.go b/util/time.go deleted file mode 100644 index 5fc6ec66dcb..00000000000 --- a/util/time.go +++ /dev/null @@ -1,17 +0,0 @@ -package util - -import "time" - -var TimeFormatIpfs = time.RFC3339Nano - -func ParseRFC3339(s string) (time.Time, error) { - t, err := time.Parse(TimeFormatIpfs, s) - if err != nil { - return time.Time{}, err - } - return t.UTC(), nil -} - -func FormatRFC3339(t time.Time) string { - return t.UTC().Format(TimeFormatIpfs) -} diff --git a/util/time_test.go b/util/time_test.go deleted file mode 100644 index b5a98caa625..00000000000 --- a/util/time_test.go +++ /dev/null @@ -1,16 +0,0 @@ -package util - -import ( - "testing" - "time" -) - -func TestTimeFormatParseInversion(t *testing.T) { - v, err := ParseRFC3339(FormatRFC3339(time.Now())) - if err != nil { - t.Fatal(err) - } - if v.Location() != time.UTC { - t.Fatal("Time should be UTC") - } -} diff --git a/util/util.go b/util/util.go deleted file mode 100644 index 0e9cab7944a..00000000000 --- a/util/util.go +++ /dev/null @@ -1,159 +0,0 @@ -// Package util implements various utility functions used within ipfs -// that do not currently have a better place to live. -package util - -import ( - "errors" - "io" - "math/rand" - "os" - "path/filepath" - "runtime/debug" - "strings" - "time" - - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - b58 "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/mitchellh/go-homedir" -) - -// Debug is a global flag for debugging. -var Debug bool - -// ErrNotImplemented signifies a function has not been implemented yet. -var ErrNotImplemented = errors.New("Error: not implemented yet.") - -// ErrTimeout implies that a timeout has been triggered -var ErrTimeout = errors.New("Error: Call timed out.") - -// ErrSeErrSearchIncomplete implies that a search type operation didnt -// find the expected node, but did find 'a' node. -var ErrSearchIncomplete = errors.New("Error: Search Incomplete.") - -// ErrNotFound is returned when a search fails to find anything -var ErrNotFound = ds.ErrNotFound - -// TildeExpansion expands a filename, which may begin with a tilde. -func TildeExpansion(filename string) (string, error) { - return homedir.Expand(filename) -} - -// ErrCast is returned when a cast fails AND the program should not panic. -func ErrCast() error { - debug.PrintStack() - return errCast -} - -var errCast = errors.New("cast error") - -// ExpandPathnames takes a set of paths and turns them into absolute paths -func ExpandPathnames(paths []string) ([]string, error) { - var out []string - for _, p := range paths { - abspath, err := filepath.Abs(p) - if err != nil { - return nil, err - } - out = append(out, abspath) - } - return out, nil -} - -type randGen struct { - rand.Rand -} - -func NewTimeSeededRand() io.Reader { - src := rand.NewSource(time.Now().UnixNano()) - return &randGen{ - Rand: *rand.New(src), - } -} - -func NewSeededRand(seed int64) io.Reader { - src := rand.NewSource(seed) - return &randGen{ - Rand: *rand.New(src), - } -} - -func (r *randGen) Read(p []byte) (n int, err error) { - for i := 0; i < len(p); i++ { - p[i] = byte(r.Rand.Intn(255)) - } - return len(p), nil -} - -// GetenvBool is the way to check an env var as a boolean -func GetenvBool(name string) bool { - v := strings.ToLower(os.Getenv(name)) - return v == "true" || v == "t" || v == "1" -} - -// MultiErr is a util to return multiple errors -type MultiErr []error - -func (m MultiErr) Error() string { - if len(m) == 0 { - return "no errors" - } - - s := "Multiple errors: " - for i, e := range m { - if i != 0 { - s += ", " - } - s += e.Error() - } - return s -} - -func Partition(subject string, sep string) (string, string, string) { - if i := strings.Index(subject, sep); i != -1 { - return subject[:i], subject[i : i+len(sep)], subject[i+len(sep):] - } - return subject, "", "" -} - -func RPartition(subject string, sep string) (string, string, string) { - if i := strings.LastIndex(subject, sep); i != -1 { - return subject[:i], subject[i : i+len(sep)], subject[i+len(sep):] - } - return subject, "", "" -} - -// Hash is the global IPFS hash function. uses multihash SHA2_256, 256 bits -func Hash(data []byte) mh.Multihash { - h, err := mh.Sum(data, mh.SHA2_256, -1) - if err != nil { - // this error can be safely ignored (panic) because multihash only fails - // from the selection of hash function. If the fn + length are valid, it - // won't error. - panic("multihash failed to hash using SHA2_256.") - } - return h -} - -// IsValidHash checks whether a given hash is valid (b58 decodable, len > 0) -func IsValidHash(s string) bool { - out := b58.Decode(s) - if out == nil || len(out) == 0 { - return false - } - _, err := mh.Cast(out) - if err != nil { - return false - } - return true -} - -// XOR takes two byte slices, XORs them together, returns the resulting slice. -func XOR(a, b []byte) []byte { - c := make([]byte, len(a)) - for i := 0; i < len(a); i++ { - c[i] = a[i] ^ b[i] - } - return c -} diff --git a/util/util_test.go b/util/util_test.go deleted file mode 100644 index 70747ad902b..00000000000 --- a/util/util_test.go +++ /dev/null @@ -1,63 +0,0 @@ -package util - -import ( - "bytes" - "testing" -) - -func TestXOR(t *testing.T) { - cases := [][3][]byte{ - { - {0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 0xFF}, - {0x00, 0x00, 0x00}, - }, - { - {0x00, 0xFF, 0x00}, - {0xFF, 0xFF, 0xFF}, - {0xFF, 0x00, 0xFF}, - }, - { - {0x55, 0x55, 0x55}, - {0x55, 0xFF, 0xAA}, - {0x00, 0xAA, 0xFF}, - }, - } - - for _, c := range cases { - r := XOR(c[0], c[1]) - if !bytes.Equal(r, c[2]) { - t.Error("XOR failed") - } - } -} - -func BenchmarkHash256K(b *testing.B) { - buf := make([]byte, 256*1024) - NewTimeSeededRand().Read(buf) - b.SetBytes(int64(256 * 1024)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - Hash(buf) - } -} - -func BenchmarkHash512K(b *testing.B) { - buf := make([]byte, 512*1024) - NewTimeSeededRand().Read(buf) - b.SetBytes(int64(512 * 1024)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - Hash(buf) - } -} - -func BenchmarkHash1M(b *testing.B) { - buf := make([]byte, 1024*1024) - NewTimeSeededRand().Read(buf) - b.SetBytes(int64(1024 * 1024)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - Hash(buf) - } -}