Example #1
0
 def test_get_macros(self):
     rpm.addMacro('test_macro', 'test_macro value')
     macros = MacroHelper.dump()
     macros = MacroHelper.filter(macros, name='test_macro')
     assert len(macros) == 1
     assert macros[0]['name'] == 'test_macro'
     assert macros[0]['value'] == 'test_macro value'
     assert macros[0]['level'] == -1
Example #2
0
 def test_get_macros(self):
     rpm.addMacro('test_macro', 'test_macro value')
     macros = MacroHelper.dump()
     macros = MacroHelper.filter(macros, name='test_macro')
     assert len(macros) == 1
     assert macros[0]['name'] == 'test_macro'
     assert macros[0]['value'] == 'test_macro value'
     assert macros[0]['level'] == -1
 def test_get_macros(self):
     rpm.addMacro("test_macro", "test_macro value")
     macros = MacroHelper.dump()
     macros = MacroHelper.filter(macros, name="test_macro")
     assert len(macros) == 1
     assert macros[0]["name"] == "test_macro"
     assert macros[0]["value"] == "test_macro value"
     assert macros[0]["level"] == -1
Example #4
0
 def _get_instructions(cls, comments, old_version, new_version):
     """Extract instructions from comments, update version if necessary"""
     instructions = []
     for comment in comments:
         comment = MacroHelper.expand(comment, comment)
         comment = MacroHelper.expand(comment, comment)
         comment = re.sub(r'^#\s*', '', comment)
         comment = comment.replace(old_version, new_version)
         instructions.append(comment)
     return instructions
