def set_new_patches(self, fns): self.wipe_patches() if not fns: return apply_method = self.patches_apply_method() ps = '' pa = '' for i, pfn in enumerate(fns, start=1): ps += "Patch%04d: %s\n" % (i, pfn) if apply_method == 'rpm': pa += "%%patch%04d -p1\n" % i ## PatchXXX: lines after Source0 / #patches_base= self._txt, n = re.subn(self.RE_AFTER_PATCHES_BASE, r'\g<1>%s\n' % ps, self.txt, count=1) if n != 1: self._txt, n = re.subn(self.RE_AFTER_SOURCES, r'\g<1>%s\n' % ps, self.txt, count=1) if n != 1: raise exception.SpecFileParseError( spec_fn=self.fn, error="Failed to append PatchXXXX: lines") ## %patchXXX -p1 lines after "%setup" if needed if apply_method == 'rpm': self._txt, n = re.subn(r'((?:^|\n)%setup[^\n]*\n)\s*', r'\g<1>\n%s\n' % pa, self.txt) if n == 0: raise exception.SpecFileParseError( spec_fn=self.fn, error="Failed to append %patchXXXX lines after %setup")
def get_source_urls(self): # arcane rpm constants, now in python! sources = filter(lambda x: x[2] == 1, self.rpmspec.sources) if len(sources) == 0: error = "No sources found" raise exception.SpecFileParseError(spec_fn=self.fn, error=error) # OpenStack packages seem to always use only one tarball sources0 = filter(lambda x: x[1] == 0, sources) if len(sources0) == 0: error = "Source0 not found" raise exception.SpecFileParseError(spec_fn=self.fn, error=error) source_url = sources0[0][0] return [source_url]
def get_tag(self, tag, expand_macros=False): m = re.search('^%s:\s+(\S.*)$' % tag, self.txt, re.M) if not m: raise exception.SpecFileParseError(spec_fn=self.fn, error="%s tag not found" % tag) tag = m.group(1).rstrip() if expand_macros and has_macros(tag): # don't parse using rpm unless required tag = self.expand_macro(tag) return tag
def rpmspec(self): if not self._rpmspec: if not RPM_AVAILABLE: raise exception.RpmModuleNotAvailable() rpm.addMacro('_sourcedir', os.path.dirname(os.path.realpath(self.fn))) try: self._rpmspec = rpm.spec(self.fn) except ValueError, e: raise exception.SpecFileParseError(spec_fn=self.fn, error=e.args[0])
def set_new_patches(self, fns): self.wipe_patches() if not fns: return apply_method = self.patches_apply_method() ps = '' pa = '' for i, pfn in enumerate(fns, start=1): ps += "Patch%04d: %s\n" % (i, pfn) if apply_method == 'rpm': pa += "%%patch%04d -p1\n" % i # PatchXXX: lines after Source0 / #patches_base= self._txt, n = re.subn(self.RE_AFTER_PATCHES_BASE, r'\g<1>%s\n' % ps, self.txt, count=1) if n != 1: m = None for m in re.finditer(self.RE_AFTER_SOURCES, self.txt): pass if not m: raise exception.SpecFileParseError( spec_fn=self.fn, error="Failed to append PatchXXXX: lines") i = m.end() startnl, endnl = '', '' if self._txt[i - 2] != '\n': startnl += '\n' if self._txt[i] != '\n': endnl += '\n' self._txt = self._txt[:i] + startnl + ps + endnl + self._txt[i:] # %patchXXX -p1 lines after "%setup" if needed if apply_method == 'rpm': self._txt, n = re.subn(r'((?:^|\n)%setup[^\n]*\n)\s*', r'\g<1>\n%s\n' % pa, self.txt) if n == 0: raise exception.SpecFileParseError( spec_fn=self.fn, error="Failed to append %patchXXXX lines after %setup")
def _create_new_patches_base(self, base): self._txt, n = re.subn(self.RE_PATCH, r'\n#\n# patches_base=%s\n#\n\g<1>' % base, self.txt, count=1, flags=re.M) if n != 1: self._txt, n = re.subn(self.RE_AFTER_SOURCES, r'\g<1>#\n# patches_base=%s\n#\n\n' % base, self.txt, count=1, flags=re.M) if n != 1: raise exception.SpecFileParseError( spec_fn=self.fn, error="Unable to create new #patches_base entry.")
def set_patches_base(self, base): v, _ = self.get_patches_base() if base: if v is None: self._create_new_patches_base(base) else: self._txt, n = re.subn(r'(#\s*patches_base\s*=\s*)[\w.+]*', r'\g<1>%s' % base, self.txt, flags=re.M) if n != 1: raise exception.SpecFileParseError( spec_fn=self.fn, error="Unable to set new #patches_base") else: if v is not None: self._txt = re.sub( r'(?:\n#)+\s*patches_base\s*=[^\n]*\n(?:#\n)*', '', self.txt, flags=re.M)