Add durations for individual presubmit steps

The time of a regular presubmit time has increased. To ease debugging
now and in the future, add the durations of each individual step
to the logs.

Since _checkWithNodeScript and all non-Node steps rely on
_ExecuteSubProcess we only need to implement it there.

Also reorder the presubmit outputs such that we only print "Running
X check" when we actually run it.

R=petermarshall@chromium.org

Bug: 1116989
Change-Id: I1f30c3b5dadb961ebfbfef56d50bd9347e9069f2
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2367941
Commit-Queue: Tim van der Lippe <tvanderlippe@chromium.org>
Reviewed-by: Peter Marshall <petermarshall@chromium.org>
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index fc41753..1dcbd61 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -34,6 +34,7 @@
 
 import sys
 import six
+import time
 
 EXCLUSIVE_CHANGE_DIRECTORIES = [
     [ 'third_party', 'v8' ],
@@ -48,12 +49,17 @@
     if isinstance(script_path, six.string_types):
         script_path = [input_api.python_executable, script_path]
 
+    start_time = time.time()
     process = input_api.subprocess.Popen(script_path + args, stdout=input_api.subprocess.PIPE, stderr=input_api.subprocess.STDOUT)
     out, _ = process.communicate()
+    end_time = time.time()
+
+    time_difference = end_time - start_time
+    time_info = "Script execution time was %.1fs seconds\n" % (time_difference)
     if process.returncode != 0:
-        results.append(output_api.PresubmitError(out))
+        results.append(output_api.PresubmitError(time_info + out))
     else:
-        results.append(output_api.PresubmitNotifyResult(out))
+        results.append(output_api.PresubmitNotifyResult(time_info + out))
     return results
 
 
@@ -101,10 +107,6 @@
 
 
 def _CheckExperimentTelemetry(input_api, output_api):
-    results = [
-        output_api.PresubmitNotifyResult('Running Experiment Telemetry check:')
-    ]
-
     experiment_telemetry_files = [
         input_api.os_path.join(input_api.PresubmitLocalPath(), 'front_end',
                                'main', 'MainImpl.js'),
@@ -115,8 +117,14 @@
                                             experiment_telemetry_files, [],
                                             ['.js'])
     if len(affected_main_files) == 0:
-        return results
+        return [
+            output_api.PresubmitNotifyResult(
+                'No affected files for telemetry check')
+        ]
 
+    results = [
+        output_api.PresubmitNotifyResult('Running Experiment Telemetry check:')
+    ]
     script_path = input_api.os_path.join(input_api.PresubmitLocalPath(),
                                          'scripts', 'check_experiments.js')
     results.extend(_checkWithNodeScript(input_api, output_api, script_path))
@@ -143,7 +151,6 @@
 
 
 def _CheckDevtoolsLocalization(input_api, output_api, check_all_files=False):  # pylint: disable=invalid-name
-    results = [output_api.PresubmitNotifyResult('Running Localization Checks:')]
     devtools_root = input_api.PresubmitLocalPath()
     script_path = input_api.os_path.join(devtools_root, 'scripts', 'test', 'run_localization_check.py')
     if check_all_files == True:
@@ -155,7 +162,10 @@
                                                      ['.js', '.grdp', '.grd', 'module.json'])
 
         if len(affected_front_end_files) == 0:
-            return results
+            return [
+                output_api.PresubmitNotifyResult(
+                    'No affected files for localization check')
+            ]
 
         with input_api.CreateTemporaryFile() as file_list:
             for affected_file in affected_front_end_files:
@@ -165,13 +175,14 @@
         # Scan only added or modified files with specific extensions.
         args = ['--autofix', '--file-list', file_list.name]
 
+    results = [
+        output_api.PresubmitNotifyResult('Running Localization Checks:')
+    ]
     return _ExecuteSubProcess(input_api, output_api, script_path, args, results)
 
 
 def _CheckDevToolsStyleJS(input_api, output_api):
-    results = [
-        output_api.PresubmitNotifyResult('Running DevTools JS style check:')
-    ]
+    results = [output_api.PresubmitNotifyResult('JS style check:')]
     lint_path = input_api.os_path.join(input_api.PresubmitLocalPath(),
                                        'scripts', 'test',
                                        'run_lint_check_js.js')
@@ -216,9 +227,7 @@
 
 
 def _CheckDevToolsStyleCSS(input_api, output_api):
-    results = [
-        output_api.PresubmitNotifyResult('Running DevTools CSS style check:')
-    ]
+    results = [output_api.PresubmitNotifyResult('CSS style check:')]
     lint_path = input_api.os_path.join(input_api.PresubmitLocalPath(),
                                        'scripts', 'test',
                                        'run_lint_check_css.py')
@@ -256,11 +265,12 @@
 
 
 def _CheckOptimizeSVGHashes(input_api, output_api):
+    if not input_api.platform.startswith('linux'):
+        return [output_api.PresubmitNotifyResult('Skipping SVG hash check')]
+
     results = [
         output_api.PresubmitNotifyResult('Running SVG optimization check:')
     ]
-    if not input_api.platform.startswith('linux'):
-        return results
 
     original_sys_path = sys.path
     try:
@@ -311,7 +321,10 @@
     ], [], ['.pdl', '.json5', '.py', '.js'])
 
     if len(affected_files) == 0:
-        return []
+        return [
+            output_api.PresubmitNotifyResult(
+                'No affected files for generated files check')
+        ]
 
     results = [output_api.PresubmitNotifyResult('Running Generated Files Check:')]
     generate_protocol_resources_path = input_api.os_path.join(input_api.PresubmitLocalPath(), 'scripts', 'deps',