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
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
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()
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()
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()
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()
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()
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()
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'))