def test_packages_dict_property(self): spec = Spec.from_file(os.path.join(CURRENT_DIR, 'perl-Array-Compare.spec')) assert isinstance(spec.packages_dict, dict) assert len(spec.packages_dict) == len(spec.packages) spec = Spec.from_file(os.path.join(CURRENT_DIR, 'llvm.spec')) assert isinstance(spec.packages_dict, dict) assert len(spec.packages_dict) == len(spec.packages)
def test_replace_unknown_section(self) -> None: """Ensure that we can print warnings during parsing.""" try: pyrpm.spec.warnings_enabled = True with pytest.warns(UserWarning): Spec.from_file(os.path.join(CURRENT_DIR, "perl-Array-Compare.spec")) finally: pyrpm.spec.warnings_enabled = False
def test_replace_macro_twice(self) -> None: spec = Spec.from_file(os.path.join(CURRENT_DIR, "jsrdbg.spec")) # pylint: disable=line-too-long assert ( replace_macros(spec.sources[0], spec) == "https://github.com/swojtasiak/jsrdbg/archive/26f9f2b27c04b4aec9cd67baaf9a0a206bbbd5c7.tar.gz#/jsrdbg-26f9f2b27c04b4aec9cd67baaf9a0a206bbbd5c7.tar.gz" )
def build_requires_graph(specs, repos, base_repos=None, cache_ttl=3600): if isinstance(specs, str): # support both a single spec and a list specs = [specs] # get hawkey.Sack of repos to query sack = query.fetch_repos_sack(repos) q = hawkey.Query(sack) log.info("Loaded %d packages from %d repos." % (len(sack), len(repos))) if base_repos: base_sack = query.fetch_repos_sack(base_repos) base_q = hawkey.Query(base_sack) log.info("Loaded %d packages from %d base repos." % (len(base_sack), len(base_repos))) else: base_q = None dep_graph = nx.DiGraph() processed = {} for spec_fn in specs: log.info("Processing .spec file: %s", spec_fn) spec = Spec.from_file(spec_fn) brs = rpmreq.spec.build_requires(spec) spec_node = DepNode(spec_fn, special='SPEC') dep_graph.add_edge(ROOT_NODE, spec_node) # build a dependency graph recursively _build_dep_graph(dep_graph, processed, spec_node, brs, q=q, base_q=base_q) return dep_graph
def test_replace_macro_with_negative_conditional(self) -> None: spec = Spec.from_file(os.path.join(CURRENT_DIR, "git.spec")) assert (replace_macros( "https://www.kernel.org/pub/software/scm/git/%{?rcrev:testing/}%{name}-%{version}%{?rcrev}.tar.xz", spec, ) == "https://www.kernel.org/pub/software/scm/git/git-2.15.1.tar.xz")
def test_parse_only_base_package(self): # spec file does not contain %package directive spec = Spec.from_file( os.path.join(CURRENT_DIR, 'perl-Array-Compare.spec')) assert len(spec.packages) == 1 assert spec.packages[0].name == 'perl-Array-Compare' assert not spec.packages[0].is_subpackage
def test_replace_macro_with_spec(self): spec = Spec.from_file(os.path.join(CURRENT_DIR, "llvm.spec")) assert ( replace_macros(spec.sources[0], spec) == "http://llvm.org/releases/3.8.0/llvm-3.8.0.src.tar.xz" ) assert replace_macros(spec.sources[1], spec) == "llvm-config.h"
def test_replace_unknown_macro(self) -> None: """Ensure that string that do not have a definition in the spec file are left intact.""" spec = Spec.from_file( os.path.join(CURRENT_DIR, "perl-Array-Compare.spec")) s = "%{foobar}" assert s == replace_macros(s, spec=spec)
def spec_file(self, input, kwargs): """ locate and load spec file """ task_subject = "Load Spec file" task_log = OrderedDict() try: root_dir = '' spec_file = '' tarballs = [] src_translations = [] src_tar_file = None related_tarballs = [] for root, dirs, files in os.walk(input['extract_dir']): root_dir = root for file in files: if file.endswith('.spec') and not file.startswith('.'): spec_file = os.path.join(root, file) zip_ext = ('.tar', '.tar.gz', '.tar.bz2', '.tar.xz') if file.endswith(zip_ext): tarballs.append(file) translation_ext = ('.po', ) if file.endswith(translation_ext): src_translations.append(file) spec_obj = Spec.from_file(spec_file) if len(tarballs) > 0: probable_tarball = spec_obj.sources[0].split('/')[-1].replace( "%{name}", spec_obj.name).replace("%{version}", spec_obj.version) src_tar_file = os.path.join(root_dir, probable_tarball) \ if probable_tarball in tarballs \ else os.path.join(root_dir, tarballs[0]) if len(src_translations) > 0: src_translations = map( lambda x: os.path.join(root_dir, x), src_translations ) spec_sections = RpmSpecFile(os.path.join(input['base_dir'], spec_file)) version_release = spec_obj.release[0] release_related_tarballs = [tarball for tarball in tarballs if version_release in tarball and tarball in spec_obj.sources] if release_related_tarballs: related_tarballs = [os.path.join(root_dir, x) for x in release_related_tarballs] except Exception as e: task_log.update(self._log_task( input['log_f'], task_subject, 'Loading Spec file failed %s' % str(e) )) else: task_log.update(self._log_task( input['log_f'], task_subject, spec_obj.sources, text_prefix='Spec file loaded, Sources' )) return { 'spec_file': spec_file, 'src_tar_file': src_tar_file, 'spec_obj': spec_obj, 'src_translations': [i for i in src_translations], 'spec_sections': spec_sections, 'related_tarballs': related_tarballs }, {task_subject: task_log}
def test_subpackage_tags(self) -> None: spec = Spec.from_file(os.path.join(CURRENT_DIR, "jsrdbg.spec")) # Summary: tag assert spec.summary == "JavaScript Remote Debugger for SpiderMonkey" packages = spec.packages_dict assert packages["jsrdbg-devel"].summary == "Header files, libraries and development documentation for %{name}" assert packages["jrdb"].summary == "A command line debugger client for %{name}"
def test_parse_subpackages(self): # spec file contains four subpackages and one base package spec = Spec.from_file(os.path.join(CURRENT_DIR, 'llvm.spec')) assert len(spec.packages) == 5 for package in spec.packages: assert isinstance(package, Package) assert package.name.startswith('llvm')
def test_subpackage_has_build_requires(self): """Make sure that Requires:, BuildRequires:, and so on exist on sub-packages even though they might be empty. """ spec = Spec.from_file(os.path.join(CURRENT_DIR, 'git.spec')) core_package = spec.packages_dict['git-core'] assert len(core_package.build_requires) == 0
def test_subpackage_tags(self): spec = Spec.from_file(os.path.join(CURRENT_DIR, 'jsrdbg.spec')) # Summary: tag assert spec.summary == 'JavaScript Remote Debugger for SpiderMonkey' packages = spec.packages_dict assert packages['jsrdbg-devel'].summary == \ 'Header files, libraries and development documentation for %{name}' assert packages['jrdb'].summary == 'A command line debugger client for %{name}'
def test_parse_subpackage_names(self): # spec file contains %package -n directive spec = Spec.from_file(os.path.join(CURRENT_DIR, 'jsrdbg.spec')) assert len(spec.packages) == 3 expected = ['jrdb', 'jsrdbg', 'jsrdbg-devel'] actual = [package.name for package in spec.packages] for name in expected: assert name in actual
def test_parse_llvm_spec(self) -> None: spec = Spec.from_file(os.path.join(CURRENT_DIR, "llvm.spec")) assert spec.name == "llvm" assert spec.version == "3.8.0" assert len(spec.sources) == 2 assert spec.sources[0] == "http://llvm.org/releases/%{version}/%{name}-%{version}.src.tar.xz" assert spec.sources[1] == "llvm-config.h" assert len(spec.patches) == 1 assert spec.patches[0] == "llvm-3.7.1-cmake-s390.patch"
def test_defines(self): spec = Spec.from_file(os.path.join(CURRENT_DIR, 'attica-qt5.spec')) # Check if they exist for define in ('sonum', '_tar_path', '_libname', 'rname'): assert hasattr(spec, define) # Check values assert spec.sonum == '5' assert spec.rname == 'attica' assert spec._libname == 'KF5Attica' assert spec._tar_path == '5.31'
def test_defines(self) -> None: spec = Spec.from_file(os.path.join(CURRENT_DIR, "attica-qt5.spec")) # Check if they exist for define in ("sonum", "_tar_path", "_libname", "rname"): assert hasattr(spec, define) # Check values assert spec.sonum == "5" assert spec.rname == "attica" assert spec._libname == "KF5Attica" assert spec._tar_path == "5.31"
def test_parse_perl_array_compare_spec(self): spec = Spec.from_file(os.path.join(CURRENT_DIR, 'perl-Array-Compare.spec')) assert isinstance(spec, Spec) assert 'perl-Array-Compare' == spec.name assert 'Perl extension for comparing arrays' == spec.summary assert 1 == spec.epoch assert '1.16' == spec.version assert 'noarch' == spec.buildarch assert 2 == len(spec.build_requires) assert 'perl >= 1:5.6.0' == spec.build_requires[0]
def test_parse_perl_array_compare_spec(self): spec = Spec.from_file(os.path.join(CURRENT_DIR, "perl-Array-Compare.spec")) assert isinstance(spec, Spec) assert spec.name == "perl-Array-Compare" assert spec.summary == "Perl extension for comparing arrays" assert spec.epoch == "1" assert spec.version == "1.16" assert spec.buildarch == "noarch" assert len(spec.build_requires) == 2 assert spec.build_requires[0].line == "perl >= 1:5.6.0"
def test_parse_llvm_spec(self): spec = Spec.from_file(os.path.join(CURRENT_DIR, 'llvm.spec')) assert 'llvm' == spec.name assert '3.8.0' == spec.version assert 2 == len(spec.sources) assert 'http://llvm.org/releases/%{version}/%{name}-%{version}.src.tar.xz' == \ spec.sources[0] assert 'llvm-config.h' == spec.sources[1] assert 1 == len(spec.patches) assert 'llvm-3.7.1-cmake-s390.patch' == spec.patches[0]
def main(): args = sys.argv if 1 >= len(args): print('no args.') exit() if os.path.isfile(args[1]) == False: print('not find input file.') exit() specfn = args[1] spec = Spec.from_file(specfn) create_git_am_sh(spec, specfn) create_bitbake_include(spec, specfn)
def check_spec_tags(base_path: str, tags: List[str], groups: List[FrozenSet]) -> Set[FrozenSet]: """Returns spec sets which violate matching rules for given tags. """ err_groups = set() for group in groups: variants = defaultdict(set) for spec_filename in group: parsed_spec = Spec.from_file(Path(base_path, spec_filename)) for tag in tags: variants[tag].add(getattr( parsed_spec, tag)) for tag in tags: if len(variants[tag]) > 1: err_groups.add(group) return err_groups
def getSpecMeta(fname): spec = Spec.from_file(fname) meta = {} meta['Name'] = replace_macros(spec.name, spec) meta['Version'] = replace_macros(spec.version, spec) meta['Release'] = replace_macros(spec.release, spec) keys = ['Distribution'] for k in keys: meta[k] = None with open(fname, 'r') as sfile: for line in sfile.readlines(): line = line.split(':') k = line[0].strip() if k in keys: meta[k] = line[1].strip() return meta
def test_parse_perl_array_compare_spec(self) -> None: spec = Spec.from_file(os.path.join(CURRENT_DIR, "perl-Array-Compare.spec")) assert isinstance(spec, Spec) assert spec.name == "perl-Array-Compare" assert spec.summary == "Perl extension for comparing arrays" assert spec.epoch == "1" assert spec.version == "1.16" assert len(spec.build_requires) == 2 assert spec.build_requires[0].line == "perl >= 1:5.6.0" assert spec.buildarch == "noarch" assert spec.excludearch == "alpha" assert spec.exclusivearch == "i386 x86_64" assert spec.buildarch_list == ["noarch"] assert spec.excludearch_list == ["alpha"] assert spec.exclusivearch_list == ["i386", "x86_64"]
def test_spec_build_requires(): spec_path = common.get_test_spec_path('foo') spec = Spec.from_file(spec_path) brs = map(str, rpmreq.spec.build_requires(spec)) exp = [ "PyYAML", "asciidoc >= 0.1", "bar == 1.2.3", "git", "python", "python-pbr", "python-setuptools", "python2-devel", "python2-macro-disabled-breq", "python2-macro-enabled-breq", "python3-PyYAML", "python3-devel", "python3-pbr", "python3-setuptools", ] assert sorted(brs) == exp
from pyrpm.spec import Spec spec = Spec.from_file('attica-qt5.spec') # Access sources and patches via name for br in spec.build_requires: print(f'{br.name} {br.operator} {br.version}' if br. version else f'{br.name}') # cmake >= 3.0 # extra-cmake-modules >= %{_tar_path} # fdupes # kf5-filesystem # pkg-config # cmake(Qt5Core) >= 5.6.0 # cmake(Qt5Network) >= 5.6.0
def test_replace_macro_int_type_val(self): spec = Spec.from_file(os.path.join(CURRENT_DIR, 'perl-Array-Compare.spec')) result = replace_macros('%{epoch}', spec) assert isinstance(result, str)
def parse_rpm_project(self, project, product_data, project_data, branch): if product_data['type'] != 'rpm': return project self.repo.import_project(project, branch=branch) project_data['commit'] = self.repo._.head.commit.hexsha spec_dirs = product_data.get('spec-dirs', [ '.', ]) spec_dir = os.path.join(self.repo._.working_dir, spec_dirs[0]) spec_file = None for file in os.listdir(spec_dir): if file.endswith('.spec'): spec_file = os.path.join(spec_dir, file) break if spec_file is None: raise FileNotFoundException( "No spec file found in '{}'".format(spec_dir)) temp_file = tempfile.mktemp() cmd = 'rpmspec --define "_sourcedir {}" --parse {} > {}'\ .format(self.repo._.working_dir, spec_file, temp_file) exit_code = os.system(cmd) if exit_code: raise Exception("'{}' failed, exit code '{}'".format( cmd, exit_code)) spec = Spec.from_file(temp_file) sources = [] binary_packages = [] project_data['branch'] = branch project_data['spec_project'] = project project_data['source_project'] = project.replace('-build', '') for name in spec.sources: sources.append(name) for package in spec.packages: binary_packages.append(package.name) project_data['version'] = { 'epoch': spec.epoch or 0, 'version': spec.version, 'revision': spec.release, 'full_version': '', } fmt = '{0[version][epoch]}:{0[version][version]}' \ '-{0[version][revision]}' project_data['version']['full_version'] = fmt.format(project_data) project_data['upstream_version'] = project_data['version']['version'] project_data['package_origin'] = 'Undefined' project_data['source_package'] = binary_packages[0] project_data['binary_packages'] = [] for name in binary_packages: project_data['binary_packages'].append({'name': name}) for name in spec.patches: project_data['patches'].append(name) os.remove(temp_file)
def spec_file(self, input, kwargs): """ locate and load spec file """ task_subject = "Load Spec file" task_log = OrderedDict() try: root_dir = '' spec_file = '' tarballs = [] src_translations = [] src_tar_file = None related_tarballs = [] for root, dirs, files in os.walk(input['extract_dir']): root_dir = root for file in files: if file.endswith('.spec') and not file.startswith('.'): spec_file = os.path.join(root, file) zip_ext = ('.tar', '.tar.gz', '.tar.bz2', '.tar.xz', '.tgz') if file.endswith(zip_ext): tarballs.append(file) translation_ext = ('.po', ) if file.endswith(translation_ext): src_translations.append(file) spec_obj = Spec.from_file(spec_file) if len(tarballs) > 0: probable_tarball = spec_obj.sources[0].split('/')[-1].replace( "%{name}", spec_obj.name).replace("%{version}", spec_obj.version) src_tar_file = os.path.join(root_dir, probable_tarball) \ if probable_tarball in tarballs \ else os.path.join(root_dir, tarballs[0]) if len(src_translations) > 0: src_translations = map(lambda x: os.path.join(root_dir, x), src_translations) spec_sections = RpmSpecFile( os.path.join(input['base_dir'], spec_file)) version_release = spec_obj.release[:spec_obj.release.index('%')] release_related_tarballs = [ tarball for tarball in tarballs if version_release in tarball and tarball in spec_obj.sources ] if release_related_tarballs: related_tarballs = [ os.path.join(root_dir, x) for x in release_related_tarballs ] # look for translation specific tarball po_tarball_name = '{0}-{1}'.format(input['package'], 'po') translation_related_tarballs = [ tarball for tarball in tarballs if po_tarball_name in tarball and tarball in spec_obj.sources ] if translation_related_tarballs and len( translation_related_tarballs) > 0: index_in_prep = '-a {0}'.format( spec_obj.sources.index(translation_related_tarballs[0])) if index_in_prep in " ".join([ prep_lines for prep_lines in spec_sections.section.get( 'prep', {}).get(input['package'], []) if prep_lines.startswith('%') ]): related_tarballs.append( os.path.join(root_dir, translation_related_tarballs[0])) except Exception as e: task_log.update( self._log_task(input['log_f'], task_subject, 'Loading Spec file failed %s' % str(e))) else: task_log.update( self._log_task(input['log_f'], task_subject, spec_obj.sources, text_prefix='Spec file loaded, Sources')) return { 'spec_file': spec_file, 'src_tar_file': src_tar_file, 'spec_obj': spec_obj, 'src_translations': [i for i in src_translations], 'spec_sections': spec_sections, 'related_tarballs': related_tarballs }, { task_subject: task_log }
def test_patches_dict_property(self): spec = Spec.from_file(os.path.join(CURRENT_DIR, 'llvm.spec')) assert len(spec.patches_dict) == len(spec.patches) assert spec.patches_dict['Patch0'] is spec.patches[0]
def parseSpec(path): return Spec.from_file(Path(path), initializeSpecDirs())
def get_current_version(specfile: Path): specfile = Spec.from_file(str(specfile)) version = specfile.version patches = None if not hasattr(specfile, "patches") else specfile.patches return version, patches