def Parse(self, path): packages = [] for pkgdir in os.listdir(os.path.join(path, 'ports')): controlpath = os.path.join(path, 'ports', pkgdir, 'CONTROL') if not os.path.exists(controlpath): continue pkg = Package(name=pkgdir) with open(controlpath, 'r', encoding='utf-8', errors='ignore') as controlfile: for line in controlfile: line = line.strip() if line.startswith('Version:'): version = line[8:].strip() match = re.match('[0-9]{4}[.-][0-9]{1,2}[.-][0-9]{1,2}', version) if match: pkg.version = version pkg.ignoreversion = True else: pkg.version, pkg.origversion = SanitizeVersion(line[8:].strip()) elif line.startswith('Description:'): comment = line[12:].strip() if comment: pkg.comment = comment if not pkg.version: print('WARNING: unable to parse port {}: no version'.format(pkgdir), file=sys.stderr) continue packages.append(pkg) return packages
def Parse(self, path): result = [] with open(path, 'r', encoding='utf-8') as jsonfile: for package in json.load(jsonfile)['packages']: pkg = Package() pkg.name = package['name'] if package['version'] is None: print('no version: {}'.format(pkg.name), file=sys.stderr) continue pkg.version, _ = SanitizeVersion(package['version']) pkg.origversion = package['full_version'] pkg.category = package['pkg_section'] or package['section'] pkg.comment = package['description'] pkg.maintainers = GetMaintainers(package['committer']) if pkg.version == '999': pkg.ignoreversion = True result.append(pkg) return result
def Parse(self, path): result = [] root = xml.etree.ElementTree.parse(path) for info in root.findall('./info'): pkg = Package() # derive names and versions from fn field fn = info.attrib['fn'].rsplit('-', 2) if len(fn) < 3: print('WARNING: unable to parse fn: {}'.format(fn), file=sys.stderr) continue pkg.name = fn[0] pkg.origversion = '-'.join(fn[1:]) pkg.version = fn[1] # Rosa packages are named like PKGNAME-PKGVER-ROSAREV # where ROSAREV is most commonly in the form of N.src, but # may contain other components, such as prerelease stuff # like alpha/beta/rc/pre/... and snapshot revisions/dates # # 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 re.fullmatch('[0-9]+\\.src', fn[2]): pkg.ignoreversion = True match = re.search('\\b(a|alpha|b|beta|pre|rc)[0-9]+', fn[2].lower()) if match: pkg.version += match.group(0) # process url and license url = info.attrib['url'] if url: pkg.homepage = url license_ = info.attrib['license'] pkg.licenses = [license_] result.append(pkg) return result
def Parse(self, path): packages = [] for filename in os.listdir(path): if not filename.endswith('.json'): continue with open(os.path.join(path, filename), 'r') as jsonfile: for result in json.load(jsonfile)['results']: pkg = Package() pkg.name = result['Name'] has_badsuffix = False for badsuffix in [ '-cvs', '-svn', '-hg', '-darcs', '-bzr', '-git', '-bin' ]: if pkg.name.endswith(badsuffix): pkg.effname = pkg.name[:-len(badsuffix)] pkg.ignoreversion = True break pkg.version, pkg.origversion = SanitizeVersion( result['Version']) pkg.comment = result['Description'] pkg.homepage = result['URL'] if 'License' in result: for license in result['License']: pkg.licenses.append(license) if 'Maintainer' in result and result['Maintainer']: pkg.maintainers += GetMaintainers( result['Maintainer'] + '@aur') packages.append(pkg) return packages
def Parse(self, path): result = [] with open(path, 'r', encoding='utf-8') as jsonfile: for key, packagedata in sorted(json.load(jsonfile)['packages'].items()): # see how Nix parses 'derivative' names in # https://github.com/NixOS src/libexpr/names.cc, DrvName::DrvName # it just splits on dash followed by non-letter # # this doesn't work well on 100% cases, it's an upstream problem match = re.match('(.+?)-([^a-zA-Z].*)$', packagedata['name']) if not match: print('cannot extract version: {}/{}'.format(key, packagedata['name']), file=sys.stderr) continue pkg = Package() pkg.name = match.group(1) pkg.version = match.group(2) # some exceptions for prefix in ('75dpi', '100dpi'): if pkg.version.startswith(prefix): pkg.name += '-' + prefix pkg.version = pkg.version[len(prefix) + 1:] for pkgname in ('liblqr', ): if pkg.name == pkgname: dashpos = pkg.version.find('-') pkg.name = pkg.name + '-' + pkg.version[0:dashpos] pkg.version = pkg.version[dashpos + 1:] if pkg.name.endswith('-git'): pkg.name = pkg.name[:-4] print('ignoring version for git snapshot: {}/{}'.format(key, packagedata['name']), file=sys.stderr) pkg.ignoreversion = True if re.match('.*20[0-9]{2}-[0-9]{2}-[0-9]{2}', pkg.version): print('ignoring version which is a date: {}/{}'.format(key, packagedata['name']), file=sys.stderr) pkg.ignoreversion = True if re.match('[0-9a-f]*[a-f][0-9a-f]*$', pkg.version) and len(pkg.version) >= 7: print('ignoring version which looks like commit hash: {}/{}'.format(key, packagedata['name']), file=sys.stderr) pkg.ignoreversion = True meta = packagedata['meta'] if 'homepage' in meta: pkg.homepage = meta['homepage'] if isinstance(pkg.homepage, list): # XXX: remove after adding support for homepages array pkg.homepage = pkg.homepage[0] if 'description' in meta: pkg.comment = meta['description'] if 'maintainers' in meta: maintainers = meta['maintainers'] if not isinstance(meta['maintainers'], list): print('maintainers is not a list: {}/{}'.format(key, packagedata['name']), file=sys.stderr) else: maintainers = ', '.join(maintainers) pkg.maintainers = GetMaintainers(maintainers) if 'license' in meta: pkg.licenses = ExtractLicenses(meta['license']) result.append(pkg) return result
def Parse(self, path): result = [] for category in os.listdir(path): category_path = os.path.join(path, category) if not os.path.isdir(category_path): continue if category == 'virtual' or category == 'metadata': continue for package in os.listdir(category_path): package_path = os.path.join(category_path, package) if not os.path.isdir(package_path): continue metadata_path = os.path.join(package_path, 'metadata.xml') # parse maintainers from metadata.xml # these are the same for all ebuilds for current package maintainers = [] if os.path.isfile(metadata_path): with open(metadata_path, 'r', encoding='utf-8') as metafile: meta = xml.etree.ElementTree.parse(metafile) for entry in meta.findall('maintainer'): email_node = entry.find('email') if email_node is not None and email_node.text is not None: maintainers += GetMaintainers(email_node.text) for ebuild in os.listdir(package_path): if not ebuild.endswith('.ebuild'): continue pkg = Package() pkg.name = package pkg.category = category pkg.maintainers = maintainers pkg.version, pkg.origversion = SanitizeVersion( ebuild[len(package) + 1:-7]) if pkg.version.endswith('9999'): # ignore versions for snapshots pkg.ignoreversion = True metadata_path = os.path.join( path, 'metadata', 'md5-cache', category, package + '-' + (pkg.origversion if pkg.origversion else pkg.version)) if os.path.isfile(metadata_path): with open(metadata_path, 'r', encoding='utf-8') as metadata_file: for line in metadata_file: line = line.strip() key, value = line.split('=', 1) if key == 'DESCRIPTION': pkg.comment = value elif key == 'HOMEPAGE': pkg.homepage = value.split(' ')[ 0] # XXX: save all urls elif key == 'LICENSE': if value.find('(') != -1: # XXX: conditionals and OR's: need more # complex parsing and backend support pkg.licenses.append(value) else: pkg.licenses += value.split(' ') elif key == 'SRC_URI': pkg.downloads += ParseConditionalExpr( value) result.append(pkg) return result