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 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 _get_pkg_lib(self): """ Get package library. :param None: None :returns: library path list of package :raises: None """ try: user_gitee = gitee.Gitee() except NameError: sys.exit(1) spec_string = user_gitee.get_spec(self.repo) if not spec_string: print("WARNING: Spec of {pkg} can't be found on master".format(pkg=self.repo)) return None lib_list = [] spec_file = Spec.from_string(spec_string) with tempfile.TemporaryDirectory() as dir_name: for pkg_name in spec_file.packages_dict.keys(): pkg_path = self.download_pkg(pkg_name, dir_name) if not pkg_path: continue lib_path = self.get_lib_path(pkg_path) if lib_path: lib_list.extend(lib_path) self.delete_pkg(pkg_path) return list(set(lib_list))
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 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_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_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 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_replace_user_defined_macro(self) -> None: spec = Spec.from_string(""" Name: foo Version: 2 %define var bar """) s = "%{name}/%{version}/%{var}" assert replace_macros(s, spec) == "foo/2/bar"
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_replace_macro_that_is_tag_name(self) -> None: """Test that we are able to replace macros which are in the tag list. See issue https://github.com/bkircher/python-rpm-spec/issues/33. """ spec = Spec.from_string(r""" %global myversion 1.2.3 Version: %{myversion} """) assert replace_macros(spec.version, spec) == "1.2.3" spec = Spec.from_string(r""" %global version 1.2.3 Version: %{version} """) assert replace_macros(spec.version, spec) == "1.2.3"
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_replace_user_defined_macro(self): spec = Spec.from_string(""" Name: foo Version: 2 %define var bar """) s = '%{name}/%{version}/%{var}' assert 'foo/2/bar' == replace_macros(s, spec)
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_replace_macro_with_leading_exclamation_point(self): spec = Spec.from_string(""" Name: git Version: 2.15.1 """) assert 'https://www.kernel.org/pub/software/scm/git/testing/git-2.15.1.tar.xz' \ == replace_macros( 'https://www.kernel.org/pub/software/scm/git/%{!stable:testing/}%{name}-%{version}.tar.xz', spec)
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_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_replace_macro_with_positive_conditional(self): spec = Spec.from_string(""" Name: git Version: 2.15.1 %define rcrev .rc0 """) assert 'https://www.kernel.org/pub/software/scm/git/testing/git-2.15.1.rc0.tar.xz' \ == replace_macros( 'https://www.kernel.org/pub/software/scm/git/%{?rcrev:testing/}%{name}-%{version}%{?rcrev}.tar.xz', spec)
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_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_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_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_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 __manual_operate(gt_api, op_args): """ Manual operation of this module """ spec_string = gt_api.get_spec(op_args.repo_pkg, op_args.branch) if not spec_string: print( "WARNING: Spec of {pkg} can't be found on the {br} branch.".format( pkg=op_args.repo_pkg, br=op_args.branch)) sys.exit(1) spec_file = Spec.from_string(spec_string) cur_version = replace_macros(spec_file.version, spec_file) branch_info = gt_api.get_branch_info(op_args.branch) if not branch_info: sys.exit(1) if op_args.fork_then_clone: fork_clone_repo(gt_api, op_args.repo_pkg, op_args.branch) if op_args.download or op_args.create_spec or op_args.push_create_pr_issue: if not op_args.new_version: print("Please specify the upgraded version of the {}".format( op_args.repo_pkg)) sys.exit(1) if not update_ver_check(op_args.repo_pkg, cur_version, op_args.new_version): sys.exit(1) if op_args.download: if not download_src(gt_api, op_args.repo_pkg, spec_file, cur_version, op_args.new_version): sys.exit(1) if op_args.create_spec: create_spec(gt_api, op_args.repo_pkg, cur_version, op_args.new_version) if op_args.build_pkg and not build_pkg(op_args.repo_pkg, op_args.branch, branch_info["obs_prj"]): sys.exit(1) if op_args.check_rpm_abi: check_result = check_rpm_abi(op_args.repo_pkg) if op_args.push_create_pr_issue: values = make_values(op_args.repo_pkg, cur_version, op_args.new_version, op_args.branch, check_result) push_create_pr_issue(gt_api, values)
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_default_init(self): spec = Spec() assert spec.name is None assert spec.version is None assert spec.epoch is None assert spec.release is None assert spec.summary is None assert spec.license is None assert spec.group is None assert spec.url is None assert spec.buildroot is None assert spec.buildarch is None assert spec.sources == [] assert spec.patches == [] assert spec.build_requires == [] assert spec.requires == [] assert spec.packages == []
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