From 0980de3da64e273a363dace79e56345bc4ed2dbc Mon Sep 17 00:00:00 2001
From: Florian Fischer <florian.fl.fischer@fau.de>
Date: Fri, 13 Dec 2019 16:14:37 +0100
Subject: [PATCH] move allocbench_version to facter and make the facts a global
 variable of facter.py

---
 bench.py          | 11 ++++++-----
 merge.py          |  6 ++++--
 src/benchmark.py  |  2 +-
 src/facter.py     | 45 +++++++++++++++++++++++++++++----------------
 src/globalvars.py |  3 ---
 src/util.py       | 25 -------------------------
 summarize.py      |  5 +++--
 7 files changed, 43 insertions(+), 54 deletions(-)

diff --git a/bench.py b/bench.py
index fa16854..9f4a6c1 100755
--- a/bench.py
+++ b/bench.py
@@ -33,7 +33,7 @@ import src.globalvars
 from src.util import find_cmd
 from src.util import print_status, print_warn, print_error
 from src.util import print_info, print_info2, print_debug
-from src.util import print_license_and_exit, print_version_and_exit
+from src.util import print_license_and_exit
 
 
 def epilog():
@@ -46,7 +46,7 @@ def epilog():
         else:
             endtime = datetime.datetime.now().isoformat()
             endtime = endtime[:endtime.rfind(':')]
-            src.globalvars.facts["endtime"] = endtime
+            src.facter.FACTS["endtime"] = endtime
             src.facter.store_facts(src.globalvars.resdir)
 
     # remove a left over status file if some is present
@@ -116,7 +116,8 @@ def main():
         print_license_and_exit()
 
     if args.version:
-        print_version_and_exit()
+        print(src.facter.allocbench_version())
+        exit(0)
 
     atexit.register(epilog)
 
@@ -156,8 +157,8 @@ def main():
         src.globalvars.resdir = os.path.join(args.resultdir)
     else:
         src.globalvars.resdir = os.path.join("results",
-                                             src.globalvars.facts["hostname"],
-                                             src.globalvars.facts["starttime"])
+                                             src.facter.FACTS["hostname"],
+                                             src.facter.FACTS["starttime"])
 
     print_status("Writing results to:", src.globalvars.resdir)
     os.makedirs(src.globalvars.resdir, exist_ok=True)
diff --git a/merge.py b/merge.py
index 4812c37..77fe73c 100755
--- a/merge.py
+++ b/merge.py
@@ -25,7 +25,8 @@ import os
 import pickle
 import sys
 
-from src.util import print_license_and_exit, print_version_and_exit
+import src.facter
+from src.util import print_license_and_exit
 
 def load_file(filename):
     if filename.endswith("json"):
@@ -41,7 +42,8 @@ def main():
         print_license_and_exit()
 
     if "--version" in sys.argv:
-        print_version_and_exit()
+        print(src.facter.allocbench_version())
+        exit(0)
 
     parser = argparse.ArgumentParser(description="Merge to allocbench results")
     parser.add_argument("src", help="results which should be merged into dest", type=str)
diff --git a/src/benchmark.py b/src/benchmark.py
index bbb6d50..905a11f 100644
--- a/src/benchmark.py
+++ b/src/benchmark.py
@@ -734,7 +734,7 @@ class Benchmark:
         print(comment_symbol, self.name, file=f)
         print(file=f)
         print(comment_symbol, "Common facts:", file=f)
-        for k, v in src.globalvars.facts.items():
+        for k, v in src.facter.FACTS.items():
             print(comment_symbol, k + ":", v, file=f)
         print(file=f)
         print(comment_symbol, "Benchmark facts:", file=f)
diff --git a/src/facter.py b/src/facter.py
index fe0b316..4c1c14d 100644
--- a/src/facter.py
+++ b/src/facter.py
@@ -26,31 +26,31 @@ import platform
 import subprocess
 
 import src.globalvars as gv
-from src.util import print_error, print_info
+from src.util import print_error, print_info, run_cmd
 
+FACTS = {}
 
 def collect_facts():
-    """Collect facts ad store them in src.globalvars.facts"""
+    """Collect general facts about the benchmark environment"""
     # Populate src.globalvars.facts on import
     _uname = platform.uname()
-    gv.facts["hostname"] = _uname.node
-    gv.facts["system"] = _uname.system
-    gv.facts["kernel"] = _uname.release
-    gv.facts["arch"] = _uname.machine
-    gv.facts["cpus"] = multiprocessing.cpu_count()
-    gv.facts["LD_PRELOAD"] = os.environ.get("LD_PRELOAD", None)
+    FACTS["hostname"] = _uname.node
+    FACTS["system"] = _uname.system
+    FACTS["kernel"] = _uname.release
+    FACTS["arch"] = _uname.machine
+    FACTS["cpus"] = multiprocessing.cpu_count()
+    FACTS["LD_PRELOAD"] = os.environ.get("LD_PRELOAD", None)
 
     with open(os.path.join(gv.builddir, "ccinfo"), "r") as ccinfo:
