Fix test runner crash when not in a git repo
authorDavid Eichmann <EichmannD@gmail.com>
Tue, 19 Feb 2019 11:38:51 +0000 (11:38 +0000)
committerMarge Bot <ben+marge-bot@smart-cactus.org>
Thu, 21 Feb 2019 09:20:09 +0000 (04:20 -0500)
Respect `inside_git_repo()` when checking performance stats.

testsuite/driver/perf_notes.py
testsuite/driver/runtests.py
testsuite/driver/testlib.py

index 365732c..2b48353 100644 (file)
@@ -23,13 +23,17 @@ from testutil import passed, failBecause
 
 # Check if "git rev-parse" can be run successfully.
 # True implies the current directory is a git repo.
 
 # Check if "git rev-parse" can be run successfully.
 # True implies the current directory is a git repo.
+_inside_git_repo_cache = None
 def inside_git_repo():
 def inside_git_repo():
-    try:
-        subprocess.check_call(['git', 'rev-parse', 'HEAD'],
-                              stdout=subprocess.DEVNULL)
-        return True
-    except subprocess.CalledProcessError:
-        return False
+    global _inside_git_repo_cache
+    if _inside_git_repo_cache == None:
+        try:
+            subprocess.check_call(['git', 'rev-parse', 'HEAD'],
+                                stdout=subprocess.DEVNULL)
+            _inside_git_repo_cache = True
+        except subprocess.CalledProcessError:
+            _inside_git_repo_cache = False
+    return _inside_git_repo_cache
 
 # Check if the worktree is dirty.
 def is_worktree_dirty():
 
 # Check if the worktree is dirty.
 def is_worktree_dirty():
index f61ebbc..51f682e 100644 (file)
@@ -122,8 +122,7 @@ if args.verbose is not None:
 # Note force skip perf tests: skip if this is not a git repo (estimated with inside_git_repo)
 # and no metrics file is given. In this case there is no way to read the previous commit's
 # perf test results, nor a way to store new perf test results.
 # Note force skip perf tests: skip if this is not a git repo (estimated with inside_git_repo)
 # and no metrics file is given. In this case there is no way to read the previous commit's
 # perf test results, nor a way to store new perf test results.
-canGitStatus = inside_git_repo()
-forceSkipPerfTests = not hasMetricsFile and not canGitStatus
+forceSkipPerfTests = not hasMetricsFile and not inside_git_repo()
 config.skip_perf_tests = args.skip_perf_tests or forceSkipPerfTests
 config.only_perf_tests = args.only_perf_tests
 
 config.skip_perf_tests = args.skip_perf_tests or forceSkipPerfTests
 config.only_perf_tests = args.only_perf_tests
 
@@ -371,14 +370,14 @@ else:
     spacing = "       "
     if forceSkipPerfTests and not args.skip_perf_tests:
         print()
     spacing = "       "
     if forceSkipPerfTests and not args.skip_perf_tests:
         print()
-        print(str_warn('Skipping All Performance Tests') + ' `git status` exited with non-zero exit code.')
-        print(spacing + 'Git is required because performance test results are compared with the previous git commit\'s results (stored with git notes).')
+        print(str_warn('Skipping All Performance Tests') + ' `git` exited with non-zero exit code.')
+        print(spacing + 'Git is required because performance test results are compared with ancestor git commits\' results (stored with git notes).')
         print(spacing + 'You can still run the tests without git by specifying an output file with --metrics-file FILE.')
 
     # Warn of new metrics.
     new_metrics = [metric for (change, metric) in t.metrics if change == MetricChange.NewMetric]
     if any(new_metrics):
         print(spacing + 'You can still run the tests without git by specifying an output file with --metrics-file FILE.')
 
     # Warn of new metrics.
     new_metrics = [metric for (change, metric) in t.metrics if change == MetricChange.NewMetric]
     if any(new_metrics):
-        if canGitStatus:
+        if inside_git_repo():
             reason = 'a baseline (expected value) cannot be recovered from' + \
                 ' previous git commits. This may be due to HEAD having' + \
                 ' new tests or having expected changes, the presence of' + \
             reason = 'a baseline (expected value) cannot be recovered from' + \
                 ' previous git commits. This may be due to HEAD having' + \
                 ' new tests or having expected changes, the presence of' + \
@@ -421,7 +420,7 @@ else:
         print('Appending ' + str(len(stats)) + ' stats to file: ' + config.metrics_file)
         with open(config.metrics_file, 'a') as file:
             file.write("\n" + Perf.format_perf_stat(stats))
         print('Appending ' + str(len(stats)) + ' stats to file: ' + config.metrics_file)
         with open(config.metrics_file, 'a') as file:
             file.write("\n" + Perf.format_perf_stat(stats))
-    elif canGitStatus and any(stats):
+    elif inside_git_repo() and any(stats):
         if is_worktree_dirty():
             print()
             print(str_warn('Performance Metrics NOT Saved') + \
         if is_worktree_dirty():
             print()
             print(str_warn('Performance Metrics NOT Saved') + \
index e800772..fb7888c 100644 (file)
@@ -1182,7 +1182,7 @@ def metric_dict(name, way, metric, value):
 # Returns a pass/fail object. Passes if the stats are withing the expected value ranges.
 # This prints the results for the user.
 def check_stats(name, way, stats_file, range_fields):
 # Returns a pass/fail object. Passes if the stats are withing the expected value ranges.
 # This prints the results for the user.
 def check_stats(name, way, stats_file, range_fields):
-    head_commit = Perf.commit_hash('HEAD')
+    head_commit = Perf.commit_hash('HEAD') if Perf.inside_git_repo() else None
     result = passed()
     if range_fields:
         try:
     result = passed()
     if range_fields:
         try:
@@ -1205,7 +1205,8 @@ def check_stats(name, way, stats_file, range_fields):
                 change = None
 
                 # If this is the first time running the benchmark, then pass.
                 change = None
 
                 # If this is the first time running the benchmark, then pass.
-                baseline = baseline_and_dev[0](way, head_commit)
+                baseline = baseline_and_dev[0](way, head_commit) \
+                    if Perf.inside_git_repo() else None
                 if baseline == None:
                     metric_result = passed()
                     change = MetricChange.NewMetric
                 if baseline == None:
                     metric_result = passed()
                     change = MetricChange.NewMetric