Modified: trunk/Tools/ChangeLog (244468 => 244469)
--- trunk/Tools/ChangeLog 2019-04-19 21:23:05 UTC (rev 244468)
+++ trunk/Tools/ChangeLog 2019-04-19 21:35:08 UTC (rev 244469)
@@ -1,3 +1,24 @@
+2019-04-19 Keith Miller <[email protected]>
+
+ 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 <[email protected]>
Crash in FrameLoader::stopAllLoaders via [WebView dealloc] inside ~ObjCEventListener
Modified: trunk/Tools/Scripts/compare-results (244468 => 244469)
--- trunk/Tools/Scripts/compare-results 2019-04-19 21:23:05 UTC (rev 244468)
+++ trunk/Tools/Scripts/compare-results 2019-04-19 21:35:08 UTC (rev 244469)
@@ -233,6 +233,7 @@
print "Unknown benchmark type"
sys.exit(1)
+
if __name__ == "__main__":
main()
Property changes on: trunk/Tools/Scripts/compare-results
___________________________________________________________________
Added: trunk/Tools/Scripts/merge-result-jsons (0 => 244469)
--- trunk/Tools/Scripts/merge-result-jsons (rev 0)
+++ trunk/Tools/Scripts/merge-result-jsons 2019-04-19 21:35:08 UTC (rev 244469)
@@ -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()
Property changes on: trunk/Tools/Scripts/merge-result-jsons
___________________________________________________________________