summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlav Vitters <olav@vitters.nl>2014-07-04 11:37:26 +0200
committerOlav Vitters <olav@vitters.nl>2014-07-04 11:37:26 +0200
commitb42cecb4afffc3c63577e0ac5913bd36a46a7112 (patch)
tree0faf1e5bfa5e37e2a74f7f3b8223f925b5eac171
parent7b30112606252ef9d69c3061344f7a3e946ae390 (diff)
downloadmgagnome-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-xmgagnome145
1 files changed, 107 insertions, 38 deletions
diff --git a/mgagnome b/mgagnome
index 9702dc8..7401527 100755
--- a/mgagnome
+++ b/mgagnome
@@ -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')