Add script to merge run_benchmark jsons
authorkeith_miller@apple.com <keith_miller@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 19 Apr 2019 21:35:08 +0000 (21:35 +0000)
committerkeith_miller@apple.com <keith_miller@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 19 Apr 2019 21:35:08 +0000 (21:35 +0000)
https://bugs.webkit.org/show_bug.cgi?id=197107

Reviewed by Michael Saboff.

The script basically recursively decends through all json objects until it gets
to an array or JSON primitive and concats or takes the first value, respectively.

This patch also adds +x bits to the compare-results script so it
can be run directly from the command line. I had to add a new line so that svn
will accept the change... yay svn!

* Scripts/compare-results:
* Scripts/merge-result-jsons: Added.
(readJSONFile):
(deepAppend):
(mergeJSONs):
(main):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@244469 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Tools/ChangeLog
Tools/Scripts/compare-results [changed mode: 0644->0755]
Tools/Scripts/merge-result-jsons [new file with mode: 0755]

index 769f7e1..eef2300 100644 (file)
@@ -1,3 +1,24 @@
+2019-04-19  Keith Miller  <keith_miller@apple.com>
+
+        Add script to merge run_benchmark jsons
+        https://bugs.webkit.org/show_bug.cgi?id=197107
+
+        Reviewed by Michael Saboff.
+
+        The script basically recursively decends through all json objects until it gets
+        to an array or JSON primitive and concats or takes the first value, respectively.
+
+        This patch also adds +x bits to the compare-results script so it
+        can be run directly from the command line. I had to add a new line so that svn
+        will accept the change... yay svn!
+
+        * Scripts/compare-results:
+        * Scripts/merge-result-jsons: Added.
+        (readJSONFile):
+        (deepAppend):
+        (mergeJSONs):
+        (main):
+
 2019-04-18  Ryosuke Niwa  <rniwa@webkit.org>
 
         Crash in FrameLoader::stopAllLoaders via [WebView dealloc] inside ~ObjCEventListener
old mode 100644 (file)
new mode 100755 (executable)
index 15b5017..7f43b53
@@ -233,6 +233,7 @@ def main():
         print "Unknown benchmark type"
         sys.exit(1)
 
+
 if __name__ == "__main__":
     main()
 
diff --git a/Tools/Scripts/merge-result-jsons b/Tools/Scripts/merge-result-jsons
new file mode 100755 (executable)
index 0000000..22255dc
--- /dev/null
@@ -0,0 +1,82 @@
+#!/usr/bin/env python -u
+
+# Copyright (C) 2019 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+# 3.  Neither the name of Apple Inc. ("Apple") nor the names of
+#     its contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import argparse
+import json
+
+
+def readJSONFile(path):
+    with open(path, 'r') as contents:
+        return json.load(contents)
+
+
+def deepAppend(value1, value2, currentKey=None):
+    if type(value1) != type(value2):
+        raise TypeError("values have different types for key: {}, {} and {}".format(currentKey, type(value1), type(value2)))
+    if isinstance(value1, list):
+        return value1 + value2
+
+    result = {};
+    for key in (value1.keys() + value2.keys()):
+        if key not in result:
+            result[key] = deepAppend(value1[key], value2[key], key)
+    return result
+
+def mergeJSONs(jsons):
+    if len(jsons) == 0:
+        raise TypeError("no jsons to merge")
+
+    last = jsons.pop()
+    return reduce(deepAppend, jsons, last)
+
+def main():
+    parser = argparse.ArgumentParser(description="Merge the resulting json files from multiple invocations of the run_benchmark script.")
+
+    parser.add_argument("-o",
+        type=str,
+        required=False,
+        help="File to put the merged json into prints to standard out if nothing is passed")
+    parser.add_argument("jsons",
+        type=str,
+        nargs='+',
+        help="The json files to be merged.")
+
+    # parse_args will error on our list of incomming JSON files...
+    args = parser.parse_args()
+
+    result = mergeJSONs(list(map(readJSONFile, args.jsons)))
+
+    if args.o:
+        with open(args.o, 'w') as f:
+            json.dump(result, f)
+    else:
+        print(json.dumps(result))
+
+
+if __name__ == "__main__":
+    main()