test_planner: delete contents of the old test_planner repo

All of this code now lives in https://chromium.googlesource.com/chromiumos/infra/go/+/master

I'll leave this repo around for a little while just to be safe, but I'll
delete it entirely soon.

BUG=None
TEST=None

Change-Id: Ib6f42d1d1b1afb9c4faae0d8d23020d3dedda15b
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/infra/test_planner/+/1680642
Reviewed-by: Evan Hernandez <evanhernandez@chromium.org>
Commit-Queue: Sean Abraham <seanabraham@chromium.org>
Tested-by: Sean Abraham <seanabraham@chromium.org>
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2b08891
--- /dev/null
+++ b/README.md
@@ -0,0 +1,6 @@
+# test\_planner code has moved
+
+The test planner code has been relocated to the chromiumos/infra/go repo.
+See https://chromium.googlesource.com/chromiumos/infra/go/+/master
+
+seanabraham will soon be deleting this repo entirely.
diff --git a/cipd.yaml b/cipd.yaml
deleted file mode 100644
index 48ffcb3..0000000
--- a/cipd.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-package: chromiumos/infra/test_planner
-description: Chromiumos test planner.
-install_mode: copy
-root: ".out"
-
-data:
-  # include everything in the .out directory
-  - dir: .
-
diff --git a/deploy_cipd.json b/deploy_cipd.json
deleted file mode 100644
index 44799b9..0000000
--- a/deploy_cipd.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "result": {
-    "package": "chromiumos/infra/test_planner",
-    "instance_id": "9d0hPmn-M6kF0rTidWXJKuUa-w-mHLZI3W-kIzXl0bwC"
-  }
-}
\ No newline at end of file
diff --git a/deploy_cipd.sh b/deploy_cipd.sh
deleted file mode 100755
index 5125fd0..0000000
--- a/deploy_cipd.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash -e
-
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-cd "$(dirname "$0")"
-
-# Wrap all testplan commands as cipd package.
-CMDPATH="./src/testplans/cmd"
-OUTPATH="$(pwd -P)/.out"
-
-if [ -e $OUTPATH ]; then
-  rm -r $OUTPATH/*
-fi
-
-# translation:
-# all cmds | strip trailing /
-COMMANDS=$(cd $CMDPATH; ls -d */ | sed 's#/##')
-
-for go_cmd in $COMMANDS; do
-  (cd "$CMDPATH/$go_cmd" && go build -o "$OUTPATH/$go_cmd")
-done
-
-cipd create -pkg-def=cipd.yaml -ref latest -json-output deploy_cipd.json
diff --git a/src/testplans/cmd/pointless_build_checker/pointless_build_checker.go b/src/testplans/cmd/pointless_build_checker/pointless_build_checker.go
deleted file mode 100644
index 05df25a..0000000
--- a/src/testplans/cmd/pointless_build_checker/pointless_build_checker.go
+++ /dev/null
@@ -1,237 +0,0 @@
-// Copyright 2019 The Chromium 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 main
-
-import (
-	"bytes"
-	"context"
-	"flag"
-	"fmt"
-	"github.com/golang/protobuf/jsonpb"
-	"github.com/golang/protobuf/proto"
-	"github.com/maruel/subcommands"
-	testplans_pb "go.chromium.org/chromiumos/infra/proto/go/testplans"
-	"go.chromium.org/luci/auth"
-	"go.chromium.org/luci/auth/client/authcli"
-	bbproto "go.chromium.org/luci/buildbucket/proto"
-	"go.chromium.org/luci/common/api/gerrit"
-	"go.chromium.org/luci/common/cli"
-	"go.chromium.org/luci/hardcoded/chromeinfra"
-	"io/ioutil"
-	"log"
-	"os"
-	"strings"
-	"testplans/internal/git"
-	"testplans/internal/pointless"
-	"testplans/internal/repo"
-)
-
-const (
-	buildIrrelevanceConfigPath = "testingconfig/generated/build_irrelevance_config.cfg"
-)
-
-var (
-	unmarshaler = jsonpb.Unmarshaler{AllowUnknownFields: true}
-)
-
-func cmdCheckBuild(authOpts auth.Options) *subcommands.Command {
-	return &subcommands.Command{
-		UsageLine: "check-build --input_json=/path/to/input.json --output_json=/path/to/output.json",
-		ShortDesc: "Checks if the current build is pointless",
-		LongDesc: "Checks if the current build is pointless, e.g. if the commits in the CQ run can't " +
-			"actually affect the outcome of the build.",
-		CommandRun: func() subcommands.CommandRun {
-			c := &checkBuild{}
-			c.authFlags = authcli.Flags{}
-			c.authFlags.Register(c.GetFlags(), authOpts)
-			c.Flags.StringVar(&c.inputJson, "input_json", "",
-				"Path to JSON proto representing a PointlessBuildCheckRequest")
-			c.Flags.StringVar(&c.outputJson, "output_json", "",
-				"Path to file to write output PointlessBuildCheckResponse JSON proto")
-			return c
-		}}
-}
-
-func (c *checkBuild) Run(a subcommands.Application, args []string, env subcommands.Env) int {
-	flag.Parse()
-
-	req, err := c.readInputJson()
-	if err != nil {
-		log.Print(err)
-		return 1
-	}
-
-	cfg, err := c.fetchConfigFromGitiles()
-	if err != nil {
-		log.Print(err)
-		return 2
-	}
-
-	build, err := readBuildbucketBuild(req.BuildbucketProto)
-	if err != nil {
-		log.Print(err)
-		return 3
-	}
-
-	changeRevs, err := c.fetchGerritData(build)
-	if err != nil {
-		log.Print(err)
-		return 4
-	}
-	repoToSrcRoot, err := c.getRepoToSourceRoot(req.ManifestCommit)
-	if err != nil {
-		log.Print(err)
-		return 5
-	}
-
-	resp, err := pointless.CheckBuilder(build, changeRevs, req.DepGraph, *repoToSrcRoot, *cfg)
-	if err != nil {
-		log.Printf("Error checking if build is pointless:\n%v", err)
-		return 6
-	}
-
-	if err = c.writeOutputJson(resp); err != nil {
-		log.Print(err)
-		return 7
-	}
-	return 0
-}
-
-type checkBuild struct {
-	subcommands.CommandRunBase
-	authFlags  authcli.Flags
-	inputJson  string
-	outputJson string
-}
-
-func (c *checkBuild) readInputJson() (*testplans_pb.PointlessBuildCheckRequest, error) {
-	inputBytes, err := ioutil.ReadFile(c.inputJson)
-	log.Printf("Request is:\n%s", string(inputBytes))
-	if err != nil {
-		return nil, fmt.Errorf("Failed reading input_json\n%v", err)
-	}
-	req := &testplans_pb.PointlessBuildCheckRequest{}
-	if err := unmarshaler.Unmarshal(bytes.NewReader(inputBytes), req); err != nil {
-		return nil, fmt.Errorf("Couldn't decode %s as a chromiumos.PointlessBuildCheckRequest\n%v", c.inputJson, err)
-	}
-	return req, nil
-}
-
-func (c *checkBuild) fetchConfigFromGitiles() (*testplans_pb.BuildIrrelevanceCfg, error) {
-	// Create an authenticated client for Gerrit RPCs, then fetch all required CL data from Gerrit.
-	ctx := context.Background()
-	authOpts, err := c.authFlags.Options()
-	if err != nil {
-		return nil, err
-	}
-	authedClient, err := auth.NewAuthenticator(ctx, auth.SilentLogin, authOpts).Client()
-	if err != nil {
-		return nil, err
-	}
-	m, err := git.FetchFilesFromGitiles(authedClient, ctx,
-		"chrome-internal.googlesource.com",
-		"chromeos/infra/config",
-		"master",
-		[]string{buildIrrelevanceConfigPath})
-	if err != nil {
-		return nil, err
-	}
-	buildIrrelevanceConfig := &testplans_pb.BuildIrrelevanceCfg{}
-	if err := unmarshaler.Unmarshal(strings.NewReader((*m)[buildIrrelevanceConfigPath]), buildIrrelevanceConfig); err != nil {
-		return nil, fmt.Errorf("Couldn't decode %s as a BuildIrrelevanceCfg\n%v", (*m)[buildIrrelevanceConfigPath], err)
-	}
-	log.Printf("Fetched config from Gitiles: %s\n", proto.MarshalTextString(buildIrrelevanceConfig))
-	return buildIrrelevanceConfig, nil
-}
-
-func readBuildbucketBuild(bbBuildBytes *testplans_pb.ProtoBytes) (*bbproto.Build, error) {
-	bbBuild := &bbproto.Build{}
-	if err := proto.Unmarshal(bbBuildBytes.SerializedProto, bbBuild); err != nil {
-		return nil, fmt.Errorf("Couldn't decode %s as a Buildbucket Build\n%v", bbBuildBytes.String(), err)
-	}
-	log.Printf("Got buildbucket proto:\n%s", proto.MarshalTextString(bbBuild))
-	return bbBuild, nil
-}
-
-func (c *checkBuild) fetchGerritData(build *bbproto.Build) (*git.ChangeRevData, error) {
-	// Create an authenticated client for Gerrit RPCs, then fetch all required CL data from Gerrit.
-	ctx := context.Background()
-	authOpts, err := c.authFlags.Options()
-	if err != nil {
-		return nil, err
-	}
-	authedClient, err := auth.NewAuthenticator(ctx, auth.SilentLogin, authOpts).Client()
-	if err != nil {
-		return nil, err
-	}
-	changeIds := make([]git.ChangeRevKey, 0)
-	for _, ch := range build.Input.GerritChanges {
-		changeIds = append(changeIds, git.ChangeRevKey{Host: ch.Host, ChangeNum: ch.Change, Revision: int32(ch.Patchset)})
-	}
-	chRevData, err := git.GetChangeRevData(authedClient, ctx, changeIds)
-	if err != nil {
-		return nil, fmt.Errorf("Failed to fetch CL data from Gerrit. "+
-			"Note that a NotFound error may indicate authorization issues.\n%v", err)
-	}
-	return chRevData, nil
-}
-
-func (c *checkBuild) getRepoToSourceRoot(manifestCommit string) (*map[string]string, error) {
-	ctx := context.Background()
-	authOpts, err := c.authFlags.Options()
-	if err != nil {
-		return nil, err
-	}
-	authedClient, err := auth.NewAuthenticator(ctx, auth.SilentLogin, authOpts).Client()
-	if err != nil {
-		return nil, err
-	}
-	if manifestCommit == "" {
-		log.Print("No manifestCommit provided. Using 'snapshot' instead.")
-		manifestCommit = "snapshot"
-	}
-	repoToSrcRoot, err := repo.GetRepoToSourceRootFromManifests(authedClient, ctx, manifestCommit)
-	if err != nil {
-		return nil, fmt.Errorf("Error with repo tool call\n%v", err)
-	}
-	return &repoToSrcRoot, nil
-}
-
-func (c *checkBuild) writeOutputJson(resp *testplans_pb.PointlessBuildCheckResponse) error {
-	marshal := &jsonpb.Marshaler{EmitDefaults: true, Indent: "  "}
-	jsonOutput, err := marshal.MarshalToString(resp)
-	if err != nil {
-		return fmt.Errorf("Failed to marshal %v\n%v", resp, err)
-	}
-	if err = ioutil.WriteFile(c.outputJson, []byte(jsonOutput), 0644); err != nil {
-		return fmt.Errorf("Failed to write output JSON!\n%v", err)
-	}
-	log.Printf("Full output =\n%s", proto.MarshalTextString(resp))
-	log.Printf("Wrote output to %s", c.outputJson)
-	return nil
-}
-
-func GetApplication(authOpts auth.Options) *cli.Application {
-	return &cli.Application{
-		Name: "pointless_build_checker",
-
-		Context: func(ctx context.Context) context.Context {
-			return ctx
-		},
-
-		Commands: []*subcommands.Command{
-			authcli.SubcommandInfo(authOpts, "auth-info", false),
-			authcli.SubcommandLogin(authOpts, "auth-login", false),
-			authcli.SubcommandLogout(authOpts, "auth-logout", false),
-			cmdCheckBuild(authOpts),
-		},
-	}
-}
-
-func main() {
-	opts := chromeinfra.DefaultAuthOptions()
-	opts.Scopes = []string{gerrit.OAuthScope, auth.OAuthScopeEmail}
-	app := GetApplication(opts)
-	os.Exit(subcommands.Run(app, nil))
-}
diff --git a/src/testplans/cmd/test_plan_generator/README.md b/src/testplans/cmd/test_plan_generator/README.md
deleted file mode 100644
index 3e68aa2..0000000
--- a/src/testplans/cmd/test_plan_generator/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# Test plan generator
-
-The test plan generator determines which tests need to run for a given set of
-Chrome OS builds.
-
-This is generally intended to be executed by a LUCI recipe. A service account
-credentials file is needed in order to fetch CL data from Gerrit.
-
-```shell
-go run cmd/test_plan_generator/main.go gen-test-plan \
-    --input_json=/path/to/input.json \
-    --output_json=/path/for/output.json \
-    --service-account-json=/path/to/service-account-json-file.json
-```
-
-See the sample directory for data that can be used for local runs.
diff --git a/src/testplans/cmd/test_plan_generator/main.go b/src/testplans/cmd/test_plan_generator/main.go
deleted file mode 100644
index c9afe75..0000000
--- a/src/testplans/cmd/test_plan_generator/main.go
+++ /dev/null
@@ -1,249 +0,0 @@
-// Copyright 2019 The Chromium 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 main
-
-import (
-	"bytes"
-	"context"
-	"flag"
-	"fmt"
-	"github.com/golang/protobuf/jsonpb"
-	"github.com/golang/protobuf/proto"
-	"github.com/maruel/subcommands"
-	"go.chromium.org/chromiumos/infra/proto/go/testplans"
-	"go.chromium.org/luci/auth"
-	"go.chromium.org/luci/auth/client/authcli"
-	bbproto "go.chromium.org/luci/buildbucket/proto"
-	"go.chromium.org/luci/common/api/gerrit"
-	"go.chromium.org/luci/common/cli"
-	"go.chromium.org/luci/hardcoded/chromeinfra"
-	"io/ioutil"
-	"log"
-	"os"
-	"strings"
-	"testplans/internal/generator"
-	"testplans/internal/git"
-	"testplans/internal/repo"
-)
-
-const (
-	sourceTreeTestConfigPath   = "testingconfig/generated/source_tree_test_config.cfg"
-	targetTestRequirementsPath = "testingconfig/generated/target_test_requirements.cfg"
-)
-
-var (
-	unmarshaler = jsonpb.Unmarshaler{AllowUnknownFields: true}
-)
-
-func cmdGenTestPlan(authOpts auth.Options) *subcommands.Command {
-	return &subcommands.Command{
-		UsageLine: "gen-test-plan --input_json=/path/to/input.json --output_json=/path/to/output.json",
-		ShortDesc: "Generates a test plan",
-		LongDesc:  "Generates a test plan",
-		CommandRun: func() subcommands.CommandRun {
-			c := &getTestPlanRun{}
-			c.authFlags = authcli.Flags{}
-			c.authFlags.Register(c.GetFlags(), authOpts)
-			c.Flags.StringVar(&c.inputJson, "input_json", "", "Path to JSON proto representing a GenerateTestPlanRequest")
-			c.Flags.StringVar(&c.outputJson, "output_json", "", "Path to file to write output GenerateTestPlanResponse JSON proto")
-			return c
-		}}
-}
-
-func (c *getTestPlanRun) Run(a subcommands.Application, args []string, env subcommands.Env) int {
-	flag.Parse()
-
-	req, err := c.readInputJson()
-	if err != nil {
-		log.Print(err)
-		return 1
-	}
-
-	sourceTreeConfig, testReqsConfig, err := c.fetchConfigFromGitiles()
-	if err != nil {
-		log.Print(err)
-		return 2
-	}
-
-	bbBuilds, err := readBuildbucketBuilds(req.BuildbucketProtos)
-	if err != nil {
-		log.Print(err)
-		return 3
-	}
-
-	changeRevs, err := c.fetchGerritData(bbBuilds)
-	if err != nil {
-		log.Print(err)
-		return 4
-	}
-	repoToSrcRoot, err := c.getRepoToSourceRoot(req.ManifestCommit)
-	if err != nil {
-		log.Print(err)
-		return 5
-	}
-
-	testPlan, err := generator.CreateTestPlan(testReqsConfig, sourceTreeConfig, bbBuilds, changeRevs, *repoToSrcRoot)
-	if err != nil {
-		log.Printf("Error creating test plan:\n%v", err)
-		return 6
-	}
-
-	if err = c.writeOutputJson(testPlan); err != nil {
-		log.Print(err)
-		return 7
-	}
-	return 0
-}
-
-type getTestPlanRun struct {
-	subcommands.CommandRunBase
-	authFlags  authcli.Flags
-	inputJson  string
-	outputJson string
-}
-
-func (c *getTestPlanRun) readInputJson() (*testplans.GenerateTestPlanRequest, error) {
-	inputBytes, err := ioutil.ReadFile(c.inputJson)
-	log.Printf("Request is:\n%s", string(inputBytes))
-	if err != nil {
-		return nil, fmt.Errorf("Failed reading input_json\n%v", err)
-	}
-	req := &testplans.GenerateTestPlanRequest{}
-	if err := unmarshaler.Unmarshal(bytes.NewReader(inputBytes), req); err != nil {
-		return nil, fmt.Errorf("Couldn't decode %s as a GenerateTestPlanRequest\n%v", c.inputJson, err)
-	}
-	return req, nil
-}
-
-func (c *getTestPlanRun) fetchConfigFromGitiles() (*testplans.SourceTreeTestCfg, *testplans.TargetTestRequirementsCfg, error) {
-	// Create an authenticated client for Gerrit RPCs, then fetch all required CL data from Gerrit.
-	ctx := context.Background()
-	authOpts, err := c.authFlags.Options()
-	if err != nil {
-		return nil, nil, err
-	}
-	authedClient, err := auth.NewAuthenticator(ctx, auth.SilentLogin, authOpts).Client()
-	if err != nil {
-		return nil, nil, err
-	}
-	m, err := git.FetchFilesFromGitiles(authedClient, ctx,
-		"chrome-internal.googlesource.com",
-		"chromeos/infra/config",
-		"master",
-		[]string{sourceTreeTestConfigPath, targetTestRequirementsPath})
-	if err != nil {
-		return nil, nil, err
-	}
-	sourceTreeConfig := &testplans.SourceTreeTestCfg{}
-	if err := unmarshaler.Unmarshal(strings.NewReader((*m)[sourceTreeTestConfigPath]), sourceTreeConfig); err != nil {
-		return nil, nil, fmt.Errorf("Couldn't decode %s as a SourceTreeTestCfg\n%v", (*m)[sourceTreeTestConfigPath], err)
-	}
-	testReqsConfig := &testplans.TargetTestRequirementsCfg{}
-	if err := unmarshaler.Unmarshal(strings.NewReader((*m)[targetTestRequirementsPath]), testReqsConfig); err != nil {
-		return nil, nil, fmt.Errorf("Couldn't decode %s as a TargetTestRequirementsCfg\n%s",
-			targetTestRequirementsPath, err)
-	}
-	log.Printf("Fetched config from Gitiles: %s\n\n%s",
-		proto.MarshalTextString(sourceTreeConfig), proto.MarshalTextString(testReqsConfig))
-	return sourceTreeConfig, testReqsConfig, nil
-}
-
-func readBuildbucketBuilds(bbBuildsBytes []*testplans.ProtoBytes) ([]*bbproto.Build, error) {
-	bbBuilds := make([]*bbproto.Build, 0)
-	for _, bbBuildBytes := range bbBuildsBytes {
-		bbBuild := &bbproto.Build{}
-		if err := proto.Unmarshal(bbBuildBytes.SerializedProto, bbBuild); err != nil {
-			return bbBuilds, fmt.Errorf("Couldn't decode %s as a Buildbucket Build\n%v", bbBuildBytes.String(), err)
-		}
-		bbBuilds = append(bbBuilds, bbBuild)
-	}
-	if len(bbBuilds) > 0 {
-		log.Printf("Sample buildbucket proto:\n%s", proto.MarshalTextString(bbBuilds[0]))
-	}
-	return bbBuilds, nil
-}
-
-func (c *getTestPlanRun) fetchGerritData(bbBuilds []*bbproto.Build) (*git.ChangeRevData, error) {
-	// Create an authenticated client for Gerrit RPCs, then fetch all required CL data from Gerrit.
-	ctx := context.Background()
-	authOpts, err := c.authFlags.Options()
-	if err != nil {
-		return nil, err
-	}
-	authedClient, err := auth.NewAuthenticator(ctx, auth.SilentLogin, authOpts).Client()
-	if err != nil {
-		return nil, err
-	}
-	changeIds := make([]git.ChangeRevKey, 0)
-	for _, build := range bbBuilds {
-		for _, ch := range build.Input.GerritChanges {
-			changeIds = append(changeIds, git.ChangeRevKey{Host: ch.Host, ChangeNum: ch.Change, Revision: int32(ch.Patchset)})
-		}
-	}
-	chRevData, err := git.GetChangeRevData(authedClient, ctx, changeIds)
-	if err != nil {
-		return nil, fmt.Errorf("Failed to fetch CL data from Gerrit. "+
-			"Note that a NotFound error may indicate authorization issues.\n%v", err)
-	}
-	return chRevData, nil
-}
-
-func (c *getTestPlanRun) getRepoToSourceRoot(manifestCommit string) (*map[string]string, error) {
-	ctx := context.Background()
-	authOpts, err := c.authFlags.Options()
-	if err != nil {
-		return nil, err
-	}
-	authedClient, err := auth.NewAuthenticator(ctx, auth.SilentLogin, authOpts).Client()
-	if err != nil {
-		return nil, err
-	}
-	if manifestCommit == "" {
-		log.Print("No manifestCommit provided. Using 'snapshot' instead.")
-		manifestCommit = "snapshot"
-	}
-	repoToSrcRoot, err := repo.GetRepoToSourceRootFromManifests(authedClient, ctx, manifestCommit)
-	if err != nil {
-		return nil, fmt.Errorf("Error with repo tool call\n%v", err)
-	}
-	return &repoToSrcRoot, nil
-}
-
-func (c *getTestPlanRun) writeOutputJson(tp *testplans.GenerateTestPlanResponse) error {
-	marshal := &jsonpb.Marshaler{EmitDefaults: true, Indent: "  "}
-	jsonOutput, err := marshal.MarshalToString(tp)
-	if err != nil {
-		return fmt.Errorf("Failed to marshal %v\n%v", tp, err)
-	}
-	if err = ioutil.WriteFile(c.outputJson, []byte(jsonOutput), 0644); err != nil {
-		return fmt.Errorf("Failed to write output JSON!\n%v", err)
-	}
-	log.Printf("Full test plan =\n%s", proto.MarshalTextString(tp))
-	log.Printf("Wrote output to %s", c.outputJson)
-	return nil
-}
-
-func GetApplication(authOpts auth.Options) *cli.Application {
-	return &cli.Application{
-		Name: "test_planner",
-
-		Context: func(ctx context.Context) context.Context {
-			return ctx
-		},
-
-		Commands: []*subcommands.Command{
-			authcli.SubcommandInfo(authOpts, "auth-info", false),
-			authcli.SubcommandLogin(authOpts, "auth-login", false),
-			authcli.SubcommandLogout(authOpts, "auth-logout", false),
-			cmdGenTestPlan(authOpts),
-		},
-	}
-}
-
-func main() {
-	opts := chromeinfra.DefaultAuthOptions()
-	opts.Scopes = []string{gerrit.OAuthScope, auth.OAuthScopeEmail}
-	app := GetApplication(opts)
-	os.Exit(subcommands.Run(app, nil))
-}
diff --git a/src/testplans/cmd/test_plan_generator/sample/README.md b/src/testplans/cmd/test_plan_generator/sample/README.md
deleted file mode 100644
index 5b8171a..0000000
--- a/src/testplans/cmd/test_plan_generator/sample/README.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# Test plan generator sample
-
-So you want to try running the test plan generator locally? Cool! Alright,
-you're going to have to do a bit of setup, and you'll have to be a Googler.
-
-1. Have the test_planner repo (you're in it now) checked out (see
-   https://chromium.googlesource.com/chromiumos/infra/test_planner).
-1. Have a local chromiumos repo checkout.
-1. Have depot_tools (in particular, the repo command) on your PATH.
-1. Have Golang >=1.12 installed.
-
-OK, now edit gen_test_plan_input.json and replace the REPLACE strings.
-
-This might look something like
-
-```json
-{
-  "chromiumos_checkout_root": "/home/sean/chromiumos",
-  "buildbucket_protos": [
-    {
-      "serialized_proto": "SomeBase64EncodedBuildBucketBuildProto"
-    },
-    {
-      "serialized_proto": "SomeOtherBase64EncodedBuildBucketBuildProto"
-    }
-  ]
-}
-```
-
-Alright, now you'll need to get OAuth credentials to run the program:
-
-```shell
-# Get to this folder in the repo
-# cd test_planner/src/testplans/
-go run cmd/test_plan_generator/main.go auth-login
-```
-
-And now you can actually run it:
-
-```shell
-go run cmd/test_plan_generator/main.go gen-test-plan \
-    --input_json=$PWD/cmd/test_plan_generator/sample/input.json \
-    --output_json=$PWD/cmd/test_plan_generator/sample/output.json
-```
diff --git a/src/testplans/cmd/test_plan_generator/sample/build_bucket_build_1.cfg b/src/testplans/cmd/test_plan_generator/sample/build_bucket_build_1.cfg
deleted file mode 100644
index 66e49f5..0000000
--- a/src/testplans/cmd/test_plan_generator/sample/build_bucket_build_1.cfg
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-    "status": "SUCCESS",
-    "updateTime": "2019-04-03T23:06:03.857944Z",
-    "createdBy": "user:chromeos-postsubmit@chromeos-bot.iam.gserviceaccount.com",
-    "builder": {
-        "project": "chromeos",
-        "builder": "wolf-postsubmit",
-        "bucket": "postsubmit"
-    },
-    "number": 152,
-    "id": "8917161684567016032",
-    "startTime": "2019-04-03T22:02:54.342805Z",
-    "input": {
-        "gitilesCommit": {
-            "project": "chromeos/manifest-internal",
-            "host": "chrome-internal.googlesource.com",
-            "ref": "refs/heads/snapshot",
-            "id": "a62682ab3278e994f51317a42b99d6409d2cb1ad"
-        },
-       "properties": {
-          "$recipe_engine/runtime": {
-              "is_experimental": false,
-              "is_luci": true
-          },
-          "$kitchen": {
-              "devshell": false,
-              "git_auth": false
-          },
-          "buildnumber": 256,
-          "buildername": "wolf-postsubmit"
-       }
-    },
-    "output": {
-       "properties": {
-          "build_target": {
-              "name": "wolf"
-          },
-          "artifacts": {
-              "gs_bucket": "gs://some-bucket-name",
-              "gs_path": "wolf-dummy/R1-0.0.0"
-          }
-       }
-    },
-    "endTime": "2019-04-03T23:06:03.176817Z",
-    "createTime": "2019-04-03T22:02:28.394159Z"
-}
diff --git a/src/testplans/cmd/test_plan_generator/sample/build_bucket_build_2.cfg b/src/testplans/cmd/test_plan_generator/sample/build_bucket_build_2.cfg
deleted file mode 100644
index b7c18c2..0000000
--- a/src/testplans/cmd/test_plan_generator/sample/build_bucket_build_2.cfg
+++ /dev/null
@@ -1,52 +0,0 @@
-{
-    "status": "SUCCESS",
-    "updateTime": "2019-04-03T23:06:03.857944Z",
-    "createdBy": "user:chromeos@chromeos-bot.iam.gserviceaccount.com",
-    "builder": {
-        "project": "chromeos",
-        "builder": "reef-postsubmit",
-        "bucket": "postsubmit"
-    },
-    "number": 152,
-    "id": "8917161684567016032",
-    "startTime": "2019-04-03T22:02:54.342805Z",
-    "input": {
-        "gerritChanges": [
-          {
-            "host": "chromium-review.googlesource.com",
-            "change": "1384752",
-            "patchset": "1"
-          },
-          {
-            "host": "chrome-internal-review.googlesource.com",
-            "change": "1072090",
-            "patchset": "1"
-          }
-        ],
-       "properties": {
-          "$recipe_engine/runtime": {
-              "is_experimental": false,
-              "is_luci": true
-          },
-          "$kitchen": {
-              "devshell": false,
-              "git_auth": false
-          },
-          "buildnumber": 256,
-          "buildername": "reef-paladin"
-       }
-    },
-    "output": {
-       "properties": {
-          "build_target": {
-              "name": "reef"
-          },
-          "artifacts": {
-              "gs_bucket": "gs://some-bucket-name",
-              "gs_path": "reef-dummy/R1-0.0.0"
-          }
-       }
-    },
-    "endTime": "2019-04-03T23:06:03.176817Z",
-    "createTime": "2019-04-03T22:02:28.394159Z"
-}
diff --git a/src/testplans/cmd/test_plan_generator/sample/gen_test_plan_input.json b/src/testplans/cmd/test_plan_generator/sample/gen_test_plan_input.json
deleted file mode 100644
index 1f87681..0000000
--- a/src/testplans/cmd/test_plan_generator/sample/gen_test_plan_input.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-	"chromiumos_checkout_root": "REPLACE_WITH_PATH_TO_YOUR_CHROMIUMOS_REPO",
-	"buildbucket_protos": [
-		{
-			"serialized_proto": "COCE3arp6YfgexInCghjaHJvbWVvcxIKcG9zdHN1Ym1pdBoPd29sZi1wb3N0c3VibWl0GJgBIj11c2VyOmNocm9tZW9zLXBvc3RzdWJtaXRAY2hyb21lb3MtYm90LmlhbS5nc2VydmljZWFjY291bnQuY29tMgwI9NqU5QUQmMf5uwE6DAiO25TlBRCIlLujAUILCNv4lOUFEOiGqFRKDAjb+JTlBRDA34yZA2AMerICCrABCi4KCCRraXRjaGVuEiIqIAoOCghkZXZzaGVsbBICIAAKDgoIZ2l0X2F1dGgSAiAAChgKC2J1aWxkbnVtYmVyEgkRAAAAAAAAcEAKIAoLYnVpbGRlcm5hbWUSERoPd29sZi1wb3N0c3VibWl0CkIKFiRyZWNpcGVfZW5naW5lL3J1bnRpbWUSKComChUKD2lzX2V4cGVyaW1lbnRhbBICIAAKDQoHaXNfbHVjaRICIAESfQogY2hyb21lLWludGVybmFsLmdvb2dsZXNvdXJjZS5jb20SGmNocm9tZW9zL21hbmlmZXN0LWludGVybmFsGihhNjI2ODJhYjMyNzhlOTk0ZjUxMzE3YTQyYjk5ZDY0MDlkMmNiMWFkIhNyZWZzL2hlYWRzL3NuYXBzaG90ggF/Cn0KIgoMYnVpbGRfdGFyZ2V0EhIqEAoOCgRuYW1lEgYaBHdvbGYKVwoJYXJ0aWZhY3RzEkoqSAokCglnc19idWNrZXQSFxoVZ3M6Ly9zb21lLWJ1Y2tldC1uYW1lCiAKB2dzX3BhdGgSFRoTd29sZi1kdW1teS9SMS0wLjAuMA=="
-		},
-		{
-			"serialized_proto": "COCE3arp6YfgexInCghjaHJvbWVvcxIKcG9zdHN1Ym1pdBoPcmVlZi1wb3N0c3VibWl0GJgBIjJ1c2VyOmNocm9tZW9zQGNocm9tZW9zLWJvdC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbTIMCPTalOUFEJjH+bsBOgwIjtuU5QUQiJS7owFCCwjb+JTlBRDohqhUSgwI2/iU5QUQwN+MmQNgDHqLAgqtAQpCChYkcmVjaXBlX2VuZ2luZS9ydW50aW1lEigqJgoNCgdpc19sdWNpEgIgAQoVCg9pc19leHBlcmltZW50YWwSAiAACi4KCCRraXRjaGVuEiIqIAoOCghkZXZzaGVsbBICIAAKDgoIZ2l0X2F1dGgSAiAAChgKC2J1aWxkbnVtYmVyEgkRAAAAAAAAcEAKHQoLYnVpbGRlcm5hbWUSDhoMcmVlZi1wYWxhZGluGigKIGNocm9taXVtLXJldmlldy5nb29nbGVzb3VyY2UuY29tGLDCVCABGi8KJ2Nocm9tZS1pbnRlcm5hbC1yZXZpZXcuZ29vZ2xlc291cmNlLmNvbRjat0EgAYIBfwp9CiIKDGJ1aWxkX3RhcmdldBISKhAKDgoEbmFtZRIGGgRyZWVmClcKCWFydGlmYWN0cxJKKkgKJAoJZ3NfYnVja2V0EhcaFWdzOi8vc29tZS1idWNrZXQtbmFtZQogCgdnc19wYXRoEhUaE3JlZWYtZHVtbXkvUjEtMC4wLjA="
-		}
-	]
-}
diff --git a/src/testplans/contrib/README.md b/src/testplans/contrib/README.md
deleted file mode 100644
index 43ff3a0..0000000
--- a/src/testplans/contrib/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-# testplans contrib
-
-This directory contains code that is occasionally useful, but is unsupported and
-probably untested.
diff --git a/src/testplans/contrib/cmd/commit_queue_ini_tool/README.md b/src/testplans/contrib/cmd/commit_queue_ini_tool/README.md
deleted file mode 100644
index 1fb58da..0000000
--- a/src/testplans/contrib/cmd/commit_queue_ini_tool/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# COMMIT-QUEUE.ini tool
-
-This is a tool that finds COMMIT-QUEUE.ini files in your chromiumos repo
-checkout and prints out useful details about them. Modify this program to
-suit your needs.
-
-Usage:
-
-```shell
-go run contrib/cmd/commit_queue_ini_tool/commit_queue_ini_tool.go --root-dir=/path/to/chromiumos/
-```
\ No newline at end of file
diff --git a/src/testplans/contrib/cmd/commit_queue_ini_tool/commit_queue_ini_tool.go b/src/testplans/contrib/cmd/commit_queue_ini_tool/commit_queue_ini_tool.go
deleted file mode 100644
index b2a2dc6..0000000
--- a/src/testplans/contrib/cmd/commit_queue_ini_tool/commit_queue_ini_tool.go
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2019 The Chromium 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 main
-
-import (
-	"flag"
-	"fmt"
-	"github.com/mvo5/goconfigparser"
-	"log"
-	"os"
-	"path"
-	"path/filepath"
-	"strings"
-)
-
-var (
-	rootDir = flag.String("root-dir", "", "Root directory to scan. This should be your chromiumos repo checkout path.")
-)
-
-// mapWrap is a map with a multiline String method.
-type mapWrap map[string]int
-
-func (m mapWrap) String() string {
-	str := ""
-	for k, v := range m {
-		str += fmt.Sprintf("%s: %d\n", k, v)
-	}
-	return str
-}
-
-// getConfigs finds all of the COMMIT-QUEUE.ini files and returns a map of their file paths to their
-// contents.
-func getConfigs() map[string]*goconfigparser.ConfigParser {
-	// Validate --root-dir
-	testDir, err := os.Stat(path.Join(*rootDir, "chromite"))
-	if err != nil || !testDir.IsDir() {
-		log.Fatal("Expected to find a chromite subdirectory of --root-dir. Are you sure that " +
-			"--root-dir points to a chromiumos repo checkout?")
-	}
-	values := make(map[string]*goconfigparser.ConfigParser)
-	err = filepath.Walk(*rootDir, func(path string, f os.FileInfo, err error) error {
-		if err != nil {
-			return err
-		}
-		if f.IsDir() && f.Name() == "chroot" {
-			return filepath.SkipDir
-		}
-		if f.Name() != "COMMIT-QUEUE.ini" {
-			return nil
-		}
-		relPath := strings.TrimPrefix(strings.TrimPrefix(path, *rootDir), "/")
-		fmt.Println(relPath)
-		cfg := goconfigparser.New()
-		if err := cfg.ReadFile(path); err != nil {
-			return err
-		}
-		values[relPath] = cfg
-		for _, sec := range cfg.Sections() {
-			options, err := cfg.Options(sec)
-			if err != nil {
-				return err
-			}
-			for _, opt := range options {
-				val, err := cfg.Get(sec, opt)
-				if err != nil {
-					return err
-				}
-				fmt.Printf("%s: %s: %s\n", sec, opt, val)
-			}
-		}
-		fmt.Println()
-		return nil
-	})
-	if err != nil {
-		log.Fatal(err)
-	}
-	return values
-}
-
-func main() {
-	flag.Parse()
-	cfgs := getConfigs()
-	optionCounts := make(map[string]int)
-	valueCounts := make(map[string]int)
-	for _, cfg := range cfgs {
-		for _, sec := range cfg.Sections() {
-			opts, err := cfg.Options(sec)
-			if err != nil {
-				log.Fatal(err)
-			}
-			for _, opt := range opts {
-				optionCounts[fmt.Sprintf("%s: %s", sec, opt)]++
-				val, err := cfg.Get(sec, opt)
-				if err != nil {
-					log.Fatal(err)
-				}
-				valueCounts[fmt.Sprintf("%s: %s: %s", sec, opt, val)]++
-			}
-		}
-	}
-	fmt.Printf("OptionCounts:\n\n%v\n\n", mapWrap(optionCounts))
-	fmt.Printf("ValueCounts:\n\n%v\n\n", mapWrap(valueCounts))
-}
diff --git a/src/testplans/contrib/cmd/config_dump_json_parser/README.md b/src/testplans/contrib/cmd/config_dump_json_parser/README.md
deleted file mode 100644
index 182949a..0000000
--- a/src/testplans/contrib/cmd/config_dump_json_parser/README.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Config dump JSON parser
-
-This is a dev-only tool for parsing test-related data out of a fully-expanded Chrome OS
-`config_dump.json`.
-
-## Usage
-
-This assumes you have a Chromium OS repo checkout at ~/chromiumos.
-
-Firstly, create a fully expanded config_dump.json:
-
-```shell
-mkdir ${HOME}/tmp
-${HOME}/chromiumos/chromite/bin/cbuildbot_view_config --full > ${HOME}/tmp/config_dump.json
-```
-
-Now run the script:
-
-```shell
-go run contrib/cmd/config_dump_json_parser/main.go --config_dump_json_path=${HOME}/tmp/config_dump.json
-```
diff --git a/src/testplans/contrib/cmd/config_dump_json_parser/main.go b/src/testplans/contrib/cmd/config_dump_json_parser/main.go
deleted file mode 100644
index 214680d..0000000
--- a/src/testplans/contrib/cmd/config_dump_json_parser/main.go
+++ /dev/null
@@ -1,199 +0,0 @@
-// Copyright 2019 The Chromium 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 main
-
-import (
-	"encoding/json"
-	"flag"
-	"fmt"
-	"io/ioutil"
-	"log"
-	"sort"
-	"strings"
-)
-
-var (
-	configDumpJsonPath = flag.String("config_dump_json_path", "", "Path to fully expanded config_dump.json")
-)
-
-// A renamed []string for the purpose of having a custom String() method.
-type SSlice []string
-
-func (strings SSlice) String() string {
-	str := "["
-	for _, s := range strings {
-		str += fmt.Sprintf("\n    %s,", s)
-	}
-	str += "\n  ]"
-	return str
-}
-
-type TestSuites struct {
-	gceTestSuites    []string
-	hwTestSuites     []string
-	moblabTestSuites []string
-	tastVmTestSuites []string
-	vmTestSuites     []string
-}
-
-func mergeDedupeSortSlice(s1 []string, s2 []string) []string {
-	if s1 == nil && s2 == nil {
-		return nil
-	}
-	allStrings := make(map[string]bool)
-	for _, s := range s1 {
-		allStrings[s] = true
-	}
-	for _, s := range s2 {
-		allStrings[s] = true
-	}
-	result := make([]string, 0)
-	for k := range allStrings {
-		result = append(result, k)
-	}
-	sort.Strings(result)
-	return result
-}
-
-func (ts1 *TestSuites) merge(ts2 *TestSuites) {
-	ts1.gceTestSuites = mergeDedupeSortSlice(ts1.gceTestSuites, ts2.gceTestSuites)
-	ts1.hwTestSuites = mergeDedupeSortSlice(ts1.hwTestSuites, ts2.hwTestSuites)
-	ts1.moblabTestSuites = mergeDedupeSortSlice(ts1.moblabTestSuites, ts2.moblabTestSuites)
-	ts1.tastVmTestSuites = mergeDedupeSortSlice(ts1.tastVmTestSuites, ts2.tastVmTestSuites)
-	ts1.vmTestSuites = mergeDedupeSortSlice(ts1.vmTestSuites, ts2.vmTestSuites)
-}
-
-func (ts TestSuites) notEmpty() bool {
-	return ts.gceTestSuites != nil ||
-		ts.hwTestSuites != nil ||
-		ts.moblabTestSuites != nil ||
-		ts.tastVmTestSuites != nil ||
-		ts.vmTestSuites != nil
-}
-
-func (ts TestSuites) String() string {
-	str := ""
-	if ts.gceTestSuites != nil {
-		str += fmt.Sprintf("  gce_tests: %v\n", SSlice(ts.gceTestSuites))
-	}
-	if ts.hwTestSuites != nil {
-		str += fmt.Sprintf("  hw_tests: %v\n", SSlice(ts.hwTestSuites))
-	}
-	if ts.moblabTestSuites != nil {
-		str += fmt.Sprintf("  moblab_tests: %v\n", SSlice(ts.moblabTestSuites))
-	}
-	if ts.tastVmTestSuites != nil {
-		str += fmt.Sprintf("  tast_vm_tests: %v\n", SSlice(ts.tastVmTestSuites))
-	}
-	if ts.vmTestSuites != nil {
-		str += fmt.Sprintf("  vm_tests: %v\n", SSlice(ts.vmTestSuites))
-	}
-	return str
-}
-
-func print(suitesByBuilder map[string]TestSuites) {
-	builderNames := make([]string, 0)
-	for builderName := range suitesByBuilder {
-		builderNames = append(builderNames, builderName)
-	}
-	sort.Strings(builderNames)
-
-	for _, v := range builderNames {
-		if suitesByBuilder[v].notEmpty() {
-			fmt.Printf("%s\n%v\n", v, suitesByBuilder[v])
-		}
-	}
-}
-
-func main() {
-	flag.Parse()
-	// Read the SourceTreeConfig JSON file into a proto.
-	configDumpJsonBytes, err := ioutil.ReadFile(*configDumpJsonPath)
-	if err != nil {
-		log.Fatalf("Failed reading config_dump_json_path\n%v", err)
-	}
-
-	var topLevelDat map[string]interface{}
-	if err = json.Unmarshal(configDumpJsonBytes, &topLevelDat); err != nil {
-		log.Fatal(err)
-	}
-	testSuitesByBuilder := make(map[string]TestSuites)
-
-	for builderName, dataForBuilder := range topLevelDat {
-		if strings.HasSuffix(builderName, "-paladin") {
-			builderNameWithoutSuffix := strings.TrimSuffix(builderName, "-paladin")
-			testSuites := &TestSuites{}
-			builderValues := dataForBuilder.(map[string]interface{})
-			for fieldKey, fieldValue := range builderValues {
-				switch fieldKey {
-				case "hw_tests":
-					tests := fieldValue.([]interface{})
-					for _, testJson := range tests {
-						var testDat map[string]interface{}
-						if err = json.Unmarshal([]byte(testJson.(string)), &testDat); err != nil {
-							log.Fatal(err)
-						}
-						if testDat != nil && testDat["suite"] != "provision" {
-							testSuites.hwTestSuites = append(testSuites.hwTestSuites, testDat["suite"].(string))
-						}
-					}
-				case "vm_tests":
-					tests := fieldValue.([]interface{})
-					for _, testJson := range tests {
-						var testDat map[string]interface{}
-						if err = json.Unmarshal([]byte(testJson.(string)), &testDat); err != nil {
-							log.Fatal(err)
-						}
-						if testDat != nil {
-							testSuites.vmTestSuites = append(testSuites.vmTestSuites, testDat["test_suite"].(string))
-						}
-					}
-				case "gce_tests":
-					tests := fieldValue.([]interface{})
-					for _, testJson := range tests {
-						var testDat map[string]interface{}
-						if err = json.Unmarshal([]byte(testJson.(string)), &testDat); err != nil {
-							log.Fatal(err)
-						}
-						if testDat != nil {
-							testSuites.gceTestSuites = append(testSuites.gceTestSuites, testDat["test_suite"].(string))
-						}
-					}
-				case "moblab_vm_tests":
-					tests := fieldValue.([]interface{})
-					for _, testJson := range tests {
-
-						var testDat map[string]interface{}
-						if err = json.Unmarshal([]byte(testJson.(string)), &testDat); err != nil {
-							log.Fatal(err)
-						}
-						if testDat != nil {
-							testSuites.moblabTestSuites = append(testSuites.moblabTestSuites, testDat["test_type"].(string))
-						}
-					}
-				case "tast_vm_tests":
-					tests := fieldValue.([]interface{})
-					for _, testJson := range tests {
-
-						var testDat map[string]interface{}
-						if err = json.Unmarshal([]byte(testJson.(string)), &testDat); err != nil {
-							log.Fatal(err)
-						}
-						if testDat != nil {
-							testSuites.tastVmTestSuites = append(testSuites.tastVmTestSuites, testDat["suite_name"].(string))
-						}
-					}
-				default:
-					// Do nothing
-				}
-			}
-			testSuitesByBuilder[builderNameWithoutSuffix] = *testSuites
-		}
-	}
-
-	log.Print("\n\n\n")
-	log.Printf("Test suites by builder:")
-
-	print(testSuitesByBuilder)
-}
diff --git a/src/testplans/go.mod b/src/testplans/go.mod
deleted file mode 100644
index 1449a9c..0000000
--- a/src/testplans/go.mod
+++ /dev/null
@@ -1,25 +0,0 @@
-module testplans
-
-go 1.12
-
-require (
-	cloud.google.com/go v0.37.2 // indirect
-	github.com/bmatcuk/doublestar v1.1.1
-	github.com/golang/mock v1.2.0
-	github.com/golang/protobuf v1.3.1
-	github.com/google/go-cmp v0.2.0
-	github.com/kr/pretty v0.1.0 // indirect
-	github.com/maruel/subcommands v0.0.0-20181220013616-967e945be48b
-	github.com/maruel/ut v1.0.0 // indirect
-	github.com/mitchellh/go-homedir v1.1.0 // indirect
-	github.com/mvo5/goconfigparser v0.0.0-20190308092147-6a365a5a3f41
-	github.com/smartystreets/assertions v0.0.0-20190401211740-f487f9de1cd3 // indirect
-	github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a // indirect
-	github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e // indirect
-	go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190620221159-9206f8f25ade
-	go.chromium.org/luci v0.0.0-20190404171609-14fb4fbce8ea
-	golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a // indirect
-	google.golang.org/grpc v1.19.1 // indirect
-	gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
-	gopkg.in/yaml.v2 v2.2.2 // indirect
-)
diff --git a/src/testplans/go.sum b/src/testplans/go.sum
deleted file mode 100644
index cb2ccc5..0000000
--- a/src/testplans/go.sum
+++ /dev/null
@@ -1,258 +0,0 @@
-cloud.google.com/go v0.26.0 h1:e0WKqKTd5BnrG8aKH3J3h+QvEIQtSUcf2n5UZ5ZgLtQ=
-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg=
-cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.37.2 h1:4y4L7BdHenTfZL0HervofNTHh9Ad6mNX72cQvl+5eH0=
-cloud.google.com/go v0.37.2/go.mod h1:H8IAquKe2L30IxoupDgqTaQvKSwF/c8prYHynGIWQbA=
-git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
-git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
-github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
-github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
-github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
-github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
-github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
-github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
-github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ=
-github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w=
-github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g=
-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
-github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
-github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
-github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
-github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
-github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
-github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk=
-github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
-github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
-github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
-github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
-github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
-github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
-github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
-github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
-github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
-github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
-github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
-github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
-github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo=
-github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
-github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU=
-github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
-github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
-github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
-github.com/julienschmidt/httprouter v1.2.0 h1:TDTW5Yz1mjftljbcKqRcrYhd4XeOoI98t+9HbQbYf7g=
-github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
-github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
-github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
-github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
-github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-github.com/maruel/subcommands v0.0.0-20181220013616-967e945be48b h1:TMHxe8LaGdbpx9XSr14PPDWI4hmoeqOWgYct5HYotv0=
-github.com/maruel/subcommands v0.0.0-20181220013616-967e945be48b/go.mod h1:4cd1CVd4c9phb1z9fTkV+JbmnFm394Hp9rHEAOvD+vs=
-github.com/maruel/ut v1.0.0 h1:Tg5f5waOijrohsOwnMlr1bZmv+wHEbuMEacNBE8kQ7k=
-github.com/maruel/ut v1.0.0/go.mod h1:I68ffiAt5qre9obEVTy7S2/fj2dJku2NYLvzPuY0gqE=
-github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
-github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
-github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mvo5/goconfigparser v0.0.0-20190308092147-6a365a5a3f41 h1:iMRDid83mu+x4BeVAauhgs3EEkkvJvIUr6ZlW6etFNU=
-github.com/mvo5/goconfigparser v0.0.0-20190308092147-6a365a5a3f41/go.mod h1:xmt4k1xLDl8Tdan+0S/jmMK2uSUBSzTc18+5GN5Vea8=
-github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
-github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
-github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
-github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
-github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
-github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
-github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
-github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
-github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
-github.com/smartystreets/assertions v0.0.0-20190401211740-f487f9de1cd3 h1:hBSHahWMEgzwRyS6dRpxY0XyjZsHyQ61s084wo5PJe0=
-github.com/smartystreets/assertions v0.0.0-20190401211740-f487f9de1cd3/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
-github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs=
-github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
-github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
-github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e h1:T5PdfK/M1xyrHwynxMIVMWLS7f/qHwfslZphxtGnw7s=
-github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g=
-go.chromium.org/chromiumos/infra/proto v0.0.0-20190514195506-9aeeb525f8a2 h1:gljjPuw1pRc2lK9PLb6VvGvXgNDOuKCEmHnKlhxHUcg=
-go.chromium.org/chromiumos/infra/proto v0.0.0-20190514223940-f962e75b3f92 h1:qLY0UEyKr26Er3Ilv+7RuRgj5SGWtChdLFztrOxjB6g=
-go.chromium.org/chromiumos/infra/proto v0.0.0-20190514225112-82c9d54cbe67 h1:oF/0U7DfnhRgov+m3xk3u8KC9yrjuKP+VTZ0CWkOOkw=
-go.chromium.org/chromiumos/infra/proto v0.0.0-20190516043545-0b3cc740c3cb h1:sjs4greMgtc8PqFEqVvKMSnDiDivuFq0RGyeZuaSWRs=
-go.chromium.org/chromiumos/infra/proto v0.0.0-20190520172542-d9e913a6bb57 h1:1sfiP18mVudY0UVe3gy9QGrGzbhrV9xRJsKs8XbXzLM=
-go.chromium.org/chromiumos/infra/proto v0.0.0-20190520210153-eaa85965508f h1:xBbcyYVlKvWqWs5uOHz6QMKTp6kumnrGRPWFzwAXjyk=
-go.chromium.org/chromiumos/infra/proto v0.0.0-20190521155230-020e6e4c3db7 h1:NfZmFRahNWbucJxPu590Uango4DhkZf+/sghHrboRAo=
-go.chromium.org/chromiumos/infra/proto v0.0.0-20190522220408-28d21b420351 h1:KNLtgp0J88Hncy7GXvYUec8VVarBWQmkiG1yVJqiMcc=
-go.chromium.org/chromiumos/infra/proto v0.0.0-20190523171533-39bf919eecb4 h1:MbjVVWG/KH+oEO3Vb1/ru10VbrnYHwbpyRNJsi1lFpo=
-go.chromium.org/chromiumos/infra/proto v0.0.0-20190620221159-9206f8f25ade h1:Ryr72FOi62Wa6HXtykgbNyp3yA+tXmRRSCSHOw4ALhY=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190506153826-232eeaaa29a9 h1:87ML72wybRl6dKe4qyvTH5Y6ihvrTxT13+xTsz7F6tE=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190506153826-232eeaaa29a9/go.mod h1:Y1AiM5bpNKKecKy3wgiBwF9q1PJ/f57z86DpkNrMehk=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190514195506-9aeeb525f8a2 h1:kAJWnYFu1Vvk3RdZLKz9rDDBsi4m8WPDXv7r9plSEaY=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190514195506-9aeeb525f8a2/go.mod h1:Y1AiM5bpNKKecKy3wgiBwF9q1PJ/f57z86DpkNrMehk=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190514223940-f962e75b3f92 h1:Ne3yU/li76ojZl+yR82ZKbVubPVigF8ybZydSe5/qjw=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190514223940-f962e75b3f92/go.mod h1:Y1AiM5bpNKKecKy3wgiBwF9q1PJ/f57z86DpkNrMehk=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190514225112-82c9d54cbe67 h1:gTOb9jvLQwIgx+fRhTV1TIUwWoB5SMBdvsZG+0R6/oA=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190514225112-82c9d54cbe67/go.mod h1:Y1AiM5bpNKKecKy3wgiBwF9q1PJ/f57z86DpkNrMehk=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190516043545-0b3cc740c3cb h1:4D0aQ9N/vMdx7Z09a8IZ0UQW4y6Nku1PJAdNnbhDh5s=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190516043545-0b3cc740c3cb/go.mod h1:Y1AiM5bpNKKecKy3wgiBwF9q1PJ/f57z86DpkNrMehk=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190520172542-d9e913a6bb57 h1:sG2XEZYmCDPY7uEZqhH9zoTrztLOHnlbcfxE7YBXtOw=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190520172542-d9e913a6bb57/go.mod h1:Y1AiM5bpNKKecKy3wgiBwF9q1PJ/f57z86DpkNrMehk=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190520210153-eaa85965508f h1:SfCHrwyeeVqtCm7JAO3cs4EpVMqB7P2a5T4PTAFDzpY=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190520210153-eaa85965508f/go.mod h1:Y1AiM5bpNKKecKy3wgiBwF9q1PJ/f57z86DpkNrMehk=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190521155230-020e6e4c3db7 h1:VQQ8Fz7kSntRr946WJXACPbk6D8nrFx3WKLYG33Ad9I=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190521155230-020e6e4c3db7/go.mod h1:Y1AiM5bpNKKecKy3wgiBwF9q1PJ/f57z86DpkNrMehk=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190522220408-28d21b420351 h1:nS7VP7DapIdYWXFQp939OixRj2q1Q1O/7JTtqMh743o=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190522220408-28d21b420351/go.mod h1:Y1AiM5bpNKKecKy3wgiBwF9q1PJ/f57z86DpkNrMehk=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190523171533-39bf919eecb4 h1:WLlJOjc1h7tWmpiaB/fZsf9a12fcj1NstLJjbX7soM0=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190523171533-39bf919eecb4/go.mod h1:Y1AiM5bpNKKecKy3wgiBwF9q1PJ/f57z86DpkNrMehk=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190620221159-9206f8f25ade h1:nEbrOlXy2f7gxNceKIdRj+epA1DsydTERwGiW5llzjM=
-go.chromium.org/chromiumos/infra/proto/go v0.0.0-20190620221159-9206f8f25ade/go.mod h1:Y1AiM5bpNKKecKy3wgiBwF9q1PJ/f57z86DpkNrMehk=
-go.chromium.org/luci v0.0.0-20190404171609-14fb4fbce8ea h1:qf3Ri7sv3yJPL4E0iq4hBYn3AFSf2dNNJpuZDBXAT2E=
-go.chromium.org/luci v0.0.0-20190404171609-14fb4fbce8ea/go.mod h1:MIQewVTLvOvc0UioV0JNqTNO/RspKFS0XEeoKrOxsdM=
-go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
-go.opencensus.io v0.19.1/go.mod h1:gug0GbSHa8Pafr0d2urOSgoXHZ6x/RUlaiT0d9pqb4A=
-go.opencensus.io v0.19.2/go.mod h1:NO/8qkisMZLZ1FCsKNqtJPwc8/TaclWyY0B6wcYNg9M=
-go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
-golang.org/x/build v0.0.0-20190314133821-5284462c4bec/go.mod h1:atTaCNAy0f16Ah5aV1gMSwgiKVHwu/JncqDpuRr7lS4=
-golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA=
-golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI=
-golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a h1:tImsplftrFpALCYumobsd0K86vlAs/eXGFms2txfJfA=
-golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
-golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
-golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI=
-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522 h1:Ve1ORMCxvRmSXBwJK+t3Oy+V2vRW2OetUQBq4rJIkZE=
-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181218192612-074acd46bca6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 h1:z99zHgr7hKfrUcX/KsoJk5FJfjTceCKIp96+biqP4To=
-golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20181219222714-6e267b5cc78e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
-golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
-google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
-google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
-google.golang.org/api v0.2.0/go.mod h1:IfRCZScioGtypHNTlz3gFk67J8uePVW7uDTBzXuIkhU=
-google.golang.org/api v0.3.0 h1:UIJY20OEo3+tK5MBlcdx37kmdH6EnRjGkW78mc6+EeA=
-google.golang.org/api v0.3.0/go.mod h1:IuvZyQh8jgscv8qWfQ4ABd8m7hEudgBFM/EdhA3BnXw=
-google.golang.org/appengine v1.1.0 h1:igQkv0AAhEIvTEpD5LIpAfav2eeVO9HBTjvKHVJPRSs=
-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20180831171423-11092d34479b h1:lohp5blsw53GBXtLyLNaTXPXS9pJ1tiTw61ZHUoE9Qw=
-google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20181219182458-5a97ab628bfb/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
-google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19 h1:Lj2SnHtxkRGJDqnGaSjo+CCdIieEnwVazbOXILwQemk=
-google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
-google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
-google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.19.1 h1:TrBcJ1yqAl1G++wO39nD/qtgpsW9/1+QGrluyMGEYgM=
-google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
-gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
-gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o=
-honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
diff --git a/src/testplans/internal/generator/generator.go b/src/testplans/internal/generator/generator.go
deleted file mode 100644
index 999f9d4..0000000
--- a/src/testplans/internal/generator/generator.go
+++ /dev/null
@@ -1,288 +0,0 @@
-// Copyright 2019 The Chromium 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 generator
-
-import (
-	"errors"
-	"fmt"
-	"github.com/golang/protobuf/ptypes/wrappers"
-	"go.chromium.org/chromiumos/infra/proto/go/chromiumos"
-	"go.chromium.org/chromiumos/infra/proto/go/testplans"
-	bbproto "go.chromium.org/luci/buildbucket/proto"
-	"log"
-	"testplans/internal/git"
-)
-
-// BuildTarget is an OS build target, such as "kevin" or "eve".
-type BuildTarget string
-
-// targetBuildResult is a conglomeration of data about a build and how to test it.
-type targetBuildResult struct {
-	buildTarget       BuildTarget
-	buildReport       bbproto.Build
-	perTargetTestReqs testplans.PerTargetTestRequirements
-}
-
-// CreateTestPlan generates the test plan that must be run as part of a Chrome OS build.
-func CreateTestPlan(
-	targetTestReqs *testplans.TargetTestRequirementsCfg,
-	sourceTreeCfg *testplans.SourceTreeTestCfg,
-	unfilteredBbBuilds []*bbproto.Build,
-	changeRevs *git.ChangeRevData,
-	repoToSrcRoot map[string]string) (*testplans.GenerateTestPlanResponse, error) {
-	testPlan := &testplans.GenerateTestPlanResponse{}
-
-	btBuildReports := make(map[BuildTarget]bbproto.Build)
-	// Filter out special builds like "chromite-cq" that don't have build targets.
-	filteredBbBuilds := make([]*bbproto.Build, 0)
-	for _, bb := range unfilteredBbBuilds {
-		bt := getBuildTarget(bb)
-		if len(bt) == 0 {
-			log.Printf("filtering out build without a build target: %s", bb.GetBuilder().GetBuilder())
-		} else if isPointlessBuild(bb) {
-			log.Printf("filtering out because marked as pointless: %s", bb.GetBuilder().GetBuilder())
-		} else if !hasTestArtifacts(bb) {
-			log.Printf("filtering out with missing test artifacts: %s", bb.GetBuilder().GetBuilder())
-		} else {
-			btBuildReports[BuildTarget(bt)] = *bb
-			filteredBbBuilds = append(filteredBbBuilds, bb)
-		}
-	}
-
-	// Get the GerritChanges from any of the filtered builds, since the list
-	// should be the same for all of them.
-	changes := make([]*bbproto.GerritChange, 0)
-	if len(filteredBbBuilds) > 0 {
-		changes = append(changes, filteredBbBuilds[0].Input.GerritChanges...)
-	}
-
-	// For those changes, what pruning optimizations can be done?
-	pruneResult, err := extractPruneResult(sourceTreeCfg, changes, changeRevs, repoToSrcRoot)
-	if err != nil {
-		return testPlan, err
-	}
-
-	// List of builds that will actually be tested, e.g. one per build target.
-	targetBuildResults := make([]targetBuildResult, 0)
-perTargetTestReq:
-	for _, pttr := range targetTestReqs.PerTargetTestRequirements {
-		tbr, err := selectBuildForRequirements(pttr, btBuildReports)
-		if err != nil {
-			return testPlan, err
-		}
-		if tbr == nil {
-			// Occurs when there are no affected builds for this TargetTestRequirement.
-			continue perTargetTestReq
-		}
-		targetBuildResults = append(targetBuildResults, *tbr)
-	}
-
-	return createResponse(targetBuildResults, pruneResult)
-}
-
-func isPointlessBuild(bb *bbproto.Build) bool {
-	pointlessBuild, ok := bb.GetOutput().GetProperties().GetFields()["pointless_build"]
-	return ok && pointlessBuild.GetBoolValue()
-}
-
-func hasTestArtifacts(b *bbproto.Build) bool {
-	art, ok := b.GetOutput().GetProperties().GetFields()["artifacts"]
-	if !ok {
-		return false
-	}
-	fba, ok := art.GetStructValue().GetFields()["files_by_artifact"]
-	if !ok {
-		return false
-	}
-
-	// The presence of any one of these artifacts is enough to tell us that this
-	// build should be considered for testing.
-	testArtifacts := []string{
-		"AUTOTEST_FILES",
-		"IMAGE_ZIP",
-		"PINNED_GUEST_IMAGES",
-		"TAST_FILES",
-		"TEST_UPDATE_PAYLOAD",
-	}
-	fileToArtifact := fba.GetStructValue().GetFields()
-	for _, ta := range testArtifacts {
-		if _, ok := fileToArtifact[ta]; ok {
-			return true
-		}
-	}
-	return false
-}
-
-// getBuildTarget returns the build target from the given build, or empty string if none is found.
-func getBuildTarget(bb *bbproto.Build) string {
-	btStruct, ok := bb.Output.Properties.Fields["build_target"]
-	if !ok {
-		return ""
-	}
-	bt, ok := btStruct.GetStructValue().Fields["name"]
-	if !ok {
-		return ""
-	}
-	return bt.GetStringValue()
-}
-
-// createResponse creates the final GenerateTestPlanResponse.
-func createResponse(
-	targetBuildResults []targetBuildResult,
-	pruneResult *testPruneResult) (*testplans.GenerateTestPlanResponse, error) {
-
-	resp := &testplans.GenerateTestPlanResponse{}
-targetLoop:
-	for _, tbr := range targetBuildResults {
-		art, ok := tbr.buildReport.Output.Properties.Fields["artifacts"]
-		if !ok {
-			return nil, fmt.Errorf("found no artifacts output property for build_target %s", tbr.buildTarget)
-		}
-		gsBucket, ok := art.GetStructValue().Fields["gs_bucket"]
-		if !ok {
-			return nil, fmt.Errorf("found no artifacts.gs_bucket property for build_target %s", tbr.buildTarget)
-		}
-		gsPath, ok := art.GetStructValue().Fields["gs_path"]
-		if !ok {
-			return nil, fmt.Errorf("found no artifacts.gs_path property for build_target %s", tbr.buildTarget)
-		}
-		bp := &testplans.BuildPayload{
-			ArtifactsGsBucket: gsBucket.GetStringValue(),
-			ArtifactsGsPath:   gsPath.GetStringValue(),
-		}
-		pttr := tbr.perTargetTestReqs
-		bt := chromiumos.BuildTarget{Name: string(tbr.buildTarget)}
-		tuc := &testplans.TestUnitCommon{BuildTarget: &bt, BuildPayload: bp}
-		isCritical := tbr.buildReport.Critical != bbproto.Trinary_NO
-		if !isCritical {
-			log.Printf("Build target %s is not critical. Skipping...", tbr.buildTarget)
-			continue targetLoop
-		}
-		critical := &wrappers.BoolValue{Value: isCritical}
-		if pttr.GceTestCfg != nil {
-			for _, gce := range pttr.GceTestCfg.GceTest {
-				gce.Common = withCritical(gce.Common, critical)
-			}
-			resp.GceTestUnits = append(resp.GceTestUnits, &testplans.GceTestUnit{
-				Common:     tuc,
-				GceTestCfg: pttr.GceTestCfg})
-		}
-		if pttr.HwTestCfg != nil {
-			if pruneResult.disableHWTests {
-				log.Printf("No HW testing needed for %s", tbr.buildTarget)
-			} else if pruneResult.canSkipForOnlyTestRule(tbr.buildTarget) {
-				log.Printf("Using OnlyTest rule to skip HW testing for %s", tbr.buildTarget)
-			} else {
-				for _, hw := range pttr.HwTestCfg.HwTest {
-					hw.Common = withCritical(hw.Common, critical)
-				}
-				resp.HwTestUnits = append(resp.HwTestUnits, &testplans.HwTestUnit{
-					Common:    tuc,
-					HwTestCfg: pttr.HwTestCfg})
-			}
-		}
-		if pttr.MoblabVmTestCfg != nil {
-			for _, moblab := range pttr.MoblabVmTestCfg.MoblabTest {
-				moblab.Common = withCritical(moblab.Common, critical)
-			}
-			resp.MoblabVmTestUnits = append(resp.MoblabVmTestUnits, &testplans.MoblabVmTestUnit{
-				Common:          tuc,
-				MoblabVmTestCfg: pttr.MoblabVmTestCfg})
-		}
-		if pttr.TastVmTestCfg != nil {
-			for _, tastVm := range pttr.TastVmTestCfg.TastVmTest {
-				tastVm.Common = withCritical(tastVm.Common, critical)
-			}
-			resp.TastVmTestUnits = append(resp.TastVmTestUnits, &testplans.TastVmTestUnit{
-				Common:        tuc,
-				TastVmTestCfg: pttr.TastVmTestCfg})
-		}
-		if pttr.VmTestCfg != nil {
-			if pruneResult.disableVMTests {
-				log.Printf("No VM testing needed for %s", tbr.buildTarget)
-			} else {
-				for _, vm := range pttr.VmTestCfg.VmTest {
-					vm.Common = withCritical(vm.Common, critical)
-				}
-				resp.VmTestUnits = append(resp.VmTestUnits, &testplans.VmTestUnit{
-					Common:    tuc,
-					VmTestCfg: pttr.VmTestCfg})
-			}
-		}
-	}
-	return resp, nil
-}
-
-func withCritical(tsc *testplans.TestSuiteCommon, critical *wrappers.BoolValue) *testplans.TestSuiteCommon {
-	if tsc == nil {
-		tsc = &testplans.TestSuiteCommon{}
-	}
-	tsc.Critical = critical
-	if !critical.Value {
-		log.Printf("Marking %s as not critical", tsc.DisplayName)
-	}
-	return tsc
-}
-
-// selectBuildForRequirements finds a build that best matches the provided PerTargetTestRequirements.
-// e.g. if the requirements want a build for a reef build target, this method will find a successful,
-// non-early-terminated build.
-func selectBuildForRequirements(
-	pttr *testplans.PerTargetTestRequirements,
-	buildReports map[BuildTarget]bbproto.Build) (*targetBuildResult, error) {
-
-	log.Printf("Considering testing for TargetCritera %v", pttr.TargetCriteria)
-	var eligibleBuildTargets []BuildTarget
-	if pttr.TargetCriteria.GetBuildTarget() == "" {
-		return nil, errors.New("found a PerTargetTestRequirement without a build target")
-	}
-	eligibleBuildTargets = []BuildTarget{BuildTarget(pttr.TargetCriteria.GetBuildTarget())}
-	bt, err := pickBuilderToTest(eligibleBuildTargets, buildReports)
-	if err != nil {
-		// Expected when a necessary builder failed, and thus we cannot continue with testing.
-		return nil, err
-	}
-	if bt == nil {
-		// There are no builds for these test criteria, so this PerTargetTestRequirement is
-		// irrelevant. Continue on to the next one.
-		// This happens when no build was relevant due to an EarlyTerminationStatus.
-		return nil, nil
-	}
-	br := buildReports[*bt]
-	return &targetBuildResult{
-			buildReport:       br,
-			buildTarget:       BuildTarget(getBuildTarget(&br)),
-			perTargetTestReqs: *pttr},
-		nil
-}
-
-// pickBuilderToTest returns up to one BuildTarget that should be tested, out of the provided slice
-// of BuildTargets. The returned BuildTarget, if present, is guaranteed to be one with a BuildResult.
-func pickBuilderToTest(buildTargets []BuildTarget, btBuildReports map[BuildTarget]bbproto.Build) (*BuildTarget, error) {
-	// Relevant results are those builds that weren't terminated early.
-	// Early termination is a good thing. It just means that the build wasn't affected by the relevant commits.
-	relevantReports := make(map[BuildTarget]bbproto.Build)
-	for _, bt := range buildTargets {
-		br, found := btBuildReports[bt]
-		if !found {
-			log.Printf("No build found for BuildTarget %s", bt)
-			continue
-		}
-		relevantReports[bt] = br
-	}
-	if len(relevantReports) == 0 {
-		// None of the builds were relevant, so none of these BuildTargets needs testing.
-		return nil, nil
-	}
-	for _, bt := range buildTargets {
-		// Find and return the first relevant, successful build.
-		result, found := relevantReports[bt]
-		if found && result.Status == bbproto.Status_SUCCESS {
-			return &bt, nil
-		}
-	}
-	log.Printf("can't test for build target(s) %v because all builders failed\n", buildTargets)
-	return nil, nil
-}
diff --git a/src/testplans/internal/generator/generator_test.go b/src/testplans/internal/generator/generator_test.go
deleted file mode 100644
index b2e4e2b..0000000
--- a/src/testplans/internal/generator/generator_test.go
+++ /dev/null
@@ -1,578 +0,0 @@
-// Copyright 2019 The Chromium 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 generator
-
-import (
-	_struct "github.com/golang/protobuf/ptypes/struct"
-	"github.com/golang/protobuf/ptypes/wrappers"
-	"github.com/google/go-cmp/cmp"
-	"github.com/google/go-cmp/cmp/cmpopts"
-	"go.chromium.org/chromiumos/infra/proto/go/chromiumos"
-	"go.chromium.org/chromiumos/infra/proto/go/testplans"
-	bbproto "go.chromium.org/luci/buildbucket/proto"
-	"testing"
-	"testplans/internal/git"
-)
-
-const (
-	GS_BUCKET      = "gs://chromeos-image-archive"
-	GS_PATH_PREFIX = "gs/path/"
-)
-
-func makeBuildbucketBuild(buildTarget string, status bbproto.Status, changes []*bbproto.GerritChange, critical bool) *bbproto.Build {
-	var criticalVal bbproto.Trinary
-	if critical {
-		criticalVal = bbproto.Trinary_YES
-	} else {
-		criticalVal = bbproto.Trinary_NO
-	}
-	b := &bbproto.Build{
-		Critical: criticalVal,
-		Input:    &bbproto.Build_Input{},
-		Output: &bbproto.Build_Output{
-			Properties: &_struct.Struct{
-				Fields: map[string]*_struct.Value{
-					"build_target": {
-						Kind: &_struct.Value_StructValue{StructValue: &_struct.Struct{
-							Fields: map[string]*_struct.Value{
-								"name": {Kind: &_struct.Value_StringValue{StringValue: buildTarget}},
-							},
-						}},
-					},
-					"artifacts": {
-						Kind: &_struct.Value_StructValue{StructValue: &_struct.Struct{
-							Fields: map[string]*_struct.Value{
-								"gs_bucket": {Kind: &_struct.Value_StringValue{StringValue: GS_BUCKET}},
-								"gs_path":   {Kind: &_struct.Value_StringValue{StringValue: GS_PATH_PREFIX + buildTarget}},
-								"files_by_artifact": {Kind: &_struct.Value_StructValue{StructValue: &_struct.Struct{
-									Fields: map[string]*_struct.Value{
-										"AUTOTEST_FILES": {Kind: &_struct.Value_ListValue{}},
-									},
-								}}},
-							},
-						}},
-					},
-				},
-			},
-		},
-		Status: status,
-	}
-	for _, c := range changes {
-		b.Input.GerritChanges = append(b.Input.GerritChanges, c)
-	}
-	return b
-}
-
-func TestCreateCombinedTestPlan_oneUnitSuccess(t *testing.T) {
-	kevinHWTestCfg := &testplans.HwTestCfg{HwTest: []*testplans.HwTestCfg_HwTest{
-		{
-			Suite:       "HW kevin",
-			SkylabBoard: "kev",
-		},
-	}}
-	testReqs := &testplans.TargetTestRequirementsCfg{
-		PerTargetTestRequirements: []*testplans.PerTargetTestRequirements{
-			{TargetCriteria: &testplans.TargetCriteria{
-				TargetType: &testplans.TargetCriteria_BuildTarget{BuildTarget: "kevin"}},
-				HwTestCfg: kevinHWTestCfg},
-		},
-	}
-	sourceTreeTestCfg := &testplans.SourceTreeTestCfg{
-		SourceTreeTestRestriction: []*testplans.SourceTreeTestRestriction{
-			{SourceTree: &testplans.SourceTree{Path: "hw/tests/not/needed/here"},
-				TestRestriction: &testplans.TestRestriction{DisableHwTests: true}}}}
-	bbBuilds := []*bbproto.Build{
-		makeBuildbucketBuild("kevin", bbproto.Status_SUCCESS, []*bbproto.GerritChange{}, true),
-	}
-	chRevData := git.GetChangeRevsForTest([]*git.ChangeRev{})
-	repoToSrcRoot := map[string]string{"chromiumos/repo/name": "src/to/file"}
-
-	actualTestPlan, err := CreateTestPlan(testReqs, sourceTreeTestCfg, bbBuilds, chRevData, repoToSrcRoot)
-	if err != nil {
-		t.Error(err)
-	}
-
-	expectedTestPlan := &testplans.GenerateTestPlanResponse{
-		HwTestUnits: []*testplans.HwTestUnit{
-			{Common: &testplans.TestUnitCommon{
-				BuildPayload: &testplans.BuildPayload{
-					ArtifactsGsBucket: GS_BUCKET,
-					ArtifactsGsPath:   GS_PATH_PREFIX + "kevin",
-				},
-				BuildTarget: &chromiumos.BuildTarget{Name: "kevin"}},
-				HwTestCfg: kevinHWTestCfg},
-		},
-	}
-	if diff := cmp.Diff(expectedTestPlan, actualTestPlan, cmpopts.EquateEmpty()); diff != "" {
-		t.Errorf("CreateCombinedTestPlan bad result (-want/+got)\n%s", diff)
-	}
-}
-
-func TestCreateCombinedTestPlan_manyUnitSuccess(t *testing.T) {
-	reefGceTestCfg := &testplans.GceTestCfg{GceTest: []*testplans.GceTestCfg_GceTest{
-		{TestType: "GCE reef", Common: &testplans.TestSuiteCommon{Critical: &wrappers.BoolValue{Value: true}}},
-	}}
-	reefMoblabVmTestCfg := &testplans.MoblabVmTestCfg{MoblabTest: []*testplans.MoblabVmTestCfg_MoblabTest{
-		{TestType: "Moblab reef", Common: &testplans.TestSuiteCommon{Critical: &wrappers.BoolValue{Value: true}}},
-	}}
-	kevinHWTestCfg := &testplans.HwTestCfg{HwTest: []*testplans.HwTestCfg_HwTest{
-		{
-			Suite:       "HW kevin",
-			SkylabBoard: "kev",
-		},
-	}}
-	kevinTastVMTestCfg := &testplans.TastVmTestCfg{TastVmTest: []*testplans.TastVmTestCfg_TastVmTest{
-		{SuiteName: "Tast kevin"},
-	}}
-	kevinVMTestCfg := &testplans.VmTestCfg{VmTest: []*testplans.VmTestCfg_VmTest{
-		{TestType: "VM kevin"},
-	}}
-	testReqs := &testplans.TargetTestRequirementsCfg{
-		PerTargetTestRequirements: []*testplans.PerTargetTestRequirements{
-			{TargetCriteria: &testplans.TargetCriteria{
-				TargetType: &testplans.TargetCriteria_BuildTarget{BuildTarget: "reef"}},
-				GceTestCfg:      reefGceTestCfg,
-				MoblabVmTestCfg: reefMoblabVmTestCfg},
-			{TargetCriteria: &testplans.TargetCriteria{
-				TargetType: &testplans.TargetCriteria_BuildTarget{BuildTarget: "kevin"}},
-				HwTestCfg:     kevinHWTestCfg,
-				TastVmTestCfg: kevinTastVMTestCfg,
-				VmTestCfg:     kevinVMTestCfg},
-		},
-	}
-	sourceTreeTestCfg := &testplans.SourceTreeTestCfg{
-		SourceTreeTestRestriction: []*testplans.SourceTreeTestRestriction{
-			{SourceTree: &testplans.SourceTree{Path: "hw/tests/not/needed/here"},
-				TestRestriction: &testplans.TestRestriction{DisableHwTests: true}}}}
-	bbBuilds := []*bbproto.Build{
-		makeBuildbucketBuild("kevin", bbproto.Status_SUCCESS, []*bbproto.GerritChange{
-			{Host: "test-review.googlesource.com", Change: 123, Patchset: 2},
-		}, true),
-		makeBuildbucketBuild("reef", bbproto.Status_SUCCESS, []*bbproto.GerritChange{
-			{Host: "test-review.googlesource.com", Change: 123, Patchset: 2},
-		}, true),
-	}
-	chRevData := git.GetChangeRevsForTest([]*git.ChangeRev{
-		{
-			ChangeRevKey: git.ChangeRevKey{
-				Host:      "test-review.googlesource.com",
-				ChangeNum: 123,
-				Revision:  2,
-			},
-			Project: "chromiumos/repo/name",
-			Files:   []string{"a/b/c"},
-		},
-	})
-	repoToSrcRoot := map[string]string{"chromiumos/repo/name": "src/to/file"}
-
-	actualTestPlan, err := CreateTestPlan(testReqs, sourceTreeTestCfg, bbBuilds, chRevData, repoToSrcRoot)
-	if err != nil {
-		t.Error(err)
-	}
-
-	expectedTestPlan := &testplans.GenerateTestPlanResponse{
-		GceTestUnits: []*testplans.GceTestUnit{
-			{Common: &testplans.TestUnitCommon{
-				BuildPayload: &testplans.BuildPayload{
-					ArtifactsGsBucket: GS_BUCKET,
-					ArtifactsGsPath:   GS_PATH_PREFIX + "reef",
-				},
-				BuildTarget: &chromiumos.BuildTarget{Name: "reef"}},
-				GceTestCfg: reefGceTestCfg},
-		},
-		MoblabVmTestUnits: []*testplans.MoblabVmTestUnit{
-			{Common: &testplans.TestUnitCommon{
-				BuildPayload: &testplans.BuildPayload{
-					ArtifactsGsBucket: GS_BUCKET,
-					ArtifactsGsPath:   GS_PATH_PREFIX + "reef",
-				},
-				BuildTarget: &chromiumos.BuildTarget{Name: "reef"}},
-				MoblabVmTestCfg: reefMoblabVmTestCfg},
-		},
-		HwTestUnits: []*testplans.HwTestUnit{
-			{Common: &testplans.TestUnitCommon{
-				BuildPayload: &testplans.BuildPayload{
-					ArtifactsGsBucket: GS_BUCKET,
-					ArtifactsGsPath:   GS_PATH_PREFIX + "kevin",
-				},
-				BuildTarget: &chromiumos.BuildTarget{Name: "kevin"}},
-				HwTestCfg: kevinHWTestCfg},
-		},
-		TastVmTestUnits: []*testplans.TastVmTestUnit{
-			{Common: &testplans.TestUnitCommon{
-				BuildPayload: &testplans.BuildPayload{
-					ArtifactsGsBucket: GS_BUCKET,
-					ArtifactsGsPath:   GS_PATH_PREFIX + "kevin",
-				},
-				BuildTarget: &chromiumos.BuildTarget{Name: "kevin"}},
-				TastVmTestCfg: kevinTastVMTestCfg},
-		},
-		VmTestUnits: []*testplans.VmTestUnit{
-			{Common: &testplans.TestUnitCommon{
-				BuildPayload: &testplans.BuildPayload{
-					ArtifactsGsBucket: GS_BUCKET,
-					ArtifactsGsPath:   GS_PATH_PREFIX + "kevin",
-				},
-				BuildTarget: &chromiumos.BuildTarget{Name: "kevin"}},
-				VmTestCfg: kevinVMTestCfg},
-		}}
-	if diff := cmp.Diff(expectedTestPlan, actualTestPlan, cmpopts.EquateEmpty()); diff != "" {
-		t.Errorf("CreateCombinedTestPlan bad result (-want/+got)\n%s", diff)
-	}
-}
-
-func TestCreateCombinedTestPlan_successDespiteOneFailedBuilder(t *testing.T) {
-	// In this test, the kevin builder failed, so the output test plan will not contain a test unit
-	// for kevin.
-
-	reefGceTestCfg := &testplans.GceTestCfg{GceTest: []*testplans.GceTestCfg_GceTest{
-		{TestType: "GCE reef"},
-	}}
-	kevinVMTestCfg := &testplans.VmTestCfg{VmTest: []*testplans.VmTestCfg_VmTest{
-		{TestType: "VM kevin"},
-	}}
-	testReqs := &testplans.TargetTestRequirementsCfg{
-		PerTargetTestRequirements: []*testplans.PerTargetTestRequirements{
-			{TargetCriteria: &testplans.TargetCriteria{
-				TargetType: &testplans.TargetCriteria_BuildTarget{BuildTarget: "reef"}},
-				GceTestCfg: reefGceTestCfg},
-			{TargetCriteria: &testplans.TargetCriteria{
-				TargetType: &testplans.TargetCriteria_BuildTarget{BuildTarget: "kevin"}},
-				VmTestCfg: kevinVMTestCfg},
-		},
-	}
-	sourceTreeTestCfg := &testplans.SourceTreeTestCfg{
-		SourceTreeTestRestriction: []*testplans.SourceTreeTestRestriction{
-			{SourceTree: &testplans.SourceTree{Path: "hw/tests/not/needed/here"},
-				TestRestriction: &testplans.TestRestriction{DisableHwTests: true}}}}
-	bbBuilds := []*bbproto.Build{
-		makeBuildbucketBuild("kevin", bbproto.Status_FAILURE, []*bbproto.GerritChange{
-			{Host: "test-review.googlesource.com", Change: 123, Patchset: 2},
-		}, true),
-		makeBuildbucketBuild("reef", bbproto.Status_SUCCESS, []*bbproto.GerritChange{
-			{Host: "test-review.googlesource.com", Change: 123, Patchset: 2},
-		}, true),
-	}
-	chRevData := git.GetChangeRevsForTest([]*git.ChangeRev{
-		{
-			ChangeRevKey: git.ChangeRevKey{
-				Host:      "test-review.googlesource.com",
-				ChangeNum: 123,
-				Revision:  2,
-			},
-			Project: "chromiumos/repo/name",
-			Files:   []string{"a/b/c"},
-		},
-	})
-	repoToSrcRoot := map[string]string{"chromiumos/repo/name": "src/to/file"}
-
-	actualTestPlan, err := CreateTestPlan(testReqs, sourceTreeTestCfg, bbBuilds, chRevData, repoToSrcRoot)
-	if err != nil {
-		t.Error(err)
-	}
-
-	expectedTestPlan := &testplans.GenerateTestPlanResponse{
-		GceTestUnits: []*testplans.GceTestUnit{
-			{Common: &testplans.TestUnitCommon{
-				BuildPayload: &testplans.BuildPayload{
-					ArtifactsGsBucket: GS_BUCKET,
-					ArtifactsGsPath:   GS_PATH_PREFIX + "reef",
-				},
-				BuildTarget: &chromiumos.BuildTarget{Name: "reef"}},
-				GceTestCfg: reefGceTestCfg},
-		}}
-
-	if diff := cmp.Diff(expectedTestPlan, actualTestPlan, cmpopts.EquateEmpty()); diff != "" {
-		t.Errorf("CreateCombinedTestPlan bad result (-want/+got)\n%s", diff)
-	}
-}
-
-func TestCreateCombinedTestPlan_skipsUnnecessaryHardwareTest(t *testing.T) {
-	kevinHWTestCfg := &testplans.HwTestCfg{HwTest: []*testplans.HwTestCfg_HwTest{
-		{
-			Suite:       "HW kevin",
-			SkylabBoard: "kev",
-		},
-	}}
-	testReqs := &testplans.TargetTestRequirementsCfg{
-		PerTargetTestRequirements: []*testplans.PerTargetTestRequirements{
-			{TargetCriteria: &testplans.TargetCriteria{
-				TargetType: &testplans.TargetCriteria_BuildTarget{BuildTarget: "kevin"}},
-				HwTestCfg: kevinHWTestCfg},
-		},
-	}
-	sourceTreeTestCfg := &testplans.SourceTreeTestCfg{
-		SourceTreeTestRestriction: []*testplans.SourceTreeTestRestriction{
-			{SourceTree: &testplans.SourceTree{Path: "no/hw/tests/here/some/file"},
-				TestRestriction: &testplans.TestRestriction{DisableHwTests: true}}}}
-	bbBuilds := []*bbproto.Build{
-		makeBuildbucketBuild("kevin", bbproto.Status_SUCCESS, []*bbproto.GerritChange{
-			{Host: "test-review.googlesource.com", Change: 123, Patchset: 2},
-		}, true),
-	}
-	chRevData := git.GetChangeRevsForTest([]*git.ChangeRev{
-		{
-			ChangeRevKey: git.ChangeRevKey{
-				Host:      "test-review.googlesource.com",
-				ChangeNum: 123,
-				Revision:  2,
-			},
-			Project: "chromiumos/test/repo/name",
-			Files:   []string{"some/file"},
-		},
-	})
-	repoToSrcRoot := map[string]string{"chromiumos/test/repo/name": "no/hw/tests/here"}
-
-	actualTestPlan, err := CreateTestPlan(testReqs, sourceTreeTestCfg, bbBuilds, chRevData, repoToSrcRoot)
-	if err != nil {
-		t.Error(err)
-	}
-
-	expectedTestPlan := &testplans.GenerateTestPlanResponse{}
-
-	if diff := cmp.Diff(expectedTestPlan, actualTestPlan, cmpopts.EquateEmpty()); diff != "" {
-		t.Errorf("CreateCombinedTestPlan bad result (-want/+got)\n%s", diff)
-	}
-}
-
-func TestCreateCombinedTestPlan_doesOnlyTest(t *testing.T) {
-	kevinHWTestCfg := &testplans.HwTestCfg{HwTest: []*testplans.HwTestCfg_HwTest{
-		{
-			Suite:       "HW kevin",
-			SkylabBoard: "kev",
-		},
-	}}
-	bobHWTestCfg := &testplans.HwTestCfg{HwTest: []*testplans.HwTestCfg_HwTest{
-		{
-			Suite:       "HW bob",
-			SkylabBoard: "bob board",
-		},
-	}}
-	testReqs := &testplans.TargetTestRequirementsCfg{
-		PerTargetTestRequirements: []*testplans.PerTargetTestRequirements{
-			{TargetCriteria: &testplans.TargetCriteria{
-				TargetType: &testplans.TargetCriteria_BuildTarget{BuildTarget: "kevin"}},
-				HwTestCfg: kevinHWTestCfg},
-			{TargetCriteria: &testplans.TargetCriteria{
-				TargetType: &testplans.TargetCriteria_BuildTarget{BuildTarget: "bob"}},
-				HwTestCfg: bobHWTestCfg},
-		},
-	}
-	sourceTreeTestCfg := &testplans.SourceTreeTestCfg{
-		SourceTreeTestRestriction: []*testplans.SourceTreeTestRestriction{
-			{SourceTree: &testplans.SourceTree{Path: "no/hw/tests/here/some/file"},
-				TestRestriction: &testplans.TestRestriction{
-					OnlyTestBuildTargets: []*chromiumos.BuildTarget{
-						{Name: "kevin"}},
-				}}}}
-	bbBuilds := []*bbproto.Build{
-		makeBuildbucketBuild("kevin", bbproto.Status_SUCCESS, []*bbproto.GerritChange{
-			{Host: "test-review.googlesource.com", Change: 123, Patchset: 2},
-		}, true),
-		makeBuildbucketBuild("bob", bbproto.Status_SUCCESS, []*bbproto.GerritChange{
-			{Host: "test-review.googlesource.com", Change: 123, Patchset: 2},
-		}, true),
-	}
-	chRevData := git.GetChangeRevsForTest([]*git.ChangeRev{
-		{
-			ChangeRevKey: git.ChangeRevKey{
-				Host:      "test-review.googlesource.com",
-				ChangeNum: 123,
-				Revision:  2,
-			},
-			Project: "chromiumos/test/repo/name",
-			Files:   []string{"some/file"},
-		},
-	})
-	repoToSrcRoot := map[string]string{"chromiumos/test/repo/name": "no/hw/tests/here"}
-
-	actualTestPlan, err := CreateTestPlan(testReqs, sourceTreeTestCfg, bbBuilds, chRevData, repoToSrcRoot)
-	if err != nil {
-		t.Error(err)
-	}
-
-	expectedTestPlan := &testplans.GenerateTestPlanResponse{
-		HwTestUnits: []*testplans.HwTestUnit{
-			{Common: &testplans.TestUnitCommon{
-				BuildPayload: &testplans.BuildPayload{
-					ArtifactsGsBucket: GS_BUCKET,
-					ArtifactsGsPath:   GS_PATH_PREFIX + "kevin",
-				},
-				BuildTarget: &chromiumos.BuildTarget{Name: "kevin"}},
-				HwTestCfg: kevinHWTestCfg},
-		},
-	}
-
-	if diff := cmp.Diff(expectedTestPlan, actualTestPlan, cmpopts.EquateEmpty()); diff != "" {
-		t.Errorf("CreateCombinedTestPlan bad result (-want/+got)\n%s", diff)
-	}
-}
-
-func TestCreateCombinedTestPlan_inputMissingTargetType(t *testing.T) {
-	testReqs := &testplans.TargetTestRequirementsCfg{
-		PerTargetTestRequirements: []*testplans.PerTargetTestRequirements{
-			// This is missing a TargetType.
-			{TargetCriteria: &testplans.TargetCriteria{}},
-			{TargetCriteria: &testplans.TargetCriteria{
-				TargetType: &testplans.TargetCriteria_BuildTarget{BuildTarget: "kevin"}}},
-		},
-	}
-	sourceTreeTestCfg := &testplans.SourceTreeTestCfg{}
-	bbBuilds := []*bbproto.Build{}
-	if _, err := CreateTestPlan(testReqs, sourceTreeTestCfg, bbBuilds, &git.ChangeRevData{}, map[string]string{}); err == nil {
-		t.Errorf("Expected an error to be returned")
-	}
-}
-
-func TestCreateCombinedTestPlan_skipsPointlessBuild(t *testing.T) {
-	kevinHWTestCfg := &testplans.HwTestCfg{HwTest: []*testplans.HwTestCfg_HwTest{
-		{
-			Suite:       "HW kevin",
-			SkylabBoard: "kev",
-		},
-	}}
-	testReqs := &testplans.TargetTestRequirementsCfg{
-		PerTargetTestRequirements: []*testplans.PerTargetTestRequirements{
-			{TargetCriteria: &testplans.TargetCriteria{
-				TargetType: &testplans.TargetCriteria_BuildTarget{BuildTarget: "kevin"}},
-				HwTestCfg: kevinHWTestCfg},
-		},
-	}
-	sourceTreeTestCfg := &testplans.SourceTreeTestCfg{
-		SourceTreeTestRestriction: []*testplans.SourceTreeTestRestriction{
-			{SourceTree: &testplans.SourceTree{Path: "hw/tests/not/needed/here"},
-				TestRestriction: &testplans.TestRestriction{DisableHwTests: true}}}}
-	bbBuild := makeBuildbucketBuild("kevin", bbproto.Status_SUCCESS, []*bbproto.GerritChange{
-		{Host: "test-review.googlesource.com", Change: 123, Patchset: 2},
-	}, true)
-	bbBuild.Output.Properties.Fields["pointless_build"] = &_struct.Value{Kind: &_struct.Value_BoolValue{BoolValue: true}}
-	bbBuilds := []*bbproto.Build{bbBuild}
-	chRevData := git.GetChangeRevsForTest([]*git.ChangeRev{
-		{
-			ChangeRevKey: git.ChangeRevKey{
-				Host:      "test-review.googlesource.com",
-				ChangeNum: 123,
-				Revision:  2,
-			},
-			Project: "chromiumos/repo/name",
-			Files:   []string{"a/b/c"},
-		},
-	})
-	repoToSrcRoot := map[string]string{"chromiumos/repo/name": "src/to/file"}
-
-	actualTestPlan, err := CreateTestPlan(testReqs, sourceTreeTestCfg, bbBuilds, chRevData, repoToSrcRoot)
-	if err != nil {
-		t.Error(err)
-	}
-
-	expectedTestPlan := &testplans.GenerateTestPlanResponse{}
-
-	if diff := cmp.Diff(expectedTestPlan, actualTestPlan, cmpopts.EquateEmpty()); diff != "" {
-		t.Errorf("CreateCombinedTestPlan bad result (-want/+got)\n%s", diff)
-	}
-}
-
-func TestCreateTestPlan_succeedsOnNoBuildTarget(t *testing.T) {
-	testReqs := &testplans.TargetTestRequirementsCfg{}
-	sourceTreeTestCfg := &testplans.SourceTreeTestCfg{}
-	bbBuilds := []*bbproto.Build{
-		// build target is empty.
-		makeBuildbucketBuild("", bbproto.Status_FAILURE, []*bbproto.GerritChange{}, true),
-	}
-	chRevData := git.GetChangeRevsForTest([]*git.ChangeRev{})
-	repoToSrcRoot := map[string]string{}
-
-	_, err := CreateTestPlan(testReqs, sourceTreeTestCfg, bbBuilds, chRevData, repoToSrcRoot)
-	if err != nil {
-		t.Errorf("expected no error, but got %v", err)
-	}
-}
-
-func TestCreateCombinedTestPlan_skipsNonCritical(t *testing.T) {
-	// In this test, the build is not critical, so no test unit will be produced.
-
-	reefGceTestCfg := &testplans.GceTestCfg{GceTest: []*testplans.GceTestCfg_GceTest{
-		{TestType: "GCE reef"},
-	}}
-	testReqs := &testplans.TargetTestRequirementsCfg{
-		PerTargetTestRequirements: []*testplans.PerTargetTestRequirements{
-			{TargetCriteria: &testplans.TargetCriteria{
-				TargetType: &testplans.TargetCriteria_BuildTarget{BuildTarget: "reef"}},
-				GceTestCfg: reefGceTestCfg},
-		},
-	}
-	sourceTreeTestCfg := &testplans.SourceTreeTestCfg{
-		SourceTreeTestRestriction: []*testplans.SourceTreeTestRestriction{
-			{SourceTree: &testplans.SourceTree{Path: "hw/tests/not/needed/here"},
-				TestRestriction: &testplans.TestRestriction{DisableHwTests: true}}}}
-	bbBuilds := []*bbproto.Build{
-		makeBuildbucketBuild("reef", bbproto.Status_SUCCESS, []*bbproto.GerritChange{
-			{Host: "test-review.googlesource.com", Change: 123, Patchset: 2},
-		}, false),
-	}
-	chRevData := git.GetChangeRevsForTest([]*git.ChangeRev{
-		{
-			ChangeRevKey: git.ChangeRevKey{
-				Host:      "test-review.googlesource.com",
-				ChangeNum: 123,
-				Revision:  2,
-			},
-			Project: "chromiumos/repo/name",
-			Files:   []string{"a/b/c"},
-		},
-	})
-	repoToSrcRoot := map[string]string{"chromiumos/repo/name": "src/to/file"}
-
-	actualTestPlan, err := CreateTestPlan(testReqs, sourceTreeTestCfg, bbBuilds, chRevData, repoToSrcRoot)
-	if err != nil {
-		t.Error(err)
-	}
-
-	expectedTestPlan := &testplans.GenerateTestPlanResponse{
-		GceTestUnits: []*testplans.GceTestUnit{}}
-
-	if diff := cmp.Diff(expectedTestPlan, actualTestPlan, cmpopts.EquateEmpty()); diff != "" {
-		t.Errorf("CreateCombinedTestPlan bad result (-want/+got)\n%s", diff)
-	}
-}
-
-func TestCreateCombinedTestPlan_ignoresNonArtifactBuild(t *testing.T) {
-	kevinHWTestCfg := &testplans.HwTestCfg{HwTest: []*testplans.HwTestCfg_HwTest{
-		{
-			Suite:       "HW kevin",
-			SkylabBoard: "kev",
-		},
-	}}
-	testReqs := &testplans.TargetTestRequirementsCfg{
-		PerTargetTestRequirements: []*testplans.PerTargetTestRequirements{
-			{TargetCriteria: &testplans.TargetCriteria{
-				TargetType: &testplans.TargetCriteria_BuildTarget{BuildTarget: "kevin"}},
-				HwTestCfg: kevinHWTestCfg},
-		},
-	}
-	sourceTreeTestCfg := &testplans.SourceTreeTestCfg{
-		SourceTreeTestRestriction: []*testplans.SourceTreeTestRestriction{
-			{SourceTree: &testplans.SourceTree{Path: "hw/tests/not/needed/here"},
-				TestRestriction: &testplans.TestRestriction{DisableHwTests: true}}}}
-	build := makeBuildbucketBuild("kevin", bbproto.Status_SUCCESS, []*bbproto.GerritChange{}, true)
-
-	// Remove the AUTOTEST_FILES files_by_artifact key, thus making this whole
-	// build unusable for testing.
-	delete(
-		build.GetOutput().GetProperties().GetFields()["artifacts"].GetStructValue().GetFields()["files_by_artifact"].GetStructValue().GetFields(),
-		"AUTOTEST_FILES")
-	bbBuilds := []*bbproto.Build{build}
-	chRevData := git.GetChangeRevsForTest([]*git.ChangeRev{})
-	repoToSrcRoot := map[string]string{"chromiumos/repo/name": "src/to/file"}
-
-	actualTestPlan, err := CreateTestPlan(testReqs, sourceTreeTestCfg, bbBuilds, chRevData, repoToSrcRoot)
-	if err != nil {
-		t.Error(err)
-	}
-
-	expectedTestPlan := &testplans.GenerateTestPlanResponse{}
-	if diff := cmp.Diff(expectedTestPlan, actualTestPlan, cmpopts.EquateEmpty()); diff != "" {
-		t.Errorf("CreateCombinedTestPlan bad result (-want/+got)\n%s", diff)
-	}
-}
diff --git a/src/testplans/internal/generator/test_pruner.go b/src/testplans/internal/generator/test_pruner.go
deleted file mode 100644
index abf0bad..0000000
--- a/src/testplans/internal/generator/test_pruner.go
+++ /dev/null
@@ -1,190 +0,0 @@
-// Copyright 2019 The Chromium 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 generator
-
-import (
-	"fmt"
-	"go.chromium.org/chromiumos/infra/proto/go/testplans"
-	bbproto "go.chromium.org/luci/buildbucket/proto"
-	"log"
-	"strings"
-	"testplans/internal/git"
-)
-
-type testType int
-
-const (
-	hw testType = iota
-	vm
-)
-
-var (
-	testTypeFilter = map[testType]func(testReqs *testplans.TestRestriction) bool{
-		hw: func(testReqs *testplans.TestRestriction) bool { return testReqs.DisableHwTests },
-		vm: func(testReqs *testplans.TestRestriction) bool { return testReqs.DisableVmTests },
-	}
-)
-
-func (tt testType) String() string {
-	return [...]string{"Hw", "Vm"}[tt]
-}
-
-type testPruneResult struct {
-	disableHWTests       bool
-	disableVMTests       bool
-	onlyTestBuildTargets map[BuildTarget]bool
-}
-
-// canSkipForOnlyTestRule identifies whether testing for a provided build target
-// can be skipped due to the only-test rules. e.g. if we only need to test on
-// "reef", this will return false for all non-reef build targets.
-func (tpr testPruneResult) canSkipForOnlyTestRule(bt BuildTarget) bool {
-	// If no only-test build targets were specified, we can't skip testing for
-	// any build targets by only-test rules.
-	if len(tpr.onlyTestBuildTargets) == 0 {
-		return false
-	}
-	isAnOnlyTestTarget, _ := tpr.onlyTestBuildTargets[bt]
-	return !isAnOnlyTestTarget
-}
-
-func extractPruneResult(
-	sourceTreeCfg *testplans.SourceTreeTestCfg,
-	changes []*bbproto.GerritChange,
-	changeRevs *git.ChangeRevData,
-	repoToSrcRoot map[string]string) (*testPruneResult, error) {
-
-	result := &testPruneResult{}
-
-	if len(changes) == 0 {
-		// This happens during postsubmit runs, for example.
-		log.Print("no gerrit_changes, so no tests will be skipped")
-		return result, nil
-	}
-
-	// All the files in the GerritChanges, in source tree form.
-	srcPaths, err := srcPaths(changes, changeRevs, repoToSrcRoot)
-	if err != nil {
-		return result, err
-	}
-
-	disableHW := true
-	for _, fileSrcPath := range srcPaths {
-		if disableHW {
-			disableHWForPath, err := canDisableTestingForPath(fileSrcPath, sourceTreeCfg, hw)
-			if err != nil {
-				return result, err
-			}
-			if !disableHWForPath {
-				log.Printf("cannot disable HW testing due to file %s", fileSrcPath)
-				disableHW = false
-			}
-		}
-	}
-	disableVM := true
-	for _, fileSrcPath := range srcPaths {
-		if disableVM {
-			disableVMForPath, err := canDisableTestingForPath(fileSrcPath, sourceTreeCfg, vm)
-			if err != nil {
-				return result, err
-			}
-			if !disableVMForPath {
-				log.Printf("cannot disable VM testing due to file %s", fileSrcPath)
-				disableVM = false
-			}
-		}
-	}
-	canOnlyTestSomeBuildTargets := true
-	onlyTestBuildTargets := make(map[BuildTarget]bool)
-	for _, fileSrcPath := range srcPaths {
-		if canOnlyTestSomeBuildTargets {
-			fileOnlyTestBuildTargets, err := checkOnlyTestBuildTargets(fileSrcPath, sourceTreeCfg)
-			if err != nil {
-				return result, err
-			}
-			if len(fileOnlyTestBuildTargets) == 0 {
-				log.Printf("cannot limit set of build targets for testing due to %s", fileSrcPath)
-				canOnlyTestSomeBuildTargets = false
-				onlyTestBuildTargets = make(map[BuildTarget]bool)
-			} else {
-				for k, v := range fileOnlyTestBuildTargets {
-					onlyTestBuildTargets[k] = v
-				}
-			}
-		}
-	}
-	return &testPruneResult{
-			disableHWTests:       disableHW,
-			disableVMTests:       disableVM,
-			onlyTestBuildTargets: onlyTestBuildTargets},
-		nil
-}
-
-// srcPaths extracts the source paths from each of the provided Gerrit changes.
-func srcPaths(
-	changes []*bbproto.GerritChange,
-	changeRevs *git.ChangeRevData,
-	repoToSrcRoot map[string]string) ([]string, error) {
-	srcPaths := make([]string, 0)
-	for _, commit := range changes {
-		chRev, err := changeRevs.GetChangeRev(commit.Host, commit.Change, int32(commit.Patchset))
-		if err != nil {
-			return srcPaths, err
-		}
-		for _, file := range chRev.Files {
-			srcRootMapping, found := repoToSrcRoot[chRev.Project]
-			if !found {
-				return srcPaths, fmt.Errorf("Found no source mapping for project %s", chRev.Project)
-			}
-			srcPaths = append(srcPaths, fmt.Sprintf("%s/%s", srcRootMapping, file))
-		}
-	}
-	return srcPaths, nil
-}
-
-// checkOnlyTestBuildTargets checks if the provided path is covered by an
-// only-test rule, which would allow us to exclude testing for all other
-// build targets.
-func checkOnlyTestBuildTargets(
-	sourceTreePath string,
-	sourceTreeCfg *testplans.SourceTreeTestCfg) (map[BuildTarget]bool, error) {
-	result := make(map[BuildTarget]bool)
-	for _, sourceTreeRestriction := range sourceTreeCfg.SourceTreeTestRestriction {
-		if hasPathPrefix(sourceTreePath, sourceTreeRestriction.SourceTree.Path) {
-			for _, otbt := range sourceTreeRestriction.TestRestriction.OnlyTestBuildTargets {
-				result[BuildTarget(otbt.Name)] = true
-			}
-		}
-	}
-	return result, nil
-}
-
-// canDisableTestingForPath determines whether a particular testing type is unnecessary for
-// a given file, based on source tree test restrictions.
-func canDisableTestingForPath(sourceTreePath string, sourceTreeCfg *testplans.SourceTreeTestCfg, tt testType) (bool, error) {
-	for _, sourceTreeRestriction := range sourceTreeCfg.SourceTreeTestRestriction {
-		testFilter, ok := testTypeFilter[tt]
-		if !ok {
-			return false, fmt.Errorf("Missing test filter for %v", tt)
-		}
-		if testFilter(sourceTreeRestriction.TestRestriction) {
-			if hasPathPrefix(sourceTreePath, sourceTreeRestriction.SourceTree.Path) {
-				return true, nil
-			}
-		}
-	}
-	return false, nil
-}
-
-// hasPathPrefix checks if the provided string has a provided path prefix.
-// e.g. ab/cd/ef, ab --> true
-//      ab/cd, ab/c --> false
-func hasPathPrefix(s string, prefix string) bool {
-	if s == prefix {
-		return true
-	}
-	prefixAsDir := strings.TrimSuffix(prefix, "/") + "/"
-	return strings.HasPrefix(s, prefixAsDir)
-}
diff --git a/src/testplans/internal/git/gerrit.go b/src/testplans/internal/git/gerrit.go
deleted file mode 100644
index fbce91e..0000000
--- a/src/testplans/internal/git/gerrit.go
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2019 The Chromium 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 git
-
-import (
-	"context"
-	"fmt"
-	"go.chromium.org/luci/common/api/gerrit"
-	gerritpb "go.chromium.org/luci/common/proto/gerrit"
-	"net/http"
-	"testplans/internal/shared"
-	"time"
-)
-
-// ChangeRevKey is the necessary set of data for looking up a single Gerrit revision.
-type ChangeRevKey struct {
-	Host      string
-	ChangeNum int64
-	Revision  int32
-}
-
-func (cik ChangeRevKey) String() string {
-	return fmt.Sprintf("%s:%d:%d", cik.Host, cik.ChangeNum, cik.Revision)
-}
-
-// ChangeRev contains data about a Gerrit change,revision pair.
-type ChangeRev struct {
-	ChangeRevKey
-	Project string
-	Files   []string
-}
-
-var (
-	// Override this to use a mock GerritClient rather than the real one.
-	mockGerrit gerritpb.GerritClient
-)
-
-// GetChangeRev gets details from Gerrit about a change,revision pair.
-func GetChangeRev(authedClient *http.Client, ctx context.Context, changeNum int64, revision int32, host string) (*ChangeRev, error) {
-	var g gerritpb.GerritClient
-	var err error
-	if mockGerrit != nil {
-		g = mockGerrit
-	} else {
-		if g, err = gerrit.NewRESTClient(authedClient, host, true); err != nil {
-			return nil, err
-		}
-	}
-	ctx, _ = context.WithTimeout(ctx, 5*time.Minute)
-	ch := make(chan *gerritpb.ChangeInfo, 1)
-	err = shared.DoWithRetry(ctx, shared.DefaultOpts, func() error {
-		// This sets the deadline for the individual API call, while the outer context sets
-		// an overall timeout for all attempts.
-		innerCtx, _ := context.WithTimeout(ctx, 30*time.Second)
-		change, err := g.GetChange(innerCtx, &gerritpb.GetChangeRequest{
-			Number: changeNum,
-			Options: []gerritpb.QueryOption{
-				gerritpb.QueryOption_ALL_REVISIONS,
-				gerritpb.QueryOption_ALL_FILES,
-			}})
-		if err != nil {
-			return err
-		}
-		ch <- change
-		return nil
-	})
-	if err != nil {
-		return nil, err
-	}
-	change := <-ch
-	for _, v := range change.GetRevisions() {
-		if v.Number == revision {
-			return &ChangeRev{
-				ChangeRevKey: ChangeRevKey{
-					Host:      host,
-					ChangeNum: change.Number,
-					Revision:  v.Number,
-				},
-				Project: change.Project,
-				Files:   getKeys(v.Files),
-			}, nil
-		}
-	}
-	return nil, fmt.Errorf("found no revision %d for change %d on host %s", revision, changeNum, host)
-}
-
-// ChangeRevData encapsulates a bunch of Gerrit change revisions.
-type ChangeRevData struct {
-	m map[string]*ChangeRev
-}
-
-// GetChangeRev extracts a single Gerrit change revision from the ChangeRevData.
-func (crv ChangeRevData) GetChangeRev(host string, changeNum int64, revision int32) (*ChangeRev, error) {
-	key := ChangeRevKey{Host: host, ChangeNum: changeNum, Revision: revision}.String()
-	val, found := crv.m[key]
-	if !found {
-		return nil, fmt.Errorf("No ChangeRev found for key %s", key)
-	}
-	return val, nil
-}
-
-// GetChangeRevData fetches the Gerrit changes for the provided ChangeIdKeys, and bundles the result
-// into a ChangeRevData.
-func GetChangeRevData(authedClient *http.Client, ctx context.Context, changeIds []ChangeRevKey) (*ChangeRevData, error) {
-	output := &ChangeRevData{m: make(map[string]*ChangeRev)}
-	for _, c := range changeIds {
-		if _, exists := output.m[c.String()]; !exists {
-			cr, err := GetChangeRev(authedClient, ctx, c.ChangeNum, c.Revision, c.Host)
-			if err != nil {
-				return output, err
-			}
-			output.m[c.String()] = cr
-		}
-	}
-	return output, nil
-}
-
-// GetChangeRevForTest is intended for testing only, and it allows creation of a ChangeRevData
-// through the supplied ChangeRevs.
-func GetChangeRevsForTest(cr []*ChangeRev) *ChangeRevData {
-	output := &ChangeRevData{m: make(map[string]*ChangeRev)}
-	for _, c := range cr {
-		output.m[c.String()] = c
-	}
-	return output
-}
-
-// getKeys extracts the keyset from the provided map.
-func getKeys(m map[string]*gerritpb.FileInfo) []string {
-	keys := make([]string, 0)
-	for k := range m {
-		keys = append(keys, k)
-	}
-	return keys
-}
diff --git a/src/testplans/internal/git/gerrit_test.go b/src/testplans/internal/git/gerrit_test.go
deleted file mode 100644
index ec40356..0000000
--- a/src/testplans/internal/git/gerrit_test.go
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2019 The Chromium 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 git
-
-import (
-	"context"
-	"fmt"
-	"github.com/golang/mock/gomock"
-	"github.com/google/go-cmp/cmp"
-	gerritpb "go.chromium.org/luci/common/proto/gerrit"
-	"net/http"
-	"strings"
-	"testing"
-)
-
-func TestGetChangeRev_success(t *testing.T) {
-	changeNum := int64(123)
-	revision := int32(2)
-	project := "chromiumos/for/the/win"
-
-	ctl := gomock.NewController(t)
-	defer ctl.Finish()
-	gerritMock := gerritpb.NewMockGerritClient(ctl)
-	gerritMock.EXPECT().GetChange(gomock.Any(), gomock.Any()).Return(
-		&gerritpb.ChangeInfo{
-			Number:  changeNum,
-			Project: project,
-			Revisions: map[string]*gerritpb.RevisionInfo{
-				"hash1": {
-					Number: revision,
-					Files: map[string]*gerritpb.FileInfo{
-						"/file/1": {},
-					},
-				},
-			},
-		},
-		nil)
-	host := "limited-review.googlesource.com"
-	mockGerrit = gerritMock
-
-	expectedChRev := &ChangeRev{
-		ChangeRevKey: ChangeRevKey{
-			Host:      host,
-			ChangeNum: changeNum,
-			Revision:  revision,
-		},
-		Project: project,
-		Files: []string{
-			"/file/1",
-		},
-	}
-
-	actualChRev, err := GetChangeRev(http.DefaultClient, context.Background(), changeNum, revision, host)
-	if err != nil {
-		t.Error(err)
-	}
-	if diff := cmp.Diff(expectedChRev, actualChRev); diff != "" {
-		t.Errorf("ChangeRev bad result (-want/+got)\n%s", diff)
-	}
-}
-
-func TestGetChangeRev_missingRevision(t *testing.T) {
-	changeNum := int64(123)
-	project := "chromiumos/for/the/win"
-
-	ctl := gomock.NewController(t)
-	defer ctl.Finish()
-	gerritMock := gerritpb.NewMockGerritClient(ctl)
-	gerritMock.EXPECT().GetChange(gomock.Any(), gomock.Any()).Return(
-		&gerritpb.ChangeInfo{
-			Number:  changeNum,
-			Project: project,
-			Revisions: map[string]*gerritpb.RevisionInfo{
-				"hash1": {
-					Number: 1,
-					Files: map[string]*gerritpb.FileInfo{
-						"/file/1": {},
-						"/file/2": {},
-					},
-				},
-			},
-		},
-		nil)
-	host := "limited-review.googlesource.com"
-	mockGerrit = gerritMock
-
-	// We're asking for revision 2, but there's only a revision 1.
-	_, err := GetChangeRev(http.DefaultClient, context.Background(), changeNum, 2, host)
-	if err == nil {
-		t.Error("expected an error, got none")
-	}
-	substr := "found no revision 2"
-	if !strings.Contains(fmt.Sprintf("%v", err), substr) {
-		t.Errorf("Expected error to contain %s, instead %v", substr, err)
-	}
-}
diff --git a/src/testplans/internal/git/gitiles.go b/src/testplans/internal/git/gitiles.go
deleted file mode 100644
index 5cef605..0000000
--- a/src/testplans/internal/git/gitiles.go
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2019 The Chromium 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 git
-
-import (
-	"archive/tar"
-	"bytes"
-	"compress/gzip"
-	"context"
-	"go.chromium.org/luci/common/api/gitiles"
-	"go.chromium.org/luci/common/errors"
-	"go.chromium.org/luci/common/logging"
-	gitilespb "go.chromium.org/luci/common/proto/gitiles"
-	"io"
-	"net/http"
-	"testplans/internal/shared"
-	"time"
-)
-
-var (
-	// Override this to use a mock GitilesClient rather than the real one.
-	MockGitiles gitilespb.GitilesClient
-)
-
-// FetchFilesFromGitiles fetches file contents from gitiles.
-//
-// project is the git project to fetch from.
-// ref is the git-ref to fetch from.
-// paths lists the paths inside the git project to fetch contents for.
-//
-// fetchFilesFromGitiles returns a map from path in the git project to the
-// contents of the file at that path for each requested path.
-func FetchFilesFromGitiles(authedClient *http.Client, ctx context.Context, host, project, ref string, paths []string) (*map[string]string, error) {
-	var gc gitilespb.GitilesClient
-	var err error
-	if MockGitiles != nil {
-		gc = MockGitiles
-	} else {
-		if gc, err = gitiles.NewRESTClient(authedClient, host, true); err != nil {
-			return nil, err
-		}
-	}
-	contents, err := obtainGitilesBytes(ctx, gc, project, ref)
-	if err != nil {
-		return nil, err
-	}
-	return extractGitilesArchive(ctx, contents, paths)
-}
-
-func obtainGitilesBytes(ctx context.Context, gc gitilespb.GitilesClient, project string, ref string) ([]byte, error) {
-	ctx, _ = context.WithTimeout(ctx, 5*time.Minute)
-	ch := make(chan *gitilespb.ArchiveResponse, 1)
-	err := shared.DoWithRetry(ctx, shared.DefaultOpts, func() error {
-		// This sets the deadline for the individual API call, while the outer context sets
-		// an overall timeout for all attempts.
-		innerCtx, _ := context.WithTimeout(ctx, 30*time.Second)
-		req := &gitilespb.ArchiveRequest{
-			Project: project,
-			Ref:     ref,
-			Format:  gitilespb.ArchiveRequest_GZIP,
-		}
-		a, err := gc.Archive(innerCtx, req)
-		if err != nil {
-			return errors.Annotate(err, "obtain gitiles archive").Err()
-		}
-		logging.Debugf(ctx, "Gitiles archive %+v size: %d", req, len(a.Contents))
-		ch <- a
-		return nil
-	})
-	if err != nil {
-		return nil, err
-	}
-	a := <-ch
-	return a.Contents, nil
-}
-
-// extractGitilesArchive extracts file at each path in paths from the given
-// gunzipped tarfile.
-//
-// extractGitilesArchive returns a map from path to the content of the file at
-// that path in the archives for each requested path found in the archive.
-//
-// This function takes ownership of data. Caller should not use the byte array
-// concurrent to / after this call. See io.Reader interface for more details.
-func extractGitilesArchive(ctx context.Context, data []byte, paths []string) (*map[string]string, error) {
-	pmap := make(map[string]bool)
-	for _, p := range paths {
-		pmap[p] = true
-	}
-
-	abuf := bytes.NewBuffer(data)
-	gr, err := gzip.NewReader(abuf)
-	if err != nil {
-		return nil, errors.Annotate(err, "extract gitiles archive").Err()
-	}
-	defer gr.Close()
-
-	res := make(map[string]string)
-	tr := tar.NewReader(gr)
-	for {
-		h, err := tr.Next()
-		switch {
-		case err == io.EOF:
-			// Scanned all files.
-			return &res, nil
-		case err != nil:
-			return nil, errors.Annotate(err, "extract gitiles archive").Err()
-		default:
-			// good case.
-		}
-		if found := pmap[h.Name]; !found {
-			continue
-		}
-
-		logging.Debugf(ctx, "Inventory data file %s size %d", h.Name, h.Size)
-		data := make([]byte, h.Size)
-		if _, err := io.ReadFull(tr, data); err != nil {
-			return nil, errors.Annotate(err, "extract gitiles archive").Err()
-		}
-		res[h.Name] = string(data)
-	}
-}
diff --git a/src/testplans/internal/git/gitiles_test.go b/src/testplans/internal/git/gitiles_test.go
deleted file mode 100644
index 929a1b0..0000000
--- a/src/testplans/internal/git/gitiles_test.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2019 The Chromium 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 git
-
-import (
-	"context"
-	"encoding/base64"
-	"github.com/golang/mock/gomock"
-	gitilespb "go.chromium.org/luci/common/proto/gitiles"
-	"net/http"
-	"testing"
-)
-
-func TestFetchFilesFromGitiles_success(t *testing.T) {
-	ctl := gomock.NewController(t)
-	defer ctl.Finish()
-
-	// This is a base64-encoded .tar.gz file. It contains one file, contents pair:
-	// dir/file1, This is a gzipped file!
-	base64Enc := `H4sIADj/sFwAA+2VQU7DMBBFs+4phgu0HntmTBfds+yCCxjFtJYIjZxGKpweh6pBhYJYYBCtnyxF
-iiP5O877WbrdjXe1j7M6xCoPSinLDJV9BSrNlrWB4f4eRkBDTGhFUIFCEdYV7DLlOaLvti6mKJ13
-j+4uurVrTj7XxtC4+LSKm749Nb/fCYzXfwIS9KFeaJkrvp5oC802NH6BzIzKIOqpzA1pPfnroIUs
-JOtnudc4+I8KmZT+6H/y5dh/spT859zBBi7c/+H8l+M/4D48ePzxNdL7EKJv9b8loXT+VtiW/v8N
-vu7/pOsUtTZkSv+fJ4P/eax/4+D/p/1v1Dv/WUQqUBkzjVy4/7fr0EEaDlbPoW19DcPXcFV0LxQK
-hTPnBcGXkjUAEgAA
-`
-	encodedZip, err := base64.StdEncoding.DecodeString(base64Enc)
-	if err != nil {
-		t.Error(err)
-	}
-
-	gitilesMock := gitilespb.NewMockGitilesClient(ctl)
-	gitilesMock.EXPECT().Archive(gomock.Any(), gomock.Any()).Return(
-		&gitilespb.ArchiveResponse{
-			Contents: encodedZip,
-		},
-		nil,
-	)
-	host := "limited-review.googlesource.com"
-	project := "chromiumos/for/the/win"
-	ref := "master"
-	paths := []string{"dir/file1"}
-	MockGitiles = gitilesMock
-
-	m, err := FetchFilesFromGitiles(http.DefaultClient, context.Background(), host, project, ref, paths)
-	if err != nil {
-		t.Error(err)
-	}
-
-	v, found := (*m)["dir/file1"]
-	if !found {
-		t.Error("Expected file not found in archive")
-	}
-	if v != "This is a gzipped file!\n" {
-		t.Error("Archive not unzipped correctly")
-	}
-}
diff --git a/src/testplans/internal/pointless/build_checker.go b/src/testplans/internal/pointless/build_checker.go
deleted file mode 100644
index d789f1c..0000000
--- a/src/testplans/internal/pointless/build_checker.go
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright 2019 The Chromium 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 pointless
-
-import (
-	"fmt"
-	"github.com/bmatcuk/doublestar"
-	"github.com/golang/protobuf/ptypes/wrappers"
-	chromite "go.chromium.org/chromiumos/infra/proto/go/chromite/api"
-	testplans_pb "go.chromium.org/chromiumos/infra/proto/go/testplans"
-	bbproto "go.chromium.org/luci/buildbucket/proto"
-	"log"
-	"sort"
-	"strings"
-	"testplans/internal/git"
-)
-
-const (
-	// The location of the repo checkout inside the chroot.
-	// This prefix needs to be trimmed from dependencySourcePaths at the moment, but that will become
-	// unnecessary once https://crbug.com/957090 is resolved.
-	depSourcePathPrefix = "/mnt/host/source/"
-)
-
-// CheckBuilder assesses whether a child builder is pointless for a given CQ run. This may be the
-// case if the commits in the CQ run don't affect any files that could possibly affect this
-// builder's Portage graph.
-func CheckBuilder(
-	build *bbproto.Build,
-	changeRevs *git.ChangeRevData,
-	depGraph *chromite.DepGraph,
-	repoToSrcRoot map[string]string,
-	cfg testplans_pb.BuildIrrelevanceCfg) (*testplans_pb.PointlessBuildCheckResponse, error) {
-
-	// Get all of the files referenced by each GerritCommit in the Build.
-	affectedFiles, err := extractAffectedFiles(build, changeRevs, repoToSrcRoot)
-	if err != nil {
-		return nil, fmt.Errorf("error in extractAffectedFiles: %+v", err)
-	}
-	if len(affectedFiles) == 0 {
-		log.Printf("Builder %s: No affected files, so this can't be a CQ run. "+
-			"Aborting with BuildIsPointless := false", getBuilderName(build))
-		return &testplans_pb.PointlessBuildCheckResponse{
-			BuildIsPointless: &wrappers.BoolValue{Value: false},
-		}, nil
-	}
-
-	// Filter out files that are irrelevant to Portage because of the config.
-	affectedFiles = filterByBuildIrrelevantPaths(affectedFiles, cfg)
-	if len(affectedFiles) == 0 {
-		log.Printf("Builder %s: All files ruled out by build-irrelevant paths. This means that "+
-			"none of the Gerrit changes in the build input could affect the outcome of the build",
-			getBuilderName(build))
-		return &testplans_pb.PointlessBuildCheckResponse{
-			BuildIsPointless:     &wrappers.BoolValue{Value: true},
-			PointlessBuildReason: testplans_pb.PointlessBuildCheckResponse_IRRELEVANT_TO_KNOWN_NON_PORTAGE_DIRECTORIES,
-		}, nil
-	}
-	log.Printf("After considering build-irrelevant paths, we still must consider files:\n%v",
-		strings.Join(affectedFiles, "\n"))
-
-	// Filter out files that aren't in the Portage dep graph.
-	affectedFiles = filterByPortageDeps(affectedFiles, depGraph)
-	if len(affectedFiles) == 0 {
-		log.Printf("Builder %s: All files ruled out after checking dep graph", getBuilderName(build))
-		return &testplans_pb.PointlessBuildCheckResponse{
-			BuildIsPointless:     &wrappers.BoolValue{Value: true},
-			PointlessBuildReason: testplans_pb.PointlessBuildCheckResponse_IRRELEVANT_TO_DEPS_GRAPH,
-		}, nil
-	}
-
-	log.Printf("Builder %s: This build is not pointless, due to files:\n%v",
-		getBuilderName(build), strings.Join(affectedFiles, "\n"))
-	return &testplans_pb.PointlessBuildCheckResponse{
-		BuildIsPointless: &wrappers.BoolValue{Value: false},
-	}, nil
-}
-
-func extractAffectedFiles(build *bbproto.Build,
-	changeRevs *git.ChangeRevData, repoToSrcRoot map[string]string) ([]string, error) {
-	allAffectedFiles := make([]string, 0)
-	for _, gc := range build.Input.GerritChanges {
-		rev, err := changeRevs.GetChangeRev(gc.Host, gc.Change, int32(gc.Patchset))
-		if err != nil {
-			return nil, err
-		}
-		srcRootMapping, found := repoToSrcRoot[rev.Project]
-		if !found {
-			return nil, fmt.Errorf("Found no source mapping for project %s", rev.Project)
-		}
-		affectedFiles := make([]string, 0, len(rev.Files))
-		for _, file := range rev.Files {
-			fileSrcPath := fmt.Sprintf("%s/%s", srcRootMapping, file)
-			affectedFiles = append(affectedFiles, fileSrcPath)
-		}
-		sort.Strings(affectedFiles)
-		log.Printf("For https://%s/%d, affected files:\n%v\n\n",
-			gc.Host, gc.Change, strings.Join(affectedFiles, "\n"))
-		allAffectedFiles = append(allAffectedFiles, affectedFiles...)
-	}
-	sort.Strings(allAffectedFiles)
-	log.Printf("All affected files:\n%v\n\n", strings.Join(allAffectedFiles, "\n"))
-	return allAffectedFiles, nil
-}
-
-func filterByBuildIrrelevantPaths(files []string, cfg testplans_pb.BuildIrrelevanceCfg) []string {
-	pipFilteredFiles := make([]string, 0)
-affectedFile:
-	for _, f := range files {
-		for _, pattern := range cfg.IrrelevantFilePatterns {
-			match, err := doublestar.Match(pattern.Pattern, f)
-			if err != nil {
-				log.Fatalf("Failed to match pattern %s against file %s: %v", pattern, f, err)
-			}
-			if match {
-				log.Printf("Ignoring file %s, since it matches Portage irrelevant pattern %s", f, pattern.Pattern)
-				continue affectedFile
-			}
-		}
-		log.Printf("Cannot ignore file %s by Portage irrelevant path rules", f)
-		pipFilteredFiles = append(pipFilteredFiles, f)
-	}
-	return pipFilteredFiles
-}
-
-func filterByPortageDeps(files []string, depGraph *chromite.DepGraph) []string {
-	if depGraph == nil {
-		log.Printf("No Portage DepGraph was provided, so no files can be filtered out by this rule.")
-		return files
-	}
-	portageDeps := make([]string, 0)
-	for _, pd := range depGraph.PackageDeps {
-		for _, sp := range pd.DependencySourcePaths {
-			portageDeps = append(portageDeps, strings.TrimPrefix(sp.Path, depSourcePathPrefix))
-		}
-	}
-	log.Printf("Found %d Portage deps to consider from the build graph:\n"+
-		"<portage dep paths>\n%v\n</portage dep paths>",
-		len(portageDeps), strings.Join(portageDeps, "\n"))
-
-	portageFilteredFiles := make([]string, 0)
-affectedFile:
-	for _, f := range files {
-		for _, pd := range portageDeps {
-			if f == pd {
-				log.Printf("Cannot ignore file %s due to Portage dependency %s", f, pd)
-				portageFilteredFiles = append(portageFilteredFiles, f)
-				continue affectedFile
-			}
-			pdAsDir := strings.TrimSuffix(pd, "/") + "/"
-			if strings.HasPrefix(f, pdAsDir) {
-				log.Printf("Cannot ignore file %s since it's in Portage dependency %s", f, pd)
-				portageFilteredFiles = append(portageFilteredFiles, f)
-				continue affectedFile
-			}
-		}
-		log.Printf("Ignoring file %s because no prefix of it is referenced in the dep graph", f)
-	}
-	return portageFilteredFiles
-}
-
-func getBuilderName(bb *bbproto.Build) string {
-	return bb.GetBuilder().GetBuilder()
-}
diff --git a/src/testplans/internal/pointless/build_checker_test.go b/src/testplans/internal/pointless/build_checker_test.go
deleted file mode 100644
index 431ffc4..0000000
--- a/src/testplans/internal/pointless/build_checker_test.go
+++ /dev/null
@@ -1,242 +0,0 @@
-// Copyright 2019 The Chromium 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 pointless
-
-import (
-	"github.com/bmatcuk/doublestar"
-	chromite "go.chromium.org/chromiumos/infra/proto/go/chromite/api"
-	testplans_pb "go.chromium.org/chromiumos/infra/proto/go/testplans"
-	bbproto "go.chromium.org/luci/buildbucket/proto"
-	"testing"
-	"testplans/internal/git"
-)
-
-func makeBuildbucketBuild(changes []*bbproto.GerritChange) *bbproto.Build {
-	b := &bbproto.Build{
-		Input:   &bbproto.Build_Input{},
-		Builder: &bbproto.BuilderID{Builder: "reef"},
-	}
-	for _, c := range changes {
-		b.Input.GerritChanges = append(b.Input.GerritChanges, c)
-	}
-	return b
-}
-
-func TestCheckBuilder_irrelevantToDepGraph(t *testing.T) {
-	// In this test, there's a CL that is fully irrelevant to the dep graph, so the build is pointless.
-
-	build := makeBuildbucketBuild([]*bbproto.GerritChange{
-		{Host: "test-review.googlesource.com", Change: 123, Patchset: 2, Project: "chromiumos/public/example"}})
-	chRevData := git.GetChangeRevsForTest([]*git.ChangeRev{
-		{
-			ChangeRevKey: git.ChangeRevKey{
-				Host:      "test-review.googlesource.com",
-				ChangeNum: 123,
-				Revision:  2,
-			},
-			Project: "chromiumos/public/example",
-			Files:   []string{"relevantfile", "irrelevantdir2"},
-		},
-	})
-	depGraph := &chromite.DepGraph{
-		PackageDeps: []*chromite.PackageDepInfo{
-			{DependencySourcePaths: []*chromite.SourcePath{
-				{Path: "src/dep/graph/path"},
-			}}}}
-	repoToSrcRoot := map[string]string{
-		"chromiumos/public/example": "src/pub/ex",
-	}
-	cfg := testplans_pb.BuildIrrelevanceCfg{}
-
-	res, err := CheckBuilder(build, chRevData, depGraph, repoToSrcRoot, cfg)
-	if err != nil {
-		t.Error(err)
-	}
-	if !res.BuildIsPointless.Value {
-		t.Errorf("expected build_is_pointless, instead got result %v", res)
-	}
-	if res.PointlessBuildReason != testplans_pb.PointlessBuildCheckResponse_IRRELEVANT_TO_DEPS_GRAPH {
-		t.Errorf("expected IRRELEVANT_TO_DEPS_GRAPH, instead got result %v", res)
-	}
-}
-
-func TestCheckBuilder_relevantToDepGraph(t *testing.T) {
-	// In this test, there are two CLs, with one of them being relevant to the Portage graph. The
-	// build thus is necessary.
-
-	build := makeBuildbucketBuild([]*bbproto.GerritChange{
-		{Host: "test-review.googlesource.com", Change: 123, Patchset: 2, Project: "chromiumos/public/example"},
-		{Host: "test-internal-review.googlesource.com", Change: 234, Patchset: 3, Project: "chromiumos/internal/example"}})
-	chRevData := git.GetChangeRevsForTest([]*git.ChangeRev{
-		{
-			ChangeRevKey: git.ChangeRevKey{
-				Host:      "test-review.googlesource.com",
-				ChangeNum: 123,
-				Revision:  2,
-			},
-			Project: "chromiumos/public/example",
-			Files:   []string{"a/b/c"},
-		},
-		{
-			ChangeRevKey: git.ChangeRevKey{
-				Host:      "test-internal-review.googlesource.com",
-				ChangeNum: 234,
-				Revision:  3,
-			},
-			Project: "chromiumos/internal/example",
-			Files:   []string{"important_stuff/important_file"},
-		},
-	})
-	depGraph := &chromite.DepGraph{
-		PackageDeps: []*chromite.PackageDepInfo{
-			{DependencySourcePaths: []*chromite.SourcePath{
-				{Path: "src/internal/ex/important_stuff"},
-			}}}}
-	repoToSrcRoot := map[string]string{
-		"chromiumos/public/example":   "src/pub/ex",
-		"chromiumos/internal/example": "src/internal/ex",
-	}
-	cfg := testplans_pb.BuildIrrelevanceCfg{}
-
-	res, err := CheckBuilder(build, chRevData, depGraph, repoToSrcRoot, cfg)
-	if err != nil {
-		t.Error(err)
-	}
-	if res.BuildIsPointless.Value {
-		t.Errorf("expected !build_is_pointless, instead got result %v", res)
-	}
-}
-
-func TestCheckBuilder_buildIrrelevantPaths(t *testing.T) {
-	// In this test, the only files touched are those that are explicitly listed as being not relevant
-	// to Portage.
-
-	build := makeBuildbucketBuild([]*bbproto.GerritChange{
-		{Host: "test-review.googlesource.com", Change: 123, Patchset: 2, Project: "chromiumos/public/example"}})
-	chRevData := git.GetChangeRevsForTest([]*git.ChangeRev{
-		{
-			ChangeRevKey: git.ChangeRevKey{
-				Host:      "test-review.googlesource.com",
-				ChangeNum: 123,
-				Revision:  2,
-			},
-			Project: "chromiumos/public/example",
-			Files: []string{
-				"chromite-maybe/someotherdir/ignore_me.txt",
-			},
-		},
-	})
-	depGraph := &chromite.DepGraph{
-		PackageDeps: []*chromite.PackageDepInfo{
-			{DependencySourcePaths: []*chromite.SourcePath{
-				{Path: "src/pub/ex/chromite-maybe"},
-			}}}}
-	repoToSrcRoot := map[string]string{
-		"chromiumos/public/example": "src/pub/ex",
-	}
-
-	cfg := testplans_pb.BuildIrrelevanceCfg{
-		IrrelevantFilePatterns: []*testplans_pb.FilePattern{
-			{Pattern: "**/ignore_me.txt"},
-		},
-	}
-
-	res, err := CheckBuilder(build, chRevData, depGraph, repoToSrcRoot, cfg)
-	if err != nil {
-		t.Error(err)
-	}
-	if !res.BuildIsPointless.Value {
-		t.Errorf("expected build_is_pointless, instead got result %v", res)
-	}
-	if res.PointlessBuildReason != testplans_pb.PointlessBuildCheckResponse_IRRELEVANT_TO_KNOWN_NON_PORTAGE_DIRECTORIES {
-		t.Errorf("expected IRRELEVANT_TO_KNOWN_NON_PORTAGE_DIRECTORIES, instead got result %v", res)
-	}
-}
-
-func TestCheckBuilder_noGerritChangesMeansNecessaryBuild(t *testing.T) {
-	build := makeBuildbucketBuild([]*bbproto.GerritChange{})
-	chRevData := git.GetChangeRevsForTest([]*git.ChangeRev{})
-	depGraph := &chromite.DepGraph{
-		PackageDeps: []*chromite.PackageDepInfo{
-			{DependencySourcePaths: []*chromite.SourcePath{
-				{Path: "src/pub/ex/chromite-maybe"},
-			}}}}
-	repoToSrcRoot := map[string]string{
-		"chromiumos/public/example": "src/pub/ex",
-	}
-	cfg := testplans_pb.BuildIrrelevanceCfg{}
-
-	res, err := CheckBuilder(build, chRevData, depGraph, repoToSrcRoot, cfg)
-	if err != nil {
-		t.Error(err)
-	}
-	if res.BuildIsPointless.Value {
-		t.Errorf("expected !build_is_pointless, instead got result %v", res)
-	}
-}
-
-func TestCheckBuild_nilDepGraphSuccessWithNoFilter(t *testing.T) {
-	// In this test, no DepGraph is provided. We expect the checker to finish successfully, and to not
-	// filter out the files.
-
-	build := makeBuildbucketBuild([]*bbproto.GerritChange{
-		{Host: "test-review.googlesource.com", Change: 123, Patchset: 2, Project: "chromiumos/public/example"}})
-	chRevData := git.GetChangeRevsForTest([]*git.ChangeRev{
-		{
-			ChangeRevKey: git.ChangeRevKey{
-				Host:      "test-review.googlesource.com",
-				ChangeNum: 123,
-				Revision:  2,
-			},
-			Project: "chromiumos/public/example",
-			Files:   []string{"a/b/c"},
-		},
-	})
-	repoToSrcRoot := map[string]string{
-		"chromiumos/public/example": "src/pub/ex",
-	}
-	cfg := testplans_pb.BuildIrrelevanceCfg{}
-
-	res, err := CheckBuilder(build, chRevData, nil, repoToSrcRoot, cfg)
-	if err != nil {
-		t.Error(err)
-	}
-	if res.BuildIsPointless.Value {
-		t.Errorf("expected !build_is_pointless, instead got result %v", res)
-	}
-}
-
-func match(t *testing.T, pattern, name string) {
-	m, err := doublestar.Match(pattern, name)
-	if err != nil {
-		t.Errorf("error trying to match pattern %s against name %s: %v", pattern, name, err)
-	} else {
-		if !m {
-			t.Errorf("expected pattern %s to match against name %s, but it did not match", pattern, name)
-		}
-	}
-}
-
-func notMatch(t *testing.T, pattern, name string) {
-	m, err := doublestar.Match(pattern, name)
-	if err != nil {
-		t.Errorf("error trying to match pattern %s against name %s: %v", pattern, name, err)
-	} else {
-		if m {
-			t.Errorf("expected pattern %s not to match against name %s, but it did match", pattern, name)
-		}
-	}
-}
-
-func TestDoubleStar(t *testing.T) {
-	// A test that demonstrates/verifies operation of the doublestar matching package.
-
-	match(t, "**/OWNERS", "OWNERS")
-	match(t, "**/OWNERS", "some/deep/subdir/OWNERS")
-	notMatch(t, "**/OWNERS", "OWNERS/fds")
-
-	match(t, "chromite/config/**", "chromite/config/config_dump.json")
-
-	match(t, "**/*.md", "a/b/c/README.md")
-}
diff --git a/src/testplans/internal/repo/manifest.go b/src/testplans/internal/repo/manifest.go
deleted file mode 100644
index 61a899f..0000000
--- a/src/testplans/internal/repo/manifest.go
+++ /dev/null
@@ -1,80 +0,0 @@
-package repo
-
-import (
-	"context"
-	"encoding/xml"
-	"go.chromium.org/luci/common/errors"
-	"log"
-	"net/http"
-	"testplans/internal/git"
-)
-
-var (
-	// Name of the root XML file to seek in manifest-internal.
-	rootXml = "snapshot.xml"
-)
-
-// Manifest is a top-level Repo definition file.
-type Manifest struct {
-	Includes []Include `xml:"include"`
-	Projects []Project `xml:"project"`
-}
-
-// Project is an element of a manifest containing a Gerrit project to source path definition.
-type Project struct {
-	Path string `xml:"path,attr"`
-	Name string `xml:"name,attr"`
-}
-
-// Include is a manifest element that imports another manifest file.
-type Include struct {
-	Name string `xml:"name,attr"`
-}
-
-func fetchManifestRecursive(authedClient *http.Client, ctx context.Context, manifestCommit string, file string) (map[string]*Manifest, error) {
-	results := make(map[string]*Manifest)
-	log.Printf("Fetching manifest file %s at revision '%s'", file, manifestCommit)
-	files, err := git.FetchFilesFromGitiles(
-		authedClient,
-		ctx,
-		"chrome-internal.googlesource.com",
-		"chromeos/manifest-internal",
-		manifestCommit,
-		[]string{file})
-	if err != nil {
-		return nil, errors.Annotate(err, "failed to fetch %s", file).Err()
-	}
-	manifest := &Manifest{}
-	if err = xml.Unmarshal([]byte((*files)[file]), manifest); err != nil {
-		return nil, errors.Annotate(err, "failed to unmarshal %s", file).Err()
-	}
-	results[file] = manifest
-	// Recursively fetch manifests listed in "include" elements.
-	for _, incl := range manifest.Includes {
-		subResults, err := fetchManifestRecursive(authedClient, ctx, manifestCommit, incl.Name)
-		if err != nil {
-			return nil, err
-		}
-		for k, v := range subResults {
-			results[k] = v
-		}
-	}
-	return results, nil
-}
-
-// GetRepoToSourceRootFromManifests constructs a Gerrit project to path mapping by fetching manifest
-// XML files from Gitiles.
-func GetRepoToSourceRootFromManifests(authedClient *http.Client, ctx context.Context, manifestCommit string) (map[string]string, error) {
-	manifests, err := fetchManifestRecursive(authedClient, ctx, manifestCommit, rootXml)
-	if err != nil {
-		return nil, err
-	}
-	repoToSourceRoot := make(map[string]string)
-	for _, m := range manifests {
-		for _, p := range m.Projects {
-			repoToSourceRoot[p.Name] = p.Path
-		}
-	}
-	log.Printf("Found %d repo to source root mappings from manifest files", len(repoToSourceRoot))
-	return repoToSourceRoot, nil
-}
diff --git a/src/testplans/internal/repo/manifest_test.go b/src/testplans/internal/repo/manifest_test.go
deleted file mode 100644
index 8866f64..0000000
--- a/src/testplans/internal/repo/manifest_test.go
+++ /dev/null
@@ -1,48 +0,0 @@
-package repo
-
-import (
-	"context"
-	"encoding/base64"
-	"github.com/golang/mock/gomock"
-	gitilespb "go.chromium.org/luci/common/proto/gitiles"
-	"net/http"
-	"testing"
-	"testplans/internal/git"
-)
-
-func TestFetchFilesFromGitiles_success(t *testing.T) {
-	ctl := gomock.NewController(t)
-	defer ctl.Finish()
-
-	// This is a base64-encoded .tar.gz file containing a snapshot of external full.xml and
-	// _remotes.xml. I apologize to your eyes. This is a good representation of what comes back from
-	// the Gitiles Archive call though.
-	base64Enc := `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`
-	// Override because this is the name of the file in the above base64 gibberish.
-	rootXml = "full.xml"
-	encodedZip, err := base64.StdEncoding.DecodeString(base64Enc)
-	if err != nil {
-		t.Error(err)
-	}
-
-	gitilesMock := gitilespb.NewMockGitilesClient(ctl)
-	gitilesMock.EXPECT().Archive(gomock.Any(), gomock.Any()).Times(2).Return(
-		&gitilespb.ArchiveResponse{
-			Contents: encodedZip,
-		},
-		nil,
-	)
-	git.MockGitiles = gitilesMock
-
-	m, err := GetRepoToSourceRootFromManifests(http.DefaultClient, context.Background(), "master")
-	if err != nil {
-		t.Error(err)
-	}
-	if len(m) != 176 {
-		t.Errorf("expected %d project mappings, found %d", 176, len(m))
-	}
-	// Make sure that a sample project is present.
-	if m["chromiumos/platform/mosys"] != "src/platform/mosys" {
-		t.Errorf("expected to find a mapping for mosys repo. Got mappings: %v", m)
-	}
-}
diff --git a/src/testplans/internal/repo/repotool.go b/src/testplans/internal/repo/repotool.go
deleted file mode 100644
index fa9b12e..0000000
--- a/src/testplans/internal/repo/repotool.go
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2019 The Chromium 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 repo
-
-import (
-	"bytes"
-	"context"
-	"fmt"
-	"log"
-	"os"
-	"os/exec"
-	"strings"
-	"time"
-)
-
-var (
-	commandRunnerImpl commandRunner = realCommandRunner{}
-)
-
-type commandRunner interface {
-	runCommand(ctx context.Context, stdoutBuf, stderrBuf *bytes.Buffer, name string, args ...string) error
-}
-
-type realCommandRunner struct{}
-
-func (c realCommandRunner) runCommand(ctx context.Context, stdoutBuf, stderrBuf *bytes.Buffer, name string, args ...string) error {
-	cmd := exec.CommandContext(ctx, name, args...)
-	cmd.Stdout = stdoutBuf
-	cmd.Stderr = stderrBuf
-	return cmd.Run()
-}
-
-// GetRepoToSourceRoot gets the mapping of Gerrit project to Chromium OS source tree path.
-func GetRepoToSourceRoot(chromiumosCheckout, repoToolPath string) (map[string]string, error) {
-	repoToSrcRoot := make(map[string]string)
-	wd, err := os.Getwd()
-	if err != nil {
-		return repoToSrcRoot, fmt.Errorf("could not get working dir, %v", err)
-	}
-	if err := os.Chdir(chromiumosCheckout); err != nil {
-		return repoToSrcRoot, fmt.Errorf("failed changing dir, %v", err)
-	}
-	defer func() {
-		if err := os.Chdir(wd); err != nil {
-			log.Fatalf("could not change working dir, %s", err)
-		}
-	}()
-	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
-	defer cancel()
-	var stdoutBuf, stderrBuf bytes.Buffer
-	if err := commandRunnerImpl.runCommand(ctx, &stdoutBuf, &stderrBuf, repoToolPath, "list"); err != nil {
-		log.Printf("Error from repo.\nstdout =\n%s\n\nstderr=\n%s", stdoutBuf.String(), stderrBuf.String())
-		return repoToSrcRoot, err
-	}
-	repos := strings.Split(stdoutBuf.String(), "\n")
-	if len(repos) < 1 {
-		return repoToSrcRoot, fmt.Errorf("expected to find at least one repo mappings. Instead, only found [%v]", repos)
-	}
-repoLoop:
-	for _, r := range repos {
-		if r == "" {
-			break repoLoop
-		}
-		split := strings.Split(r, ":")
-		if len(split) != 2 {
-			return repoToSrcRoot, fmt.Errorf("unexpected line format [%s]", r)
-		}
-		repoName := strings.TrimSpace(split[1])
-		srcRoot := strings.TrimSpace(split[0])
-		repoToSrcRoot[repoName] = srcRoot
-	}
-	return repoToSrcRoot, nil
-}
diff --git a/src/testplans/internal/repo/repotool_test.go b/src/testplans/internal/repo/repotool_test.go
deleted file mode 100644
index 6664576..0000000
--- a/src/testplans/internal/repo/repotool_test.go
+++ /dev/null
@@ -1,82 +0,0 @@
-package repo
-
-import (
-	"bytes"
-	"context"
-	"fmt"
-	"github.com/google/go-cmp/cmp"
-	"io/ioutil"
-	"os"
-	"os/exec"
-	"testing"
-)
-
-type fakeCommandRunner struct {
-	stdout             string
-	stderr             string
-	expectedWorkingDir string
-	failCommand        bool
-}
-
-func (c fakeCommandRunner) runCommand(ctx context.Context, stdoutBuf, stderrBuf *bytes.Buffer, name string, args ...string) error {
-	stdoutBuf.WriteString(c.stdout)
-	stderrBuf.WriteString(c.stderr)
-	if c.expectedWorkingDir != "" {
-		wd, err := os.Getwd()
-		if err != nil {
-			return err
-		}
-		if wd != c.expectedWorkingDir {
-			return fmt.Errorf("wrong working directory; expected %s got %s", c.expectedWorkingDir, wd)
-		}
-	}
-	if c.failCommand {
-		return &exec.ExitError{}
-	}
-	return nil
-}
-
-func TestGetRepoToSourceRoot_success(t *testing.T) {
-	f, err := ioutil.TempDir("", "repotest_tmp_dir")
-	commandRunnerImpl = fakeCommandRunner{
-		// This is a sample of `repo list` output.
-		stdout: `chromeos-admin : chromeos/chromeos-admin
-chromite : chromiumos/chromite
-`,
-		expectedWorkingDir: f,
-	}
-	if err != nil {
-		t.Error(err)
-	}
-	actual, err := GetRepoToSourceRoot(f, "repo")
-	if err != nil {
-		t.Error(err)
-	}
-	expected := map[string]string{
-		"chromeos/chromeos-admin": "chromeos-admin",
-		"chromiumos/chromite":     "chromite",
-	}
-	if diff := cmp.Diff(expected, actual); diff != "" {
-		t.Errorf("RepoToSourceRoot bad result (-want/+got)\n%s", diff)
-	}
-}
-
-func TestGetRepoToSourceRoot_repoToolFails(t *testing.T) {
-	f, err := ioutil.TempDir("", "repotest_tmp_dir")
-	commandRunnerImpl = fakeCommandRunner{
-		expectedWorkingDir: f,
-		// Simulate the `repo list` command returning a nonzero exit code.
-		failCommand: true,
-	}
-	if err != nil {
-		t.Error(err)
-	}
-	_, err = GetRepoToSourceRoot(f, "repo")
-	if err == nil {
-		t.Error("expected an error")
-	}
-	_, ok := err.(*exec.ExitError)
-	if !ok {
-		t.Errorf("expected err to be an instance of ExitError, instead got %v", err.Error())
-	}
-}
diff --git a/src/testplans/internal/shared/retry.go b/src/testplans/internal/shared/retry.go
deleted file mode 100644
index 63848e8..0000000
--- a/src/testplans/internal/shared/retry.go
+++ /dev/null
@@ -1,48 +0,0 @@
-package shared
-
-import (
-	"context"
-	"fmt"
-	"log"
-	"math"
-	"time"
-)
-
-// Options wraps retry options.
-type Options struct {
-	BaseDelay   time.Duration // backoff base delay.
-	BackoffBase float64       // base for exponential backoff
-	Retries     int           // allowed number of retries.
-}
-
-// DoFunc is a function type that can be retried by DoWithRetry if the return error is not nil.
-type DoFunc func() error
-
-var (
-	DefaultOpts = Options{BaseDelay: time.Second, BackoffBase: 2.0, Retries: 5}
-)
-
-// DoWithRetry executes function doFunc. If there is an error, it will retry with a backoff delay
-// until max retry times reached or context done.
-// If retryOpts.Retries == 0, it will execute doFunc just once without any retries.
-// If retryOpts.Retries < 0, it retries an infinite number of times.
-func DoWithRetry(ctx context.Context, retryOpts Options, doFunc DoFunc) error {
-	for i := 0; retryOpts.Retries < 0 || i <= retryOpts.Retries; i++ {
-		var d time.Duration
-		if i > 0 {
-			d = time.Duration(float64(retryOpts.BaseDelay) * math.Pow(retryOpts.BackoffBase, float64(i-1)))
-			log.Printf("Sleeping for %s before trying again", d.String())
-		}
-		select {
-		case <-ctx.Done():
-			return ctx.Err()
-		case <-time.After(d):
-			err := doFunc()
-			if err == nil {
-				return nil
-			}
-			log.Printf("DoWithRetry [%d]: %v", i, err)
-		}
-	}
-	return fmt.Errorf("failed after %d retries", retryOpts.Retries)
-}
diff --git a/src/testplans/internal/shared/retry_test.go b/src/testplans/internal/shared/retry_test.go
deleted file mode 100644
index 4fff6a3..0000000
--- a/src/testplans/internal/shared/retry_test.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package shared
-
-import (
-	"context"
-	"errors"
-	"testing"
-	"time"
-)
-
-func TestDoWithRetry_error(t *testing.T) {
-	opts := Options{
-		BackoffBase: 0,
-		BaseDelay:   0 * time.Second,
-		Retries:     5,
-	}
-	err := DoWithRetry(context.Background(), opts, func() error {
-		return errors.New("throw!")
-	})
-	if err == nil {
-		t.Errorf("Expected an error, but got none")
-	}
-}
-
-func TestDoWithRetry_success(t *testing.T) {
-	opts := Options{
-		BackoffBase: 0,
-		BaseDelay:   0 * time.Second,
-		Retries:     5,
-	}
-	err := DoWithRetry(context.Background(), opts, func() error {
-		return nil
-	})
-	if err != nil {
-		t.Errorf("Expected no error, but got %v", err)
-	}
-}
diff --git a/src/testplans/run_tests.sh b/src/testplans/run_tests.sh
deleted file mode 100755
index c401ba8..0000000
--- a/src/testplans/run_tests.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-#
-# Runs all of the Go tests in this module.
-# This file shouldn't really be necessary. We should be able to just run
-# "go test .", but the module definition isn't quite right at the moment.
-
-# Move to this script's directory.
-cd "$(dirname "$0")"
-
-test_dirs=$(find . -name '*_test.go' -exec dirname {} \; | sort | uniq)
-for d in $test_dirs; do
-  echo "Testing ${d}"
-  go test $d/*
-done
-