def test_epoch_type_int_trim(self): assert nevra_parse('foo-1.2.3-1.i386', epoch_type=int, epoch_mode=EpochMode.TRIM) == ('foo', None, '1.2.3', '1', 'i386') assert nevra_parse('foo-0:1.2.3-1.i386', epoch_type=int, epoch_mode=EpochMode.TRIM) == ('foo', None, '1.2.3', '1', 'i386') assert nevra_parse('foo-1:1.2.3-1.i386', epoch_type=int, epoch_mode=EpochMode.TRIM) == ('foo', 1, '1.2.3', '1', 'i386') with pytest.raises(ValueError): nevra_parse('foo-x:1.2.3-1.i386', epoch_type=int, epoch_mode=EpochMode.TRIM)
def test_epoch_type_int_provide(self) -> None: self.assertEqual(nevra_parse('foo-1.2.3-1.i386', epoch_type=int, epoch_mode=EpochMode.PROVIDE), ('foo', 0, '1.2.3', '1', 'i386')) self.assertEqual(nevra_parse('foo-0:1.2.3-1.i386', epoch_type=int, epoch_mode=EpochMode.PROVIDE), ('foo', 0, '1.2.3', '1', 'i386')) self.assertEqual(nevra_parse('foo-1:1.2.3-1.i386', epoch_type=int, epoch_mode=EpochMode.PROVIDE), ('foo', 1, '1.2.3', '1', 'i386')) with self.assertRaises(ValueError): nevra_parse('foo-x:1.2.3-1.i386', epoch_type=int, epoch_mode=EpochMode.PROVIDE)
def test_epoch_type_int_provide(self): assert nevra_parse('foo-1.2.3-1.i386', epoch_type=int, epoch_mode=EpochMode.PROVIDE) == ('foo', 0, '1.2.3', '1', 'i386') assert nevra_parse('foo-0:1.2.3-1.i386', epoch_type=int, epoch_mode=EpochMode.PROVIDE) == ('foo', 0, '1.2.3', '1', 'i386') assert nevra_parse('foo-1:1.2.3-1.i386', epoch_type=int, epoch_mode=EpochMode.PROVIDE) == ('foo', 1, '1.2.3', '1', 'i386') with pytest.raises(ValueError): nevra_parse('foo-x:1.2.3-1.i386', epoch_type=int, epoch_mode=EpochMode.PROVIDE)
def iter_parse(self, path: str, factory: PackageFactory, transformer: PackageTransformer) -> Iterable[PackageMaker]: root = xml.etree.ElementTree.parse(path) for info in root.findall('./info'): with factory.begin() as pkg: name, epoch, version, release, arch = nevra_parse( info.attrib['fn']) assert (arch == 'src') pkg.add_name(name, NameType.SRCRPM_NAME) pkg.set_version(version) pkg.set_rawversion( nevra_construct(None, epoch, version, release)) pkg.set_arch(arch) # What we do here is we try to extract prerelease part # and mark version as ignored with non-trivial ROSAREV, # as it it likely a snapshot and trus cannot be trusted if not version.isdecimal(): pkg.set_flags(PackageFlags.IGNORE) match = re.search('\\b(a|alpha|b|beta|pre|rc)[0-9]+', version.lower()) if match: pkg.set_version(version + match.group(0)) pkg.add_homepages(info.attrib['url']) pkg.add_licenses(info.attrib['license']) yield pkg
def iter_parse(self, path: str, factory: PackageFactory) -> Iterable[PackageMaker]: with open(path) as listfile: for line in listfile: with factory.begin() as pkg: filename = line.strip().split()[-1] name, epoch, version, release, arch = nevra_parse(filename) assert (arch == 'src') pkg.add_name(name, NameType.SRCRPM_NAME) fixed_version, flags = parse_rpm_version( self._vertags, version, release) pkg.set_version(fixed_version) pkg.set_rawversion( nevra_construct(None, epoch, version, release)) pkg.set_flags(flags) pkg.set_arch(arch) pkg.set_extra_field('nevr', filename.rsplit('.', 2)[0]) yield pkg
def iter_parse(self, path, factory): root = xml.etree.ElementTree.parse(path) for info in root.findall('./info'): pkg = factory.begin() nevra = nevra_parse(info.attrib['fn']) pkg.set_name(nevra[0]) pkg.set_version(nevra[2]) pkg.set_origversion( nevra_construct(None, nevra[1], nevra[2], nevra[3])) # What we do here is we try to extract prerelease part # and mark version as ignored with non-trivial ROSAREV, # as it it likely a snapshot and trus cannot be trusted if not nevra[3].isdecimal(): pkg.set_flags(PackageFlags.ignore) match = re.search('\\b(a|alpha|b|beta|pre|rc)[0-9]+', nevra[3].lower()) if match: pkg.package.version += match.group( 0) # XXX: encapsulation violation pkg.add_homepages(info.attrib['url']) pkg.add_licenses(info.attrib['license']) yield pkg
def iter_parse(self, path: str, factory: PackageFactory, transformer: PackageTransformer) -> Iterable[PackageMaker]: normalize_version = VersionStripper().strip_right_greedy('+') skipped_archs: Dict[str, int] = Counter() wanted_columns = [ 'name', 'version', 'arch', 'epoch', 'release', 'summary', 'url', 'rpm_group', 'rpm_license', 'arch', 'rpm_packager', 'rpm_sourcerpm' ] for pkgdata in iter_sqlite(path, 'packages', wanted_columns): is_src = pkgdata['arch'] == 'src' if (is_src and not self._src) or (not is_src and not self._binary): skipped_archs[pkgdata['arch']] += 1 continue with factory.begin() as pkg: if is_src: pkg.add_name(pkgdata['name'], NameType.SRCRPM_NAME) else: pkg.add_name(pkgdata['name'], NameType.BINRPM_NAME) pkg.add_name( nevra_parse(pkgdata['rpm_sourcerpm'])[0], NameType.BINRPM_SRCNAME) version = pkgdata['version'] match = re.match('0\\.[0-9]+\\.((?:alpha|beta|rc)[0-9]+)\\.', pkgdata['release']) if match: # known pre-release schema: https://fedoraproject.org/wiki/Packaging:Versioning#Prerelease_versions version += '-' + match.group(1) elif pkgdata['release'] < '1': # unknown pre-release schema: https://fedoraproject.org/wiki/Packaging:Versioning#Some_definitions # most likely a snapshot pkg.set_flags(PackageFlags.IGNORE) pkg.set_version(version, normalize_version) pkg.set_rawversion( nevra_construct(None, pkgdata['epoch'], pkgdata['version'], pkgdata['release'])) pkg.set_arch(pkgdata['arch']) pkg.set_summary(pkgdata['summary']) pkg.add_homepages(pkgdata['url']) pkg.add_categories(pkgdata['rpm_group']) pkg.add_licenses(pkgdata['rpm_license']) pkg.set_arch(pkgdata['arch']) pkg.add_maintainers( extract_maintainers(pkgdata['rpm_packager'])) yield pkg
def iter_parse(self, path: str, factory: PackageFactory) -> Iterable[PackageMaker]: for item in lxml.html.parse(path).getroot().xpath('.//div[@id="rpms_list"]/ul/li/a'): nevra = nevra_parse(item.text) pkg = factory.begin() pkg.add_name(nevra[0], NameType.UNSUPPORTED) pkg.set_version(nevra[2]) pkg.set_rawversion(nevra_construct(None, nevra[1], nevra[2], nevra[3])) yield pkg
def test_epoch_type_int_trim(self): self.assertEqual( nevra_parse('foo-1.2.3-1.i386', epoch_type=int, epoch_mode=EpochMode.TRIM), ('foo', None, '1.2.3', '1', 'i386')) self.assertEqual( nevra_parse('foo-0:1.2.3-1.i386', epoch_type=int, epoch_mode=EpochMode.TRIM), ('foo', None, '1.2.3', '1', 'i386')) self.assertEqual( nevra_parse('foo-1:1.2.3-1.i386', epoch_type=int, epoch_mode=EpochMode.TRIM), ('foo', 1, '1.2.3', '1', 'i386')) with self.assertRaises(ValueError): nevra_parse('foo-x:1.2.3-1.i386', epoch_type=int, epoch_mode=EpochMode.TRIM)
def test_epoch_type_str_trim(self): self.assertEqual( nevra_parse('foo-1.2.3-1.i386', epoch_type=str, epoch_mode=EpochMode.TRIM), ('foo', None, '1.2.3', '1', 'i386')) self.assertEqual( nevra_parse('foo-0:1.2.3-1.i386', epoch_type=str, epoch_mode=EpochMode.TRIM), ('foo', None, '1.2.3', '1', 'i386')) self.assertEqual( nevra_parse('foo-1:1.2.3-1.i386', epoch_type=str, epoch_mode=EpochMode.TRIM), ('foo', '1', '1.2.3', '1', 'i386')) self.assertEqual( nevra_parse('foo-x:1.2.3-1.i386', epoch_type=str, epoch_mode=EpochMode.TRIM), ('foo', 'x', '1.2.3', '1', 'i386'))
def test_epoch_mode_str_provide(self): self.assertEqual( nevra_parse('foo-1.2.3-1.i386', epoch_type=str, epoch_mode=EpochMode.PROVIDE), ('foo', '0', '1.2.3', '1', 'i386')) self.assertEqual( nevra_parse('foo-0:1.2.3-1.i386', epoch_type=str, epoch_mode=EpochMode.PROVIDE), ('foo', '0', '1.2.3', '1', 'i386')) self.assertEqual( nevra_parse('foo-1:1.2.3-1.i386', epoch_type=str, epoch_mode=EpochMode.PROVIDE), ('foo', '1', '1.2.3', '1', 'i386')) self.assertEqual( nevra_parse('foo-x:1.2.3-1.i386', epoch_type=str, epoch_mode=EpochMode.PROVIDE), ('foo', 'x', '1.2.3', '1', 'i386'))
def iter_parse(self, path, factory): for item in lxml.html.parse(path).getroot().xpath( './/div[@id="rpms_list"]/ul/li/a'): nevra = nevra_parse(item.text) pkg = factory.begin() pkg.set_name(nevra[0]) pkg.set_version(nevra[2]) pkg.set_origversion( nevra_construct(None, nevra[1], nevra[2], nevra[3])) yield pkg
def iter_parse(self, path, factory): with open(path) as listfile: for line in listfile: pkg = factory.begin() filename = line.strip().split()[-1] nevra = nevra_parse(filename) pkg.set_name(nevra[0]) pkg.set_version(nevra[2]) pkg.set_origversion(nevra_construct(None, nevra[1], nevra[2], nevra[3])) pkg.set_extra_field('nevr', filename.rsplit('.', 2)[0]) yield pkg
def iter_parse(self, path: str, factory: PackageFactory, transformer: PackageTransformer) -> Generator[PackageMaker, None, None]: with open(path) as listfile: for line in listfile: pkg = factory.begin() filename = line.strip().split()[-1] nevra = nevra_parse(filename) pkg.set_name(nevra[0]) pkg.set_version(nevra[2]) pkg.set_rawversion(nevra_construct(None, nevra[1], nevra[2], nevra[3])) pkg.set_extra_field('nevr', filename.rsplit('.', 2)[0]) yield pkg
def iter_parse( self, path: str, factory: PackageFactory, transformer: PackageTransformer ) -> Generator[PackageMaker, None, None]: for item in lxml.html.parse(path).getroot().xpath( './/div[@id="rpms_list"]/ul/li/a'): nevra = nevra_parse(item.text) pkg = factory.begin() pkg.set_name(nevra[0]) pkg.set_version(nevra[2]) pkg.set_rawversion( nevra_construct(None, nevra[1], nevra[2], nevra[3])) yield pkg
def iter_parse(self, path: str, factory: PackageFactory, transformer: PackageTransformer) -> Iterable[PackageMaker]: with open(path) as listfile: for line in listfile: pkg = factory.begin() filename = line.strip().split()[-1] name, epoch, version, release, arch = nevra_parse(filename) pkg.set_name(name) pkg.set_version(version) pkg.set_rawversion(nevra_construct(None, epoch, version, release)) pkg.set_arch(arch) pkg.set_extra_field('nevr', filename.rsplit('.', 2)[0]) yield pkg
def iter_parse(self, path: str, factory: PackageFactory, transformer: PackageTransformer) -> Iterable[PackageMaker]: normalize_version = VersionStripper().strip_right_greedy('+') skipped_archs: Dict[str, int] = Counter() if self._arch_from_filename: factory.log('mitigation for incorrect <arch></arch> enabled', severity=Logger.WARNING) for entry in iter_xml_elements_at_level( path, 1, ['{http://linux.duke.edu/metadata/common}package']): if self._arch_from_filename: # XXX: openmandriva 3 hack, to be removed when it EoLs location_elt = entry.find( '{http://linux.duke.edu/metadata/common}location') if location_elt is None: raise RuntimeError('Cannot find <location> element') arch = nevra_parse(safe_getattr(location_elt, 'href'))[4] else: arch = safe_findtext( entry, '{http://linux.duke.edu/metadata/common}arch') is_src = arch == 'src' if (is_src and not self._src) or (not is_src and not self._binary): skipped_archs[arch] += 1 continue with factory.begin() as pkg: name = safe_findtext( entry, '{http://linux.duke.edu/metadata/common}name') if '%{' in name: pkg.log('incorrect package name (unexpanded substitution)', severity=Logger.ERROR) continue if is_src: pkg.add_name(name, NameType.SRCRPM_NAME) else: pkg.add_name(name, NameType.BINRPM_NAME) sourcerpm = safe_findtext( entry, '{http://linux.duke.edu/metadata/common}format/' '{http://linux.duke.edu/metadata/rpm}sourcerpm') pkg.add_name( nevra_parse(sourcerpm)[0], NameType.BINRPM_SRCNAME) version_elt = entry.find( '{http://linux.duke.edu/metadata/common}version') if version_elt is None: raise RuntimeError('Cannot find <version> element') epoch = version_elt.attrib['epoch'] version = version_elt.attrib['ver'] release = version_elt.attrib['rel'] fixed_version = version match = re.match('0\\.[0-9]+\\.((?:alpha|beta|rc)[0-9]+)\\.', release) if match: # known pre-release schema: https://fedoraproject.org/wiki/Packaging:Versioning#Prerelease_versions fixed_version += '-' + match.group(1) elif release < '1': # unknown pre-release schema: https://fedoraproject.org/wiki/Packaging:Versioning#Some_definitions # most likely a snapshot pkg.set_flags(PackageFlags.IGNORE) pkg.set_version(fixed_version, normalize_version) pkg.set_rawversion( nevra_construct(None, epoch, version, release)) pkg.set_summary( entry.findtext( '{http://linux.duke.edu/metadata/common}summary')) pkg.add_homepages( entry.findtext( '{http://linux.duke.edu/metadata/common}url')) pkg.add_categories( entry.findtext( '{http://linux.duke.edu/metadata/common}format/' '{http://linux.duke.edu/metadata/rpm}group')) pkg.add_licenses( entry.findtext( '{http://linux.duke.edu/metadata/common}format/' '{http://linux.duke.edu/metadata/rpm}license')) pkg.set_arch( entry.findtext( '{http://linux.duke.edu/metadata/common}arch')) packager = entry.findtext( '{http://linux.duke.edu/metadata/common}packager') if packager: pkg.add_maintainers(extract_maintainers(packager)) yield pkg for arch, numpackages in sorted(skipped_archs.items()): factory.log( 'skipped {} packages(s) with disallowed architecture {}'. format(numpackages, arch))
def test_epoch_mode_str_preserve(self) -> None: self.assertEqual(nevra_parse('foo-1.2.3-1.i386', epoch_type=str, epoch_mode=EpochMode.PRESERVE), ('foo', None, '1.2.3', '1', 'i386')) self.assertEqual(nevra_parse('foo-0:1.2.3-1.i386', epoch_type=str, epoch_mode=EpochMode.PRESERVE), ('foo', '0', '1.2.3', '1', 'i386')) self.assertEqual(nevra_parse('foo-1:1.2.3-1.i386', epoch_type=str, epoch_mode=EpochMode.PRESERVE), ('foo', '1', '1.2.3', '1', 'i386')) self.assertEqual(nevra_parse('foo-x:1.2.3-1.i386', epoch_type=str, epoch_mode=EpochMode.PRESERVE), ('foo', 'x', '1.2.3', '1', 'i386'))
def test_filename(self): self.assertEqual(nevra_parse('foo-1.2.3-1.i386.rpm'), ('foo', None, '1.2.3', '1', 'i386')) self.assertEqual(nevra_parse('foo-bar-baz-999:1.2.3-1.src.rpm'), ('foo-bar-baz', '999', '1.2.3', '1', 'src'))
def test_basic(self): assert nevra_parse('foo-1.2.3-1.i386') == ('foo', None, '1.2.3', '1', 'i386') assert nevra_parse('foo-bar-baz-999:1.2.3-1.src') == ('foo-bar-baz', '999', '1.2.3', '1', 'src')
def test_basic(self) -> None: self.assertEqual(nevra_parse('foo-1.2.3-1.i386'), ('foo', None, '1.2.3', '1', 'i386')) self.assertEqual(nevra_parse('foo-bar-baz-999:1.2.3-1.src'), ('foo-bar-baz', '999', '1.2.3', '1', 'src'))
def test_epoch_mode_str_preserve(self): assert nevra_parse('foo-1.2.3-1.i386', epoch_type=str, epoch_mode=EpochMode.PRESERVE) == ('foo', None, '1.2.3', '1', 'i386') assert nevra_parse('foo-0:1.2.3-1.i386', epoch_type=str, epoch_mode=EpochMode.PRESERVE) == ('foo', '0', '1.2.3', '1', 'i386') assert nevra_parse('foo-1:1.2.3-1.i386', epoch_type=str, epoch_mode=EpochMode.PRESERVE) == ('foo', '1', '1.2.3', '1', 'i386') assert nevra_parse('foo-x:1.2.3-1.i386', epoch_type=str, epoch_mode=EpochMode.PRESERVE) == ('foo', 'x', '1.2.3', '1', 'i386')
def test_filename(self): assert nevra_parse('foo-1.2.3-1.i386.rpm') == ('foo', None, '1.2.3', '1', 'i386') assert nevra_parse('foo-bar-baz-999:1.2.3-1.src.rpm') == ('foo-bar-baz', '999', '1.2.3', '1', 'src')