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