| Index: impl/memory/info.go
 | 
| diff --git a/impl/memory/info.go b/impl/memory/info.go
 | 
| index 89c2f440285a364537c9df245e686827f26f0482..9a63ba847935aa00f24cc52216c2309e629779fd 100644
 | 
| --- a/impl/memory/info.go
 | 
| +++ b/impl/memory/info.go
 | 
| @@ -6,10 +6,11 @@ package memory
 | 
|  
 | 
|  import (
 | 
|  	"fmt"
 | 
| -	"regexp"
 | 
|  
 | 
|  	"github.com/luci/gae/impl/dummy"
 | 
|  	"github.com/luci/gae/service/info"
 | 
| +	"github.com/luci/gae/service/info/support"
 | 
| +
 | 
|  	"golang.org/x/net/context"
 | 
|  )
 | 
|  
 | 
| @@ -17,9 +18,6 @@ type giContextKeyType int
 | 
|  
 | 
|  var giContextKey giContextKeyType
 | 
|  
 | 
| -// validNamespace matches valid namespace names.
 | 
| -var validNamespace = regexp.MustCompile(`^[0-9A-Za-z._-]{0,100}$`)
 | 
| -
 | 
|  var defaultGlobalInfoData = globalInfoData{
 | 
|  	// versionID returns X.Y where Y is autogenerated by appengine, and X is
 | 
|  	// whatever's in app.yaml.
 | 
| @@ -30,18 +28,11 @@ var defaultGlobalInfoData = globalInfoData{
 | 
|  type globalInfoData struct {
 | 
|  	appID     string
 | 
|  	fqAppID   string
 | 
| -	namespace *string
 | 
| +	namespace string
 | 
|  	versionID string
 | 
|  	requestID string
 | 
|  }
 | 
|  
 | 
| -func (gid *globalInfoData) getNamespace() (string, bool) {
 | 
| -	if ns := gid.namespace; ns != nil {
 | 
| -		return *ns, true
 | 
| -	}
 | 
| -	return "", false
 | 
| -}
 | 
| -
 | 
|  func curGID(c context.Context) *globalInfoData {
 | 
|  	if gid, ok := c.Value(giContextKey).(*globalInfoData); ok {
 | 
|  		return gid
 | 
| @@ -76,17 +67,15 @@ type giImpl struct {
 | 
|  
 | 
|  var _ = info.RawInterface((*giImpl)(nil))
 | 
|  
 | 
| -func (gi *giImpl) GetNamespace() (string, bool) {
 | 
| -	return gi.getNamespace()
 | 
| -}
 | 
| +func (gi *giImpl) GetNamespace() string { return gi.namespace }
 | 
|  
 | 
| -func (gi *giImpl) Namespace(ns string) (ret context.Context, err error) {
 | 
| -	if !validNamespace.MatchString(ns) {
 | 
| -		return nil, fmt.Errorf("appengine: namespace %q does not match /%s/", ns, validNamespace)
 | 
| +func (gi *giImpl) Namespace(ns string) (context.Context, error) {
 | 
| +	if err := support.ValidNamespace(ns); err != nil {
 | 
| +		return gi.c, err
 | 
|  	}
 | 
|  
 | 
|  	return useGID(gi.c, func(mod *globalInfoData) {
 | 
| -		mod.namespace = &ns
 | 
| +		mod.namespace = ns
 | 
|  	}), nil
 | 
|  }
 | 
|  
 | 
| @@ -114,7 +103,7 @@ func (gi *giImpl) RequestID() string {
 | 
|  	return curGID(gi.c).requestID
 | 
|  }
 | 
|  
 | 
| -func (gi *giImpl) Testable() info.Testable {
 | 
| +func (gi *giImpl) GetTestable() info.Testable {
 | 
|  	return gi
 | 
|  }
 | 
|  
 | 
| 
 |