internal/relui: render artifacts without targets

Some of our older artifact results may not have a target. We should
still be able to render the page regardless.

Cleans up a duplicative variable in the home template.

For golang/go#53295

Change-Id: I55f56bb1dd71b828c262869173af34e95799d6fa
Reviewed-on: https://go-review.googlesource.com/c/build/+/413580
Run-TryBot: Alex Rakoczy <alex@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Auto-Submit: Alex Rakoczy <alex@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
diff --git a/internal/relui/templates/task_list.html b/internal/relui/templates/task_list.html
index b5df9c5..a2882ab 100644
--- a/internal/relui/templates/task_list.html
+++ b/internal/relui/templates/task_list.html
@@ -112,35 +112,38 @@
 {{end}}
 
 {{define "itemResult"}}
-  {{$resultDetail := .}}
-  {{if eq $resultDetail.Kind "Artifact"}}
+  {{if eq .Kind "Artifact"}}
     <dl class="TaskList-itemResultDetailList">
       <dt class="TaskList-itemResultTerm">Name</dt>
       <dd class="TaskList-itemResultDefinition">
-          {{$resultDetail.Artifact.Target.Name}}
+        {{with .Artifact.Target}}
+          {{.Name}}
+        {{else}}
+          {{.Artifact.Filename}}
+        {{end}}
       </dd>
       <dt class="TaskList-itemResultTerm">Filename</dt>
       <dd class="TaskList-itemResultDefinition">
-          {{$resultDetail.Artifact.Filename}}
+          {{.Artifact.Filename}}
       </dd>
       <dt class="TaskList-itemResultTerm">ScratchPath</dt>
       <dd class="TaskList-itemResultDefinition">
-          {{$resultDetail.Artifact.ScratchPath}}
+          {{.Artifact.ScratchPath}}
       </dd>
       <dt class="TaskList-itemResultTerm">StagingPath</dt>
       <dd class="TaskList-itemResultDefinition">
-          {{$resultDetail.Artifact.StagingPath}}
+          {{.Artifact.StagingPath}}
       </dd>
     </dl>
-  {{else if eq $resultDetail.Kind "Artifacts"}}
+  {{else if eq .Kind "Artifacts"}}
     <dt class="TaskList-itemResultTerm">Filenames</dt>
     <dd class="TaskList-itemResultDefinition">
-        {{range $artifact := $resultDetail.Artifacts}}
+        {{range $artifact := .Artifacts}}
             {{$artifact.Filename}} <span class="TaskList-itemResultArtifactSize">{{prettySize $artifact.Size}}</span>
         {{end}}
     </dd>
-  {{else if eq $resultDetail.Kind "Outputs"}}
-    {{range $key, $value := $resultDetail.Outputs}}
+  {{else if eq .Kind "Outputs"}}
+    {{range $key, $value := .Outputs}}
       <dt class="TaskList-itemResultTerm">
         {{$key}}
       </dt>
@@ -148,8 +151,8 @@
         {{template "itemResult" $value}}
       </dd>
     {{end}}
-  {{else if eq $resultDetail.Kind "JSON"}}
-    {{range $key, $value := $resultDetail.JSON}}
+  {{else if eq .Kind "JSON"}}
+    {{range $key, $value := .JSON}}
       <dt class="TaskList-itemResultTerm">
         {{$key}}
         </dt>
@@ -157,12 +160,12 @@
         {{$value}}
       </dd>
     {{end}}
-  {{else if eq $resultDetail.Kind "String"}}
+  {{else if eq .Kind "String"}}
     <dt class="TaskList-itemResultTerm">
       String
     </dt>
     <dd class="TaskList-itemResultDefinition TaskList-itemResultDefinition--string">
-      {{$resultDetail.String}}
+      {{.String}}
     </dd>
   {{end}}
 {{end}}
diff --git a/internal/relui/web_test.go b/internal/relui/web_test.go
index 6060e73..6d4638c 100644
--- a/internal/relui/web_test.go
+++ b/internal/relui/web_test.go
@@ -26,6 +26,7 @@
 	"github.com/google/uuid"
 	"github.com/jackc/pgx/v4"
 	"github.com/jackc/pgx/v4/pgxpool"
+	"golang.org/x/build/internal/releasetargets"
 	"golang.org/x/build/internal/relui/db"
 	"golang.org/x/build/internal/workflow"
 )
@@ -105,7 +106,11 @@
 	if _, err := q.CreateWorkflow(ctx, wf); err != nil {
 		t.Fatalf("CreateWorkflow(_, %v) = _, %v, wanted no error", wf, err)
 	}
-	tp := db.CreateTaskParams{WorkflowID: wf.ID, Name: "TestTask"}
+	tp := db.CreateTaskParams{
+		WorkflowID: wf.ID,
+		Name:       "TestTask",
+		Result:     nullString(`{"Filename": "foo.exe"}`),
+	}
 	if _, err := q.CreateTask(ctx, tp); err != nil {
 		t.Fatalf("CreateTask(_, %v) = _, %v, wanted no error", tp, err)
 	}
@@ -791,6 +796,18 @@
 			wantKind: "String",
 		},
 		{
+			desc:     "artifact",
+			input:    `{"Filename": "foo.exe", "Target": {"Name": "windows-test"}}`,
+			want:     &resultDetail{Artifact: artifact{Filename: "foo.exe", Target: &releasetargets.Target{Name: "windows-test"}}},
+			wantKind: "Artifact",
+		},
+		{
+			desc:     "artifact missing target",
+			input:    `{"Filename": "foo.exe"}`,
+			want:     &resultDetail{Artifact: artifact{Filename: "foo.exe"}},
+			wantKind: "Artifact",
+		},
+		{
 			desc:     "nested json string",
 			input:    `{"SomeOutput": "hello"}`,
 			want:     &resultDetail{Outputs: map[string]*resultDetail{"SomeOutput": {String: "hello"}}},