cmd/db,internal/database: merge gendb and dbdiff

srv/cmd/dbdiff and srv/cmd/gendb are merged into a single tool for
managing database creation.

Change-Id: Ic9314d1c1e0800a6be757b043be20889a1abcdfc
Reviewed-on: https://go-review.googlesource.com/c/vuln/+/372998
Trust: Julie Qiu <julie@golang.org>
Run-TryBot: Julie Qiu <julie@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
diff --git a/srv/cmd/db/main.go b/srv/cmd/db/main.go
new file mode 100644
index 0000000..fe114ac
--- /dev/null
+++ b/srv/cmd/db/main.go
@@ -0,0 +1,42 @@
+// Copyright 2021 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.
+
+// Command db provides a tool for creating and checking the vulndb.
+package main
+
+import (
+	"flag"
+	"fmt"
+	"log"
+	"os"
+
+	"golang.org/x/vuln/srv/internal/database"
+)
+
+func main() {
+	flag.Usage = func() {
+		fmt.Fprintf(flag.CommandLine.Output(), "usage: db [cmd]\n")
+		fmt.Fprintf(flag.CommandLine.Output(), "  diff [dbname1] [dbname2]: compare two different versions of the vulndb\n")
+		fmt.Fprintf(flag.CommandLine.Output(), "  generate [reportsDir] [jsonDir]: create a new vulndb\n")
+		flag.PrintDefaults()
+	}
+	flag.Parse()
+	if flag.NArg() != 3 {
+		flag.Usage()
+		os.Exit(1)
+	}
+	cmd := os.Args[0]
+	switch cmd {
+	case "diff":
+		if err := database.Diff(os.Args[1], os.Args[2]); err != nil {
+			log.Fatal(err)
+		}
+	case "generate":
+		if err := database.Generate(os.Args[1], os.Args[2]); err != nil {
+			log.Fatal(err)
+		}
+	default:
+		log.Fatalf("unsupported command: %q", cmd)
+	}
+}
diff --git a/srv/cmd/gendb/main.go b/srv/cmd/gendb/main.go
index 73d4e50..136f47d 100644
--- a/srv/cmd/gendb/main.go
+++ b/srv/cmd/gendb/main.go
@@ -13,10 +13,6 @@
 	"golang.org/x/vuln/srv/internal/database"
 )
 
-// TODO(rolandshoemaker): once we have the HTML representation ready this should
-// be the prefix for that.
-const dbURL = "https://go.googlesource.com/vuln/+/refs/heads/master/reports/"
-
 var (
 	yamlDir = flag.String("reports", "reports", "Directory containing yaml reports")
 	jsonDir = flag.String("out", "out", "Directory to write JSON database to")
@@ -24,7 +20,7 @@
 
 func main() {
 	flag.Parse()
-	if err := database.Generate(*yamlDir, *jsonDir, dbURL); err != nil {
+	if err := database.Generate(*yamlDir, *jsonDir); err != nil {
 		log.Fatal(err)
 	}
 }
diff --git a/srv/internal/database/generate.go b/srv/internal/database/generate.go
index e231774..917285b 100644
--- a/srv/internal/database/generate.go
+++ b/srv/internal/database/generate.go
@@ -22,7 +22,9 @@
 	"gopkg.in/yaml.v2"
 )
 
-func Generate(yamlDir, jsonDir, dbURL string) (err error) {
+const dbURL = "https://go.googlesource.com/vuln/+/refs/heads/master/reports/"
+
+func Generate(yamlDir, jsonDir string) (err error) {
 	defer derrors.Wrap(&err, "Generate(%q)", yamlDir)
 	yamlFiles, err := ioutil.ReadDir(yamlDir)
 	if err != nil {