コード例 #1
0
 def test_get_macros(self):
     rpm.addMacro('test_macro', 'test_macro value')
     macros = MacroHelper.dump()
     macros = MacroHelper.filter(macros, name='test_macro', level=-1)
     assert len(macros) == 1
     assert macros[0]['name'] == 'test_macro'
     assert macros[0]['value'] == 'test_macro value'
     assert macros[0]['level'] == -1
コード例 #2
0
ファイル: test_helpers.py プロジェクト: phracek/rebase-helper
 def test_get_macros(self):
     rpm.addMacro('test_macro', 'test_macro value')
     macros = MacroHelper.dump()
     macros = MacroHelper.filter(macros, name='test_macro', level=-1)
     assert len(macros) == 1
     assert macros[0]['name'] == 'test_macro'
     assert macros[0]['value'] == 'test_macro value'
     assert macros[0]['level'] == -1
コード例 #3
0
    def _correct_missing_files(cls, rebase_spec_file, files):
        """Adds files found in buildroot which are missing in %files
        sections in the SPEC file. Each file is added to a %files section
        with the closest matching path.

        """
        # get %{name} macro
        macros = [
            m for m in MacroHelper.filter(rebase_spec_file.macros, level=-3)
            if m['name'] == 'name'
        ]
        macros.extend(m for m in rebase_spec_file.macros
                      if m['name'] in MacroHelper.MACROS_WHITELIST)
        macros = MacroHelper.expand_macros(macros)
        # ensure maximal greediness
        macros.sort(key=lambda k: len(k['value']), reverse=True)

        result: Dict[str, AddedFiles] = collections.defaultdict(
            lambda: collections.defaultdict(list))
        for file in files:
            section = cls._get_best_matching_files_section(
                rebase_spec_file, file)
            if section is None:
                logger.error(
                    'The specfile does not contain any %files section, cannot add the missing files'
                )
                break
            substituted_path = cls._sanitize_path(
                MacroHelper.substitute_path_with_macros(file, macros))
            try:
                index = [
                    i for i, l in enumerate(
                        rebase_spec_file.spec_content.section(section)) if l
                ][-1] + 1
            except IndexError:
                # section is empty
                index = 0
            rebase_spec_file.spec_content.section(section).insert(
                index, substituted_path)
            result['added'][section].append(substituted_path)
            logger.info("Added %s to '%s' section", substituted_path, section)

        return result
コード例 #4
0
    def update_setup_dirname(self, dirname):
        """
        Update %setup or %autosetup dirname argument if needed

        :param dirname: new dirname to be used
        """
        parser = self._get_setup_parser()

        prep = self.spec_content.section('%prep')
        if not prep:
            return

        for index, line in enumerate(prep):
            if line.startswith('%setup') or line.startswith('%autosetup'):
                args = shlex.split(line)
                macro = args[0]
                args = [MacroHelper.expand(a, '') for a in args[1:]]

                # parse macro arguments
                try:
                    ns, unknown = parser.parse_known_args(args)
                except ParseError:
                    continue

                # check if this macro instance is extracting Source0
                if ns.T and ns.a != 0 and ns.b != 0:
                    continue

                # check if modification is really necessary
                if dirname != ns.n:
                    new_dirname = dirname

                    # get %{name} and %{version} macros
                    macros = [m for m in MacroHelper.filter(self.macros, level=-3) if m['name'] in ('name', 'version')]
                    # add all macros from spec file scope
                    macros.extend(MacroHelper.filter(self.macros, level=0))
                    # omit short macros
                    macros = [m for m in macros if len(m['value']) > 1]
                    # ensure maximal greediness
                    macros.sort(key=lambda k: len(k['value']), reverse=True)

                    # substitute tokens with macros
                    for m in macros:
                        if m['value'] and m['value'] in dirname:
                            new_dirname = new_dirname.replace(m['value'], '%{{{}}}'.format(m['name']))

                    args = [macro]
                    args.extend(['-n', new_dirname])
                    if ns.a != -1:
                        args.extend(['-a', str(ns.a)])
                    if ns.b != -1:
                        args.extend(['-b', str(ns.b)])
                    if ns.T:
                        args.append('-T')
                    if ns.q:
                        args.append('-q')
                    if ns.c:
                        args.append('-c')
                    if ns.D:
                        args.append('-D')
                    if ns.v:
                        args.append('-v')
                    if ns.N:
                        args.append('-N')
                    if ns.p != -1:
                        args.extend(['-p', str(ns.p)])
                    if ns.S != '':
                        args.extend(['-S', ns.S])
                    args.extend(unknown)

                    prep[index] = ' '.join(args)