gddo-admin: use the new database API for admin commands

Use default context.TODO() when initializing database for usage without
remote_api for search. This CL mainly fixes the gddo-admin commands.

Change-Id: I8518f3aeff57d3e733a99a45c50177cffaf35621
Reviewed-on: https://go-review.googlesource.com/57730
Reviewed-by: Ross Light <light@google.com>
diff --git a/database/database.go b/database/database.go
index 32fa2f2..0eea7c8 100644
--- a/database/database.go
+++ b/database/database.go
@@ -132,12 +132,12 @@
 	return remote_api.NewRemoteContext(host, client)
 }
 
-// New creates a gddo database. serverUri, idleTimeout, and logConn configure
+// New creates a gddo database. serverURI, idleTimeout, and logConn configure
 // the use of redis. gaeEndpoint is the target of the App Engine remoteapi
 // endpoint.
-func New(serverUri string, idleTimeout time.Duration, logConn bool, gaeEndpoint string) (*Database, error) {
+func New(serverURI string, idleTimeout time.Duration, logConn bool, gaeEndpoint string) (*Database, error) {
 	pool := &redis.Pool{
-		Dial:        newDBDialer(serverUri, logConn),
+		Dial:        newDBDialer(serverURI, logConn),
 		MaxIdle:     10,
 		IdleTimeout: idleTimeout,
 	}
@@ -148,9 +148,12 @@
 	}
 	c.Close()
 
-	gaeCtx, err := newAppEngineContext(gaeEndpoint)
-	if err != nil {
-		return nil, err
+	gaeCtx := context.TODO()
+	if gaeEndpoint != "" {
+		var err error
+		if gaeCtx, err = newAppEngineContext(gaeEndpoint); err != nil {
+			return nil, err
+		}
 	}
 
 	return &Database{Pool: pool, AppEngineContext: gaeCtx}, nil
@@ -753,6 +756,8 @@
 	return db.getPackages("index:import:"+path, false)
 }
 
+// Block puts a domain, repo or package into the block set, removes all the
+// packages under it from the database and prevents future crawling from it.
 func (db *Database) Block(root string) error {
 	c := db.Pool.Get()
 	defer c.Close()
@@ -785,6 +790,8 @@
     return  0
 `)
 
+// IsBlocked returns whether the package is blocked or belongs to a blocked
+// domain/repo.
 func (db *Database) IsBlocked(path string) (bool, error) {
 	c := db.Pool.Get()
 	defer c.Close()
diff --git a/doc/get.go b/doc/get.go
index 611bfd0..67a21a6 100644
--- a/doc/get.go
+++ b/doc/get.go
@@ -8,10 +8,11 @@
 package doc
 
 import (
-	"github.com/golang/gddo/gosrc"
 	"go/doc"
 	"net/http"
 	"strings"
+
+	"github.com/golang/gddo/gosrc"
 )
 
 func Get(client *http.Client, importPath string, etag string) (*Package, error) {
diff --git a/gddo-admin/block.go b/gddo-admin/block.go
index 70fe4c1..589cba7 100644
--- a/gddo-admin/block.go
+++ b/gddo-admin/block.go
@@ -7,9 +7,10 @@
 package main
 
 import (
-	"github.com/golang/gddo/database"
 	"log"
 	"os"
+
+	"github.com/golang/gddo/database"
 )
 
 var blockCommand = &command{
@@ -23,7 +24,7 @@
 		c.printUsage()
 		os.Exit(1)
 	}
-	db, err := database.New()
+	db, err := database.New(*redisServer, *dbIdleTimeout, false, gaeEndpoint)
 	if err != nil {
 		log.Fatal(err)
 	}
diff --git a/gddo-admin/crawl.go b/gddo-admin/crawl.go
index 62ebe71..4537790 100644
--- a/gddo-admin/crawl.go
+++ b/gddo-admin/crawl.go
@@ -28,7 +28,7 @@
 		c.printUsage()
 		os.Exit(1)
 	}
-	db, err := database.New()
+	db, err := database.New(*redisServer, *dbIdleTimeout, false, gaeEndpoint)
 	if err != nil {
 		log.Fatal(err)
 	}
diff --git a/gddo-admin/dangle.go b/gddo-admin/dangle.go
index b0473f6..0c34286 100644
--- a/gddo-admin/dangle.go
+++ b/gddo-admin/dangle.go
@@ -26,7 +26,7 @@
 		c.printUsage()
 		os.Exit(1)
 	}
-	db, err := database.New()
+	db, err := database.New(*redisServer, *dbIdleTimeout, false, gaeEndpoint)
 	if err != nil {
 		log.Fatal(err)
 	}
diff --git a/gddo-admin/delete.go b/gddo-admin/delete.go
index a9d188e..0ac2418 100644
--- a/gddo-admin/delete.go
+++ b/gddo-admin/delete.go
@@ -24,7 +24,7 @@
 		c.printUsage()
 		os.Exit(1)
 	}
-	db, err := database.New()
+	db, err := database.New(*redisServer, *dbIdleTimeout, false, gaeEndpoint)
 	if err != nil {
 		log.Fatal(err)
 	}
diff --git a/gddo-admin/main.go b/gddo-admin/main.go
index 223c94c..47f19af 100644
--- a/gddo-admin/main.go
+++ b/gddo-admin/main.go
@@ -12,6 +12,7 @@
 	"fmt"
 	"os"
 	"strings"
+	"time"
 )
 
 type command struct {
@@ -26,6 +27,14 @@
 	c.flag.PrintDefaults()
 }
 
+var (
+	project       = flag.String("project", "", "App Engine project ID used to interact with remote API.")
+	redisServer   = flag.String("db-server", "redis://127.0.0.1:6379", "URI of Redis server.")
+	dbIdleTimeout = flag.Duration("db-idle-timeout", 250*time.Second, "Close database connections after remaining idle for this duration.")
+)
+
+var gaeEndpoint string
+
 var commands = []*command{
 	blockCommand,
 	reindexCommand,
@@ -48,10 +57,18 @@
 	}
 }
 
+func setDefaults() {
+	if *project != "" {
+		gaeEndpoint = fmt.Sprintf("serviceproxy-dot-%s.appspot.com", *project)
+	}
+}
+
 func main() {
 	flag.Usage = printUsage
 	flag.Parse()
 	args := flag.Args()
+	setDefaults()
+
 	if len(args) >= 1 {
 		for _, c := range commands {
 			if args[0] == c.name {
diff --git a/gddo-admin/popular.go b/gddo-admin/popular.go
index cdb678d..f698a5e 100644
--- a/gddo-admin/popular.go
+++ b/gddo-admin/popular.go
@@ -30,7 +30,7 @@
 		c.printUsage()
 		os.Exit(1)
 	}
-	db, err := database.New()
+	db, err := database.New(*redisServer, *dbIdleTimeout, false, gaeEndpoint)
 	if err != nil {
 		log.Fatal(err)
 	}
diff --git a/gddo-admin/reindex.go b/gddo-admin/reindex.go
index 3c0210f..4b3fb88 100644
--- a/gddo-admin/reindex.go
+++ b/gddo-admin/reindex.go
@@ -51,7 +51,7 @@
 		c.printUsage()
 		os.Exit(1)
 	}
-	db, err := database.New()
+	db, err := database.New(*redisServer, *dbIdleTimeout, false, gaeEndpoint)
 	if err != nil {
 		log.Fatal(err)
 	}
diff --git a/gddo-admin/stats.go b/gddo-admin/stats.go
index 987087f..07d35b0 100644
--- a/gddo-admin/stats.go
+++ b/gddo-admin/stats.go
@@ -37,7 +37,7 @@
 		c.printUsage()
 		os.Exit(1)
 	}
-	db, err := database.New()
+	db, err := database.New(*redisServer, *dbIdleTimeout, false, gaeEndpoint)
 	if err != nil {
 		log.Fatal(err)
 	}
diff --git a/gddo-server/config.go b/gddo-server/config.go
index fbda23e..5f07548 100644
--- a/gddo-server/config.go
+++ b/gddo-server/config.go
@@ -89,8 +89,10 @@
 func setDefaults() {
 	// ConfigGAERemoteAPI is based on project.
 	project := viper.GetString(ConfigProject)
-	defaultEndpoint := fmt.Sprintf("serviceproxy-dot-%s.appspot.com", project)
-	viper.SetDefault(ConfigGAERemoteAPI, defaultEndpoint)
+	if project != "" {
+		defaultEndpoint := fmt.Sprintf("serviceproxy-dot-%s.appspot.com", project)
+		viper.SetDefault(ConfigGAERemoteAPI, defaultEndpoint)
+	}
 }
 
 func buildFlags() *pflag.FlagSet {
diff --git a/gddo-server/crawl.go b/gddo-server/crawl.go
index 9afdc00..959ab22 100644
--- a/gddo-server/crawl.go
+++ b/gddo-server/crawl.go
@@ -20,8 +20,7 @@
 )
 
 var (
-	testdataPat      = regexp.MustCompile(`/testdata(?:/|$)`)
-	blockedDomainPat = regexp.MustCompile(`^zxq\.co/`)
+	testdataPat = regexp.MustCompile(`/testdata(?:/|$)`)
 )
 
 // crawlDoc fetches the package documentation from the VCS and updates the database.
@@ -54,9 +53,6 @@
 	} else if blocked, e := db.IsBlocked(importPath); blocked && e == nil {
 		pdoc = nil
 		err = gosrc.NotFoundError{Message: "blocked."}
-	} else if blockedDomainPat.MatchString(importPath) {
-		pdoc = nil
-		err = gosrc.NotFoundError{Message: "blocked domain."}
 	} else if testdataPat.MatchString(importPath) {
 		pdoc = nil
 		err = gosrc.NotFoundError{Message: "testdata."}
diff --git a/gosrc/gosrc.go b/gosrc/gosrc.go
index 966821f..68181df 100644
--- a/gosrc/gosrc.go
+++ b/gosrc/gosrc.go
@@ -339,7 +339,7 @@
 
 // getVCSDirFn is called by getDynamic to fetch source using VCS commands. The
 // default value here does nothing. If the code is not built for App Engine,
-// then getvCSDirFn is set getVCSDir, the function that actually does the work.
+// then getVCSDirFn is set getVCSDir, the function that actually does the work.
 var getVCSDirFn = func(client *http.Client, m map[string]string, etag string) (*Directory, error) {
 	return nil, errNoMatch
 }