xref: /aosp_15_r20/external/angle/build/3pp_common/scripthash.py (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker# Copyright 2024 The Chromium Authors
2*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file.
4*8975f5c5SAndroid Build Coastguard Worker
5*8975f5c5SAndroid Build Coastguard Workerimport hashlib
6*8975f5c5SAndroid Build Coastguard Workerimport logging
7*8975f5c5SAndroid Build Coastguard Workerimport os
8*8975f5c5SAndroid Build Coastguard Workerimport pathlib
9*8975f5c5SAndroid Build Coastguard Workerimport sys
10*8975f5c5SAndroid Build Coastguard Worker
11*8975f5c5SAndroid Build Coastguard Worker_SRC_ROOT = pathlib.Path(__file__).resolve().parents[2]
12*8975f5c5SAndroid Build Coastguard Worker
13*8975f5c5SAndroid Build Coastguard Worker
14*8975f5c5SAndroid Build Coastguard Workerdef _find_deps():
15*8975f5c5SAndroid Build Coastguard Worker    module_paths = (os.path.abspath(m.__file__) for m in sys.modules.values()
16*8975f5c5SAndroid Build Coastguard Worker                    if m and getattr(m, '__file__', None))
17*8975f5c5SAndroid Build Coastguard Worker    ret = set()
18*8975f5c5SAndroid Build Coastguard Worker    for path in module_paths:
19*8975f5c5SAndroid Build Coastguard Worker        if path.startswith(str(_SRC_ROOT)):
20*8975f5c5SAndroid Build Coastguard Worker            if (path.endswith('.pyc')
21*8975f5c5SAndroid Build Coastguard Worker                    or (path.endswith('c') and not os.path.splitext(path)[1])):
22*8975f5c5SAndroid Build Coastguard Worker                path = path[:-1]
23*8975f5c5SAndroid Build Coastguard Worker            ret.add(path)
24*8975f5c5SAndroid Build Coastguard Worker    return list(ret)
25*8975f5c5SAndroid Build Coastguard Worker
26*8975f5c5SAndroid Build Coastguard Worker
27*8975f5c5SAndroid Build Coastguard Workerdef compute(extra_paths=None):
28*8975f5c5SAndroid Build Coastguard Worker    """Compute a hash of loaded Python modules and given |extra_paths|."""
29*8975f5c5SAndroid Build Coastguard Worker    all_paths = _find_deps() + (extra_paths or [])
30*8975f5c5SAndroid Build Coastguard Worker    all_paths = [os.path.relpath(p, _SRC_ROOT) for p in all_paths]
31*8975f5c5SAndroid Build Coastguard Worker    all_paths.sort()
32*8975f5c5SAndroid Build Coastguard Worker    md5 = hashlib.md5()
33*8975f5c5SAndroid Build Coastguard Worker    for path in all_paths:
34*8975f5c5SAndroid Build Coastguard Worker        md5.update((_SRC_ROOT / path).read_bytes())
35*8975f5c5SAndroid Build Coastguard Worker        md5.update(path.encode('utf-8'))
36*8975f5c5SAndroid Build Coastguard Worker    logging.info('Script hash from: \n%s\n', '\n'.join(all_paths))
37*8975f5c5SAndroid Build Coastguard Worker    return md5.hexdigest()[:10]
38