-        gv.facts["cc"] = ccinfo.readlines()[-1][:-1]
+        FACTS["cc"] = ccinfo.readlines()[-1][:-1]
 
-    gv.facts["allocbench"] = subprocess.run(["git", "rev-parse", "master"],
-                                            stdout=subprocess.PIPE,
-                                            universal_newlines=True).stdout
+    # get commit info from git
+    allocbench_version()
 
     starttime = datetime.datetime.now().isoformat()
     # strip seconds from string
     starttime = starttime[:starttime.rfind(':')]
-    gv.facts["starttime"] = starttime
+    FACTS["starttime"] = starttime
 
 
 def store_facts(path=None):
@@ -64,7 +64,7 @@ def store_facts(path=None):
 
     print_info(f"Saving facts to: {filename}")
     with open(filename, "w") as f:
-        json.dump(gv.facts, f)
+        json.dump(FACTS, f)
 
 
 def load_facts(path=None):
@@ -80,18 +80,31 @@ def load_facts(path=None):
     if os.path.exists(filename + ".json"):
         filename += ".json"
         with open(filename, "r") as f:
-            gv.facts = json.load(f)
+            FACTS = json.load(f)
     elif os.path.exists(filename + ".save"):
         import pickle
         filename += ".save"
         with open(filename, "rb") as f:
-            gv.facts = pickle.load(f)
+            FACTS = pickle.load(f)
     else:
         raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT),
                                 filename)
 
     print_info(f"Loading facts from: {filename}")
 
+def allocbench_version():
+    "Store and return allocbench version string."""
+    if "allocbench" in FACTS:
+        return FACTS["allocbench"]
+
+    commit = run_cmd(["git", "rev-parse", "HEAD"], capture=True).stdout[:-1]
+
+    proc = run_cmd(["git", "status", "--porcelain"], capture=True)
+    dirty = "-dirty" if proc.stdout != "" else ""
+
+    FACTS["allocbench"] = f"{commit}{dirty}"
+    return FACTS["allocbench"]
+
 
 # Copied from pip.
 # https://github.com/pypa/pip/blob/master/src/pip/_internal/utils/glibc.py
diff --git a/src/globalvars.py b/src/globalvars.py
index c1ec6b0..bcb722b 100644
--- a/src/globalvars.py
+++ b/src/globalvars.py
@@ -17,7 +17,6 @@
 
 """Global variables for allocbench
 
-facts: Dict holding facts about the current benchmark run
 verbosity: Verbosity level -1: quiet, 0: status, 1: info, 2: stdout of subcommands, 3: debug info
 allocators: Dict holding the allocators to compare
 benchmarks: List of available benchmarks
@@ -35,8 +34,6 @@ import inspect
 import os
 
 
-facts = {}
-
 verbosity = 0
 
 allocators = {}
diff --git a/src/util.py b/src/util.py
index 618eaf8..c5074b6 100644
--- a/src/util.py
+++ b/src/util.py
@@ -169,31 +169,6 @@ def print_license_and_exit():
     exit(0)
 
 
-def print_version_and_exit():
-    """Print current commit info before exit"""
-    proc = subprocess.run(["git", "rev-parse", "HEAD"],
-                          universal_newlines=True,
-                          stdout=subprocess.PIPE)
-
-    if proc.returncode != 0:
-        print_error("git rev-parse failed")
-        exit(1)
-    commit = proc.stdout[:-1]
-
-    proc = subprocess.run(["git", "status", "--porcelain"],
-                          universal_newlines=True,
-                          stdout=subprocess.PIPE)
-
-    if proc.returncode != 0:
-        print_error("git status --porcelain failed")
-        exit(1)
-
-    dirty = "-dirty" if proc.stdout != "" else ""
-
-    print(f"{commit}{dirty}")
-    exit(0)
-
-
 def sha1sum(filename):
     """Return sha1sum of a file"""
     sha1 = hashlib.sha1()
diff --git a/summarize.py b/summarize.py
index 6681137..d974fb2 100755
--- a/summarize.py
+++ b/summarize.py
@@ -27,7 +27,7 @@ import sys
 import src.facter
 import src.globalvars
 from src.util import print_status, print_debug, print_error
-from src.util import print_license_and_exit, print_version_and_exit
+from src.util import print_license_and_exit
 
 
 def specific_summary(bench, sum_dir, allocators):
@@ -95,7 +95,8 @@ def main():
         print_license_and_exit()
 
     if "--version" in sys.argv:
-        print_version_and_exit()
+        print(src.facter.allocbench_version())
+        exit(0)
 
     parser = argparse.ArgumentParser(description="Summarize allocbench results in allocator sets")
     parser.add_argument("results", help="path to results", type=str)
-- 
GitLab