diff options
author | Olav Vitters <olav@vitters.nl> | 2014-07-04 11:37:26 +0200 |
---|---|---|
committer | Olav Vitters <olav@vitters.nl> | 2014-07-04 11:37:26 +0200 |
commit | b42cecb4afffc3c63577e0ac5913bd36a46a7112 (patch) | |
tree | 0faf1e5bfa5e37e2a74f7f3b8223f925b5eac171 | |
parent | 7b30112606252ef9d69c3061344f7a3e946ae390 (diff) | |
download | mgagnome-b42cecb4afffc3c63577e0ac5913bd36a46a7112.tar mgagnome-b42cecb4afffc3c63577e0ac5913bd36a46a7112.tar.gz mgagnome-b42cecb4afffc3c63577e0ac5913bd36a46a7112.tar.bz2 mgagnome-b42cecb4afffc3c63577e0ac5913bd36a46a7112.tar.xz mgagnome-b42cecb4afffc3c63577e0ac5913bd36a46a7112.zip |
fix regexp to handle more cases, work on multiple files
-rwxr-xr-x | mgagnome | 145 |
1 files changed, 107 insertions, 38 deletions
@@ -340,8 +340,16 @@ class SpecFile(object): re_update_version = re.compile(r'^(?P<pre>Version:\s*)(?P<version>.+)(?P<post>\s*)$', re.MULTILINE + re.IGNORECASE) re_update_release = re.compile(r'^(?P<pre>Release:\s*)(?P<release>%mkrel \d+)(?P<post>\s*)$', re.MULTILINE + re.IGNORECASE) re_update_patch = re.compile(r'^(?P<pre>Patch)(?P<nr>[0-9]*)(?P<pre2>:\s*)(?P<patch>.+)(?P<post>\s*)\n', re.MULTILINE + re.IGNORECASE) - re_update_br = re.compile(r'^(?P<pre>BuildRequires:\s*)(?P<br>.+?)(?P<post>\s*\n)', re.MULTILINE + re.IGNORECASE) - re_update_br_unsplit = re.compile(r'^(?P<pre>BuildRequires:\s*)(?P<unsplit>[^\n,]+,[^\n]+)(?P<post>\s*\n)', re.MULTILINE + re.IGNORECASE) + + re_br_part = re.compile(r'(?P<br>[^\s%{},<>=][^\s%{},<>=]*)\b(?P<post>\s*(?:(?P<operator>=|>=|<=|>|<)\s*(?P<version>[^\s%{},]+|\%\{[^\s{%}]+\}|\%[^\s%{},]+)\b)?)') + + #re_update_br = re.compile(r'^(?P<pre>BuildRequires:\s*)(?P<br>[^\s%{},]+?)(?P<post>\s*(?:(?:[<>]=?|=)\s+[^\s%{},]+?)?\s*\n)', re.MULTILINE + re.IGNORECASE) + re_update_br = re.compile(r'^(?P<pre>BuildRequires:\s*)(?P<br>[^\s%{},]+?)(?P<post>\s*(?:(?:[<>]=?|=)\s+(?:[^\s%{},]+|\%\{[^\s{%}]+\}|\%[^\s%{},]+))?\s*\n)', re.MULTILINE + re.IGNORECASE) +# re_update_br_unsplit = re.compile(r'^(?P<pre>BuildRequires:\s*)(?P<unsplit>[^\n,]+,[^\n]*)(?P<post>\s*\n)', re.MULTILINE + re.IGNORECASE) + + re_find_combined_br = re.compile(r'^(?P<pre>BuildRequires:\s*)(?P<unsplit>(?:%s,?(?:[ \t\f\v]+|$)){2,})(?P<unsplitpost>\n)' % (re_br_part.pattern,), re.MULTILINE + re.IGNORECASE) + re_update_br_unsplit = re_find_combined_br +# re_find_combined_br = re.compile(r'^(?P<pre>BuildRequires:\s*)%s.*' % (re_br_part,), re.MULTILINE + re.IGNORECASE) def __init__(self, path, module=None): self.path = path @@ -509,46 +517,37 @@ class SpecFile(object): """Update buildrequirement""" # XXX - doesn't handle buildrequires with version numbers :-( + made_changes = False with open(self.path, "rw") as f: data = f.read() data_before=data # Change any "," in buildrequires into multiple lines - data, nr = self.re_update_br_unsplit.subn(lambda mo: ''.join((''.join((mo.group('pre'), part, mo.group('post'))) for part in re.split(r',\s*', mo.group('unsplit')))), data) + data, nr = self.re_update_br_unsplit.subn(lambda mo: ''.join((''.join((mo.group('pre'), mo2.group(0), mo.group('unsplitpost'))) for mo2 in self.re_br_part.finditer(mo.group('unsplit')) if mo.group(0).strip() != '')), data) # Now update buildrequires if any data, nr = self.re_update_br.subn(lambda mo: ''.join((mo.group('pre'), changes[mo.group('br')], mo.group('post'))) if mo.group('br') in changes else mo.group(0), data) # XXX - very hacky because of multiple changes, could miss out on a change - if data_before == data: + if data_before != data: + made_changes = True + elif len(changes) != 0: print >>sys.stderr, "ERROR: Could not update buildrequires!" return False # Overwrite file with new version number import difflib - sys.stdout.writelines(difflib.unified_diff(data_before.splitlines(True), data.splitlines(True))) - #write_file(self.path, data) + sys.stdout.writelines(difflib.unified_diff(data_before.splitlines(True), data.splitlines(True), self.path, self.path)) + write_file(self.path, data) - self._changes.append('SILENT Updated buildrequirements') + self._changes.append('SILENT clean buildrequirements') + return made_changes MAX_JUDGEMENT=5 - def update(self, version, force=False, max_judgement=MAX_JUDGEMENT): - """Update specfile (increase version)""" - cur_version = self.version - - (judgement, msg) = judge_version_increase(cur_version, version, self.module) - - if judgement < 0: - print >>sys.stderr, "ERROR: %s!" % (msg) - return False - - if judgement < max_judgement: - print "WARNING: %s!" % (msg) - if not force: return False - + def ensure_no_local_changes(self, force=False): # XXX - os.path.join is hackish svn_diff_output = subprocess.check_output(["svn", "diff", os.path.join(self.path, '..')]) if svn_diff_output != '': @@ -564,6 +563,26 @@ class SpecFile(object): except subprocess.CalledProcessError: return False + return True + + + def update(self, version, force=False, max_judgement=MAX_JUDGEMENT): + """Update specfile (increase version)""" + cur_version = self.version + + (judgement, msg) = judge_version_increase(cur_version, version, self.module) + + if judgement < 0: + print >>sys.stderr, "ERROR: %s!" % (msg) + return False + + if judgement < max_judgement: + print "WARNING: %s!" % (msg) + if not force: return False + + if not self.ensure_no_local_changes(force): + return False + with open(self.path, "rw") as f: data = f.read() @@ -845,6 +864,14 @@ class Downstream(object): self.tarballs = TARBALLS self.files = FILES + _provides_cache = {} + @classmethod + def alternative_provides(cls, search_for): + if search_for not in cls._provides_cache: + cls._provides_cache[search_for] = subprocess.check_output(["urpmq", "--whatprovides", search_for, "--provides"]).splitlines() + + return cls._provides_cache[search_for] + @classmethod @retry(subprocess.CalledProcessError) def co(cls, package, cwd=None): @@ -1103,25 +1130,66 @@ def cmd_check_prep(options, parser): def cmd_clean_spec(options, parser): # Directories packages are located in root = os.path.expanduser(Downstream.PKGROOT) - cwd = os.path.join(root, options.package) + packages = options.package if len(options.package) else (l[0] for l in join_streams()) - s = SpecFile(os.path.join(cwd, "SPECS", "%s.spec" % options.package), module=options.package) + import pprint + + for package in packages: + print package + cwd = os.path.join(root, package) + + s = SpecFile(os.path.join(cwd, "SPECS", "%s.spec" % package), module=package) + + if not s.ensure_no_local_changes(): + continue + + made_changes=False + + with open(s.path, "r") as f: + data = f.read() + + for mo in s.re_find_combined_br.finditer(data): + print "c", mo.group(0).strip(), mo.groupdict() + for match in s.re_br_part.findall(mo.group('unsplit')): + print "d", match + + # Convert -devel requires into pkgconfig requires + br = s.buildrequires + br_old = [r for r in br.keys() if r.endswith('-devel')] + changes = {} + for req in br_old: + #urpmq --whatprovides 'pkgconfig(polkit-agent-1)' --provides + provides = Downstream.alternative_provides(req) +# provides = subprocess.check_output(["urpmq", "--whatprovides", req, "--provides"]).splitlines() + provides_alt = [clean_pkgconfig_prov(prov) for prov in provides if prov.startswith('pkgconfig(')] + change_to = None + if len(provides_alt) == 1: + change_to = provides_alt[0] + elif len(provides_alt): + basereq = req[:-len('-devel')] + check_for = ['pkgconfig(%s)' % basereq] + if basereq.startswith('lib'): + check_for.append('pkgconfig(%s)' % basereq[len('lib'):]) + else: + check_for.append('pkgconfig(lib%s)' % basereq) + for check in check_for: + if check in provides_alt: + change_to = check + break + print req, "=>", change_to, '(%s)' % ', '.join(provides_alt) + if change_to is not None: changes[req] = change_to - # Convert -devel requires into pkgconfig requires - br = s.buildrequires - br_old = [r for r in br.keys() if r.endswith('-devel')] - changes = {} - for req in br_old: - #urpmq --whatprovides 'pkgconfig(polkit-agent-1)' --provides - provides = subprocess.check_output(["urpmq", "--whatprovides", req, "--provides"]).splitlines() - provides_alt = [clean_pkgconfig_prov(prov) for prov in provides if prov.startswith('pkgconfig(')] - print req, "=>", provides_alt - if len(provides_alt) == 1: - changes[req] = provides_alt[0] - if changes: - s.update_br(changes) + if options.doit: + if s.update_br(changes): made_changes=True + elif changes: + pprint.pprint(changes) + + # If we made it this far, checkin the changes + if made_changes and options.doit: + subprocess.check_call(['mgarepo', 'ci', '-m', s.changes], cwd=cwd) + #s.ensure_no_local_changes() def cmd_package_new_version(options, parser): # Determine the package name @@ -1308,9 +1376,10 @@ def main(): ) subparser = subparsers.add_parser('clean-spec', help='clean specfile') - subparser.add_argument("package", help="Package name") + subparser.add_argument("package", help="Package name", nargs='*') + subparser.add_argument("-d", action="store_true", dest="doit") subparser.set_defaults( - func=cmd_clean_spec + func=cmd_clean_spec, doit=False ) subparser = subparsers.add_parser('check-version', help='check if spec version and downstream version match') |