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
Esempio n. 3
0
 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"
     )
Esempio n. 4
0
 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))
Esempio n. 6
0
    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)
Esempio n. 7
0
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
Esempio n. 8
0
 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"
Esempio n. 9
0
    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")
Esempio n. 10
0
    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}
Esempio n. 11
0
    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')
Esempio n. 13
0
    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}"
Esempio n. 15
0
    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}'
Esempio n. 17
0
    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
Esempio n. 19
0
    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
Esempio n. 20
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)
Esempio n. 21
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"
Esempio n. 22
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"
Esempio n. 24
0
    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]
Esempio n. 27
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)
Esempio n. 28
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)
Esempio n. 29
0
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
Esempio n. 30
0
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
Esempio n. 31
0
 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 == []
Esempio n. 32
0
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