def _fetch_epoch_mapping(self):
        epoch_map = self.distro.get_dependency_config("epoch_map", quiet=True)
        if not epoch_map:
            epoch_map = {}
        epoch_skips = self.distro.get_dependency_config("epoch_skips",
                                                        quiet=True)
        if not epoch_skips:
            epoch_skips = _DEFAULT_SKIP_EPOCHS
        if not isinstance(epoch_skips, (list, tuple)):
            epoch_skips = [i.strip() for i in epoch_skips.split(",")]
        built_epochs = {}
        for name in self.python_names:
            if name in epoch_map:
                built_epochs[name] = str(epoch_map.pop(name))
            else:
                built_epochs[name] = str(self.OPENSTACK_EPOCH)
        # Ensure epochs set by a yum searching (that are not in the list of
        # epochs to provide) are correctly set when building dependent
        # packages...
        keep_names = set()
        try:
            yum_satisfies = sh.load_file(self.yum_satisfies_filename)
        except IOError as e:
            if e.errno != errno.ENOENT:
                raise
        else:
            for line in yum_satisfies.splitlines():
                raw_req_rpm = utils.parse_json(line)
                req = pip_helper.extract_requirement(raw_req_rpm['requirement'])
                if req.key in epoch_map:
                    LOG.debug("Ensuring manually set epoch is retained for"
                              " requirement '%s' with epoch %s", req,
                              epoch_map[req.key])
                    keep_names.add(req.key)
                else:
                    rpm_info = raw_req_rpm['rpm']
                    rpm_epoch = rpm_info.get('epoch')
                    if rpm_epoch and str(rpm_epoch) not in epoch_skips:
                        LOG.debug("Adding in yum satisfiable package %s for"
                                  " requirement '%s' with epoch %s from repo %s",
                                  rpm_info['name'], req, rpm_epoch, rpm_info['repo'])
                        keep_names.add(req.key)
                        epoch_map[req.key] = str(rpm_epoch)
        # Exclude names from the epoch map that we never downloaded in the
        # first place or that we did not just set automatically (since these
        # are not useful and should not be set in the first place).
        try:
            _pip_reqs, downloaded_reqs = pip_helper.read_requirement_files([self.build_requires_filename])
        except __HOLE__ as e:
            if e.errno != errno.ENOENT:
                raise
        else:
            downloaded_names = set([req.key for req in downloaded_reqs])
            tmp_epoch_map = {}
            for (name, epoch) in six.iteritems(epoch_map):
                name = name.lower()
                if name in downloaded_names or name in keep_names:
                    tmp_epoch_map[name] = str(epoch)
                else:
                    LOG.debug("Discarding %s:%s from the epoch mapping since"
                              " it was not part of the downloaded (or automatically"
                              " included) build requirements", name, epoch)
            epoch_map = tmp_epoch_map
        epoch_map.update(built_epochs)
        return epoch_map
dataset/ETHPy150Open openstack/anvil/anvil/packaging/yum.py/YumDependencyHandler._fetch_epoch_mapping