Example #5
0
    def update_setup_dirname(self, dirname):
        """
        Update %setup or %autosetup dirname argument if needed

        :param dirname: required dirname
        """
        for index, line in enumerate(self.spec_content):
            if line.startswith('%setup') or line.startswith('%autosetup'):
                args = line.split()
                macro = args[0]

                # parse macro arguments, care only about -T and -n
                parser = argparse.ArgumentParser()
                parser.add_argument('-T', action='store_true')
                parser.add_argument('-n', default='%{name}-%{version}')

                namespace, unknown = parser.parse_known_args(args[1:])

                if namespace.T:
                    # -T means not to extract Source0, so this macro instance
                    # can be ignored
                    continue

                # test if modification is really necessary
                if dirname != rpm.expandMacro(namespace.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=-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(unknown)
                    args.append('-n')
                    args.append(new_dirname)

                    self.spec_content[index] = '#{0}'.format(line)
                    self.spec_content.insert(index + 1, ' '.join(args))
                    self.save()
Example #6
0
    def _update_data(self):
        """
        Function updates data from given SPEC file

        :return: 
        """
        # Load rpm information
        try:
            self.spc = rpm.spec(self.path)
        except ValueError:
            raise RebaseHelperError("Problem with parsing SPEC file '%s'" % self.path)
        self.prep_section = self.spc.prep
        # HEADER of SPEC file
        self.hdr = self.spc.sourceHeader

        # All source file mentioned in SPEC file Source[0-9]*
        self.rpm_sections = self._split_sections()
        # determine the extra_version
        logger.debug("Updating the extra version")
        self.sources, self.tar_sources = self._get_initial_sources_list()

        _, self.extra_version, separator = SpecFile.extract_version_from_archive_name(
            self.get_archive(),
            self._get_raw_source_string(0))
        self.set_extra_version_separator(separator)

        self.patches = self._get_initial_patches_list()
        self.macros = MacroHelper.dump()
Example #7
0
    def set_version(self, version):
        """
        Method to update the version in the SPEC file

        :param version: string with new version
        :return: None
        """
        version_re = re.compile(r'^Version:\s*(.+)')
        for index, line in enumerate(self.spec_content):
            match = version_re.search(line)
            if match:
                logger.debug("Updating version in SPEC from '%s' with '%s'",
                             self.get_version(), version)

                # search for used macros in spec file scope
                for m in MacroHelper.filter(self.macros, level=-1, used=True):
                    if m['name'] in match.group(1):
                        # redefine the macro, don't touch Version tag
                        self._set_macro(m['name'], version)
                        return

                self.spec_content[index] = line.replace(
                    match.group(1), version)
                break
        #  save changes to the disc
        self.save()
Example #8
0
    def _update_data(self):
        """
        Function updates data from given SPEC file

        :return: 
        """
        # Load rpm information
        try:
            self.spc = rpm.spec(self.path)
        except ValueError:
            raise RebaseHelperError("Problem with parsing SPEC file '%s'" %
                                    self.path)
        self.sources = self._get_spec_sources_list(self.spc)
        self.prep_section = self.spc.prep
        # HEADER of SPEC file
        self.hdr = self.spc.sourceHeader
        self.rpm_sections = self._split_sections()
        # determine the extra_version
        logger.debug("Updating the extra version")
        _, self.extra_version, separator = SpecFile.extract_version_from_archive_name(
            self.get_archive(), self._get_raw_source_string(0))
        self.set_extra_version_separator(separator)

        self.patches = self._get_initial_patches_list()
        self.macros = MacroHelper.dump()

        # TODO: don't call this at all in SPEC file methods
        if self.download:
            self.download_remote_sources()
Example #9
0
    def set_version(self, version):

        """
        Method to update the version in the SPEC file

        :param version: string with new version
        :return: None
        """
        version_re = re.compile('Version:\s*(.+)')
        for index, line in enumerate(self.spec_content):
            match = version_re.search(line)
            if match:
                logger.debug("Updating version in SPEC from '%s' with '%s'", self.get_version(), version)

                # search for used macros in spec file scope
                for m in MacroHelper.get_macros(level=-1, used=True):
                    if m['name'] in match.group(1):
                        # redefine the macro, don't touch Version tag
                        self._set_macro(m['name'], version)
                        return

                self.spec_content[index] = line.replace(match.group(1), version)
                break
        #  save changes to the disc
        self.save()
Example #10
0
    def update_setup_dirname(self, dirname):
        """
        Update %setup or %autosetup dirname argument if needed

        :param dirname: required dirname
        """
        for index, line in enumerate(self.spec_content):
            if line.startswith('%setup') or line.startswith('%autosetup'):
                args = line.split()
                macro = args[0]

                # parse macro arguments, care only about -T and -n
                parser = argparse.ArgumentParser()
                parser.add_argument('-T', action='store_true')
                parser.add_argument('-n', default='%{name}-%{version}')

                namespace, unknown = parser.parse_known_args(args[1:])

                if namespace.T:
                    # -T means not to extract Source0, so this macro instance
                    # can be ignored
                    continue

                # test if modification is really necessary
                if dirname != rpm.expandMacro(namespace.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=-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(unknown)
                    args.append('-n')
                    args.append(new_dirname)

                    self.spec_content[index] = '#{0}'.format(line)
                    self.spec_content.insert(index + 1, ' '.join(args))
                    self.save()
Example #11
0
    def generate_patch(self):
        """
        Generates patch to the results_dir containing all needed changes for
        the rebased package version
        """
        # Delete removed patches from rebased_sources_dir from git
        removed_patches = self.rebase_spec_file.removed_patches
        if removed_patches:
            self.rebased_repo.index.remove(removed_patches, working_tree=True)

        self.rebase_spec_file.update_paths_to_patches()

        # Generate patch
        self.rebased_repo.git.add(all=True)
        self.rebase_spec_file._update_data()  # pylint: disable=protected-access
        self.rebased_repo.index.commit(MacroHelper.expand(self.conf.changelog_entry, self.conf.changelog_entry))
        patch = self.rebased_repo.git.format_patch('-1', stdout=True, stdout_as_string=False)
        with open(os.path.join(self.results_dir, 'changes.patch'), 'wb') as f:
            f.write(patch)
            f.write(b'\n')

        results_store.set_changes_patch('changes_patch', os.path.join(self.results_dir, 'changes.patch'))