Build fix. jetstream has a local copy, not remote archive.
[WebKit-https.git] / Tools / Scripts / webkitpy / benchmark_runner / utils.py
1 #!/usr/bin/env python
2
3 import json
4 import logging
5 import os
6 import signal
7 import shutil
8
9
10 _log = logging.getLogger(__name__)
11
12
13 class ModuleNotFoundError(Exception):
14     pass
15
16
17 def loadModule(moduleDesc):
18     try:
19         ret = getattr(__import__(moduleDesc['filePath'], globals(), locals(), moduleDesc['moduleName'], -1), moduleDesc['moduleName'])
20         return ret
21     except Exception as e:
22         raise ModuleNotFoundError('Module (%s) with path(%s) is not found' % (moduleDesc['moduleName'], moduleDesc['filePath']))
23
24
25 def getPathFromProjectRoot(relativePathToProjectRoot):
26     # Choose the directory containning current file as start point,
27     # compute relative path base on the parameter,
28     # and return an absolute path
29     return os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), relativePathToProjectRoot))
30
31
32 def loadJSONFromFile(filePath):
33     try:
34         jsonObject = json.load(open(filePath, 'r'))
35         assert(jsonObject)
36         return jsonObject
37     except:
38         raise Exception("Invalid json format or empty json was found in %s" % (filePath))
39
40
41 def forceRemove(path):
42     try:
43         shutil.rmtree(path)
44     except:
45         # Directory/file does not exist or privilege issue, just ignore it
46         pass
47
48 # Borrow this code from
49 # 'http://stackoverflow.com/questions/2281850/timeout-function-if-it-takes-too-long-to-finish'
50 class TimeoutError(Exception):
51     pass
52
53
54 class timeout:
55
56     def __init__(self, seconds=1, error_message='Timeout'):
57         self.seconds = seconds
58         self.error_message = error_message
59
60     def handle_timeout(self, signum, frame):
61         raise TimeoutError(self.error_message)
62
63     def __enter__(self):
64         signal.signal(signal.SIGALRM, self.handle_timeout)
65         signal.alarm(self.seconds)
66
67     def __exit__(self, type, value, traceback):
68         signal.alarm(0)