Example #1
0
    def _get_test_target_md5sum(self, target):
        """Get test target md5sum. """
        # pylint: disable=too-many-locals
        related_file_list = []
        related_file_data_list = []
        test_file_name = os.path.abspath(self._executable(target))
        if os.path.exists(test_file_name):
            related_file_list.append(test_file_name)

        if target.data.get('dynamic_link'):
            for dep in self.targets[target.key].expanded_deps:
                dep_target = self.targets[dep]
                if 'cc_library' in dep_target.type:
                    lib_name = 'lib%s.so' % dep_target.name
                    lib_path = os.path.join(self.build_dir,
                                            dep_target.path,
                                            lib_name)
                    abs_lib_path = os.path.abspath(lib_path)
                    if os.path.exists(abs_lib_path):
                        related_file_list.append(abs_lib_path)

        for i in target.data['testdata']:
            if isinstance(i, tuple):
                data_target = i[0]
            else:
                data_target = i
            if '..' in data_target:
                continue
            if data_target.startswith('//'):
                data_target = data_target[2:]
                data_target_path = os.path.abspath(data_target)
            else:
                data_target_path = os.path.abspath('%s/%s' % (
                                                   target.path, data_target))
            if os.path.exists(data_target_path):
                related_file_data_list.append(data_target_path)

        related_file_list.sort()
        related_file_data_list.sort()

        test_target_str = ''
        test_target_data_str = ''
        for f in related_file_list:
            mtime = os.path.getmtime(f)
            ctime = os.path.getctime(f)
            test_target_str += str(mtime) + str(ctime)

        for f in related_file_data_list:
            mtime = os.path.getmtime(f)
            ctime = os.path.getctime(f)
            test_target_data_str += str(mtime) + str(ctime)

        return md5sum(test_target_str), md5sum(test_target_data_str)
Example #2
0
    def rule_hash(self):
        """Calculate a hash string to be used to judge whether regenerate per-target ninja file"""
        if self.__rule_hash is None:
            # All build related factors should be added to avoid outdated ninja file beeing used.
            entropy = {
                'blade_revision': self.blade.revision(),
                'config': config.digest(),
                'type': self.type,
                'name': self.name,
                'srcs': self.srcs,
            }
            deps = []
            for dkey in self.deps:
                dep = self.target_database[dkey]
                deps.append(dep.rule_hash())
            entropy['deps'] = deps

            # Add more entropy
            entropy.update(self._rule_hash_entropy())

            # Sort to make the result stable
            entropy_str = str(sorted(entropy.items()))

            # Entropy dict can't cantains normal object, because it's default repr contains address,
            # which is changed in different build, so it should not be used as stable hash entropy.
            # If this assert failed, remove the culprit element from entropy if it is unrelated or
            # override it's `__repe__` if it is related.
            assert ' object at 0x' not in entropy_str
            self.__rule_hash = md5sum(entropy_str)
        return self.__rule_hash
Example #3
0
    def _update_test_history(self):
        old_env = self.test_history.get('env', {})
        env_keys = _filter_envs(os.environ.keys())
        new_env = dict((key, os.environ[key]) for key in env_keys)
        if old_env and new_env != old_env:
            console.notice('Some tests will be run due to test environments changed:')
            new, old = _diff_env(new_env, old_env)
            if new:
                console.notice('New environments: %s' % new)
            if old:
                console.notice('Old environments: %s' % old)

        self.test_history['env'] = new_env
        self.env_md5 = md5sum(str(sorted(iteritems(new_env))))
Example #4
0
    def _update_test_history(self):
        old_env = self.test_history.get('env', {})
        env_keys = os.environ.keys()
        env_keys = set(env_keys).difference(_TEST_IGNORED_ENV_VARS)
        new_env = dict((key, os.environ[key]) for key in env_keys)
        if old_env and new_env != old_env:
            console.notice('Some tests will be run due to test environments changed:')
            new, old = _diff_env(new_env, old_env)
            if new:
                console.notice('new environments: %s' % new)
            if old:
                console.notice('old environments: %s' % old)

        self.test_history['env'] = new_env
        self.env_md5 = md5sum(str(sorted(new_env.iteritems())))
Example #5
0
 def rule_hash(self):
     """Calculate a hash string to be used to judge whether regenerate per-target ninja file"""
     if self.__rule_hash is None:
         entropy = {
             'type': self.type,
             'name': self.name,
             'srcs': self.srcs,
         }
         deps = []
         for dkey in self.deps:
             dep = self.target_database[dkey]
             deps.append(dep.rule_hash())
         entropy['deps'] = deps
         entropy.update(self._rule_hash_entropy())
         entropy_str = str(sorted(entropy.items()))
         assert ' object at 0x' not in entropy_str
         self.__rule_hash = md5sum(entropy_str)
     return self.__rule_hash