led: improvements in led get-build subcommand.

1. Support buildbucekt ID copied from MILO URL which has "b" prefix.
Thus the following two commands are the same:
  $ led get-build b123
  $ led get-build 123

2. ... and don't panic with nullptr deref if build=123 doesn't exist,
but print error returned by buildbucket instead.

R=iannucci@chromium.org

Bug:
Change-Id: I9e8482100f3091a2a45a5ac49b0c4f2bc418924a
Reviewed-on: https://chromium-review.googlesource.com/777989
Commit-Queue: Andrii Shyshkalov <tandrii@chromium.org>
Reviewed-by: Robbie Iannucci <iannucci@chromium.org>
diff --git a/go/src/infra/tools/led/cmd_get_build.go b/go/src/infra/tools/led/cmd_get_build.go
index 0285439..65cf228 100644
--- a/go/src/infra/tools/led/cmd_get_build.go
+++ b/go/src/infra/tools/led/cmd_get_build.go
@@ -26,7 +26,10 @@
 	return &subcommands.Command{
 		UsageLine: "get-build <buildbucket_build_id>",
 		ShortDesc: "obtain a JobDefinition from a buildbucket build",
-		LongDesc:  `Obtains the build's definition from buildbucket and produces a JobDefinition.`,
+		LongDesc: `Obtains the build's definition from buildbucket and produces a JobDefinition.
+
+buildbucket_build_id can be specified with "b" prefix like b8962624445013664976,
+which is useful when copying it from ci.chromium.org URL.`,
 
 		CommandRun: func() subcommands.CommandRun {
 			ret := &cmdGetBuild{}
@@ -67,7 +70,12 @@
 		return
 	}
 
-	if c.buildID, err = strconv.ParseInt(args[0], 10, 64); err != nil {
+	buildIdStr := args[0]
+	if strings.HasPrefix(buildIdStr, "b") {
+		// Milo URL structure prefixes buildbucket builds id with "b".
+		buildIdStr = args[0][1:]
+	}
+	if c.buildID, err = strconv.ParseInt(buildIdStr, 10, 64); err != nil {
 		err = errors.Annotate(err, "bad <buildbucket_build_id>").Err()
 		return
 	}
@@ -92,6 +100,9 @@
 	if err != nil {
 		return transient.Tag.Apply(err)
 	}
+	if answer.Error != nil {
+		return errors.New(answer.Error.Reason)
+	}
 	logging.Infof(ctx, "getting build definition: done")
 
 	swarmingTaskID := ""