cmd/gomote: implements GRPC rm command

This change adds the implementation for GRPC rm command to the gomote client.

Updates golang/go#48737
For golang/go#47521

Change-Id: Iaf1ed08d155cbad11c7aa2b74a9535f4b32233ca
Reviewed-on: https://go-review.googlesource.com/c/build/+/405515
Reviewed-by: Heschi Kreinick <heschi@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Alex Rakoczy <alex@golang.org>
diff --git a/cmd/gomote/gomote.go b/cmd/gomote/gomote.go
index 4df0288..1bdbb52 100644
--- a/cmd/gomote/gomote.go
+++ b/cmd/gomote/gomote.go
@@ -160,7 +160,7 @@
 	registerCommand("put14", "put Go 1.4 in place", put14)
 	registerCommand("puttar", "extract a tar.gz to a buildlet", putTar)
 	registerCommand("rdp", "RDP (Remote Desktop Protocol) to a Windows buildlet", rdp)
-	registerCommand("rm", "delete files or directories", rm)
+	registerCommand("rm", "delete files or directories", legacyRm)
 	registerCommand("run", "run a command on a buildlet", legacyRun)
 	registerCommand("ssh", "ssh to a buildlet", legacySSH)
 	registerCommand("v2", "version 2 of the gomote commands", version2)
@@ -223,6 +223,7 @@
 		"run":     run,
 		"ping":    ping,
 		"ssh":     ssh,
+		"rm":      rm,
 	}
 	if len(args) == 0 {
 		usage()
diff --git a/cmd/gomote/rm.go b/cmd/gomote/rm.go
index 7350f9a..9b427df 100644
--- a/cmd/gomote/rm.go
+++ b/cmd/gomote/rm.go
@@ -9,9 +9,11 @@
 	"flag"
 	"fmt"
 	"os"
+
+	"golang.org/x/build/internal/gomote/protos"
 )
 
-func rm(args []string) error {
+func legacyRm(args []string) error {
 	fs := flag.NewFlagSet("rm", flag.ContinueOnError)
 	fs.Usage = func() {
 		fmt.Fprintln(os.Stderr, "rm usage: gomote rm <instance> <file-or-dir>+")
@@ -33,3 +35,29 @@
 	ctx := context.Background()
 	return bc.RemoveAll(ctx, args...)
 }
+
+func rm(args []string) error {
+	fs := flag.NewFlagSet("rm", flag.ContinueOnError)
+	fs.Usage = func() {
+		fmt.Fprintln(os.Stderr, "rm usage: gomote rm <instance> <file-or-dir>+")
+		fmt.Fprintln(os.Stderr, "          gomote rm <instance> .  (to delete everything)")
+		fs.PrintDefaults()
+		os.Exit(1)
+	}
+	fs.Parse(args)
+
+	if fs.NArg() < 2 {
+		fs.Usage()
+	}
+	name := fs.Arg(0)
+	args = fs.Args()[1:]
+	ctx := context.Background()
+	client := gomoteServerClient(ctx)
+	if _, err := client.RemoveFiles(ctx, &protos.RemoveFilesRequest{
+		GomoteId: name,
+		Paths:    args,
+	}); err != nil {
+		return fmt.Errorf("unable to remove files: %s", statusFromError(err))
+	}
+	return nil
+}