pw_env_setup: Add durations to steps

Example output:

  Setting up CIPD package manager...done (12.9s)
  Setting up Python environment.....done (1m18.3s)
  Setting up Host tools.............done (0.1s)

Change-Id: I987b4cfa3cd37974f401d36aeca3d7d6e4f31d30
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/49760
Pigweed-Auto-Submit: Rob Mohr <mohrr@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed.google.com.iam.gserviceaccount.com>
Reviewed-by: Keir Mierle <keir@google.com>
diff --git a/pw_env_setup/py/pw_env_setup/env_setup.py b/pw_env_setup/py/pw_env_setup/env_setup.py
index 38f1e9b..4d53f45 100755
--- a/pw_env_setup/py/pw_env_setup/env_setup.py
+++ b/pw_env_setup/py/pw_env_setup/env_setup.py
@@ -33,6 +33,7 @@
 import shutil
 import subprocess
 import sys
+import time
 
 # TODO(pwbug/67): Remove import hacks once the oxidized prebuilt binaries are
 # proven stable for first-time bootstrapping. For now, continue to support
@@ -129,8 +130,17 @@
     def ok(self):
         return self._status in {_Result.Status.DONE, _Result.Status.SKIPPED}
 
-    def status_str(self):
-        return self._status
+    def status_str(self, duration=None):
+        if not duration:
+            return self._status
+
+        duration_parts = []
+        if duration > 60:
+            minutes = int(duration // 60)
+            duration %= 60
+            duration_parts.append('{}m'.format(minutes))
+        duration_parts.append('{:.1f}s'.format(duration))
+        return '{} ({})'.format(self._status, ''.join(duration_parts))
 
     def messages(self):
         return self._messages
@@ -317,11 +327,13 @@
                 newline=False,
             )
 
+            start = time.time()
             spin = spinner.Spinner()
             with spin():
                 result = step(spin)
+            stop = time.time()
 
-            self._log(result.status_str())
+            self._log(result.status_str(stop - start))
 
             self._env.echo(result.status_str())
             for message in result.messages():