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
예제 #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"
     )
예제 #4
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
예제 #5
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")
예제 #6
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
예제 #7
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"
예제 #8
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)
예제 #9
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}
    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')
예제 #12
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
    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"
예제 #16
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'
예제 #17
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_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]
예제 #19
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]
예제 #21
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)
예제 #22
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
예제 #23
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
    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"]
예제 #25
0
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
예제 #26
0
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)
예제 #28
0
    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)
예제 #29
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',
                               '.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
            }
예제 #30
0
 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]
예제 #31
0
def parseSpec(path):
    return Spec.from_file(Path(path), initializeSpecDirs())
예제 #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