def add(self, obj, mdtype='updateinfo', all=False): """ Parse a metadata from a given YumRepository, file, or filename. """ if not obj: raise UpdateNoticeException if type(obj) in (type(''), type(u'')): infile = fileutils.decompress_open(obj) elif isinstance(obj, YumRepository): if obj.id not in self._repos: self._repos.append(obj.id) md = obj.retrieveMD(mdtype) if not md: raise UpdateNoticeException() infile = fileutils.decompress_open(md) else: # obj is a file object infile = obj for _event, elem in iterparse(infile): if elem.tag == 'update': un = UpdateNotice(elem) key = un['update_id'] if all: key = "%s-%s" % (un['update_id'], un['version']) if not self._notices.has_key(key): self._notices[key] = un for pkg in un['pkglist']: for pkgfile in pkg['packages']: self._cache['%s-%s-%s' % (pkgfile['name'], pkgfile['version'], pkgfile['release'])] = un no = self._no_cache.setdefault( pkgfile['name'], set()) no.add(un)
def _filter_packages(packages, filters, exclude_only=False): """ implement include / exclude logic filters are: [ ('+', includelist1), ('-', excludelist1), ('+', includelist2), ... ] """ if filters is None: return selected = [] excluded = [] if exclude_only or filters[0][0] == '-': # first filter is exclude, start with full package list # and then exclude from it selected = packages else: excluded = packages for filter_item in filters: sense, pkg_list = filter_item if sense == '+': if exclude_only: continue # include exactmatch, matched, _unmatched = yum.packages.parsePackages( excluded, pkg_list) allmatched = yum.misc.unique(exactmatch + matched) selected = yum.misc.unique(selected + allmatched) for pkg in allmatched: if pkg in excluded: excluded.remove(pkg) elif sense == '-': # exclude exactmatch, matched, _unmatched = yum.packages.parsePackages( selected, pkg_list) allmatched = yum.misc.unique(exactmatch + matched) for pkg in allmatched: if pkg in selected: selected.remove(pkg) excluded = yum.misc.unique(excluded + allmatched) else: raise UpdateNoticeException("Invalid filter sense: '%s'" % sense) return selected