Upload test logs with a UTF-8 content type (#2117)

This fixes rendering of test `.log` files when opened in a browser.

Updating the deps was required to get the project to compile due to:
```
error[E0635]: unknown feature `proc_macro_span_shrink`
  --> /Users/fmeum/.cargo/registry/src/index.crates.io-6f17d22bba15001f/proc-macro2-1.0.56/src/lib.rs:92:30
   |
92 |     feature(proc_macro_span, proc_macro_span_shrink)
   |                              ^^^^^^^^^^^^^^^^^^^^^^
```

Update command:
```
cargo update proc-macro2 --precise 1.0.60
```
diff --git a/agent/Cargo.lock b/agent/Cargo.lock
index 2ef353e..95717f4 100644
--- a/agent/Cargo.lock
+++ b/agent/Cargo.lock
@@ -1,6 +1,6 @@
 # This file is automatically @generated by Cargo.
 # It is not intended for manual editing.
-version = 3
+version = 4
 
 [[package]]
 name = "aho-corasick"
@@ -690,9 +690,9 @@
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.56"
+version = "1.0.60"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435"
+checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406"
 dependencies = [
  "unicode-ident",
 ]
diff --git a/agent/src/artifact/upload.rs b/agent/src/artifact/upload.rs
index ec774cf..3afeb10 100644
--- a/agent/src/artifact/upload.rs
+++ b/agent/src/artifact/upload.rs
@@ -210,7 +210,7 @@
     build_event_json_file: &Path,
     mode: Mode,
 ) -> Result<()> {
-    uploader.upload_artifact(dry, None, build_event_json_file, mode)
+    uploader.upload_artifact(dry, None, build_event_json_file, mode, None)
 }
 
 fn gen_error_content(bazelci_task: &str, label: &str, name: &str, test_log: &str) -> String {
@@ -329,7 +329,7 @@
     Ok(Some(writer.into_inner().into_inner()))
 }
 
-fn execute_command(dry: bool, cwd: Option<&Path>, program: &str, args: &[&str]) -> Result<()> {
+fn execute_command(dry: bool, cwd: Option<&Path>, program: &str, args: &Vec<&str>) -> Result<()> {
     println!("{} {}", program, args.join(" "));
 
     if dry {
@@ -384,6 +384,7 @@
         cwd: Option<&Path>,
         artifact: &Path,
         mode: Mode,
+        content_type: Option<&str>,
     ) -> Result<()> {
         {
             let file = match cwd {
@@ -405,7 +406,7 @@
         }
 
         match mode {
-            Mode::Buildkite => self.upload_artifact_buildkite(dry, cwd, artifact),
+            Mode::Buildkite => self.upload_artifact_buildkite(dry, cwd, artifact, content_type),
         }
     }
 
@@ -414,14 +415,17 @@
         dry: bool,
         cwd: Option<&Path>,
         artifact: &Path,
+        content_type: Option<&str>,
     ) -> Result<()> {
         let artifact = artifact.display().to_string();
-        execute_command(
-            dry,
-            cwd,
-            "buildkite-agent",
-            &["artifact", "upload", artifact.as_str()],
-        )
+        let mut args = vec!["artifact", "upload", artifact.as_str()];
+        let ct_arg = content_type
+            .map(|ct| "--content_type=".to_owned() + ct)
+            .unwrap_or_default();
+        if !ct_arg.is_empty() {
+            args.push(ct_arg.as_str());
+        }
+        execute_command(dry, cwd, "buildkite-agent", &args)
     }
 
     fn upload_test_analytics(
@@ -631,7 +635,13 @@
     mode: Mode,
 ) -> Result<()> {
     let (cwd, artifact) = resolve_artifact(test_log, local_exec_root)?;
-    return uploader.upload_artifact(dry, cwd.as_ref().map(|pb| pb.as_path()), &artifact, mode);
+    return uploader.upload_artifact(
+        dry,
+        cwd.as_ref().map(|pb| pb.as_path()),
+        &artifact,
+        mode,
+        Some("text/plain;encoding=utf-8"),
+    );
 }
 
 fn upload_test_xml(
diff --git a/agent/tests/artifact/upload.rs b/agent/tests/artifact/upload.rs
index 780bc16..0739032 100644
--- a/agent/tests/artifact/upload.rs
+++ b/agent/tests/artifact/upload.rs
@@ -19,7 +19,7 @@
     ]);
     cmd.assert()
         .success()
-        .stdout(predicates::str::contains("buildkite-agent artifact upload src\\test\\shell\\bazel\\resource_compiler_toolchain_test\\test.log"));
+        .stdout(predicates::ord::eq("buildkite-agent artifact upload src\\test\\shell\\bazel\\resource_compiler_toolchain_test\\test.log --content_type=text/plain;encoding=utf-8\n"));
 
     Ok(())
 }
@@ -37,7 +37,7 @@
     ]);
     cmd.assert()
         .success()
-        .stdout(predicates::str::contains("buildkite-agent artifact upload src/test/shell/bazel/starlark_repository_test/shard_4_of_6/test_attempts/attempt_1.log"));
+        .stdout(predicates::ord::eq("buildkite-agent artifact upload src/test/shell/bazel/starlark_repository_test/shard_4_of_6/test_attempts/attempt_1.log --content_type=text/plain;encoding=utf-8\n"));
 
     Ok(())
 }