diff options
Diffstat (limited to 'diff-gitosis-conf-against-repositories-xml.py')
-rwxr-xr-x | diff-gitosis-conf-against-repositories-xml.py | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/diff-gitosis-conf-against-repositories-xml.py b/diff-gitosis-conf-against-repositories-xml.py new file mode 100755 index 0000000..580f2ad --- /dev/null +++ b/diff-gitosis-conf-against-repositories-xml.py @@ -0,0 +1,180 @@ +#!/usr/bin/env python +# Copyright (C) 2009 Sebastian Pipping <sebastian@pipping.org> +# Licensed under GPL 2 or later + +import sys +import os +if len(sys.argv) not in (3, 4): + print "USAGE:\n python %s foo/gitosis.conf bar/repositories.xml [baz/extended.xml]" % \ + os.path.basename(sys.argv[0]) + sys.exit(1) +gitosis_conf_location = sys.argv[1] +repositories_xml_location = sys.argv[2] +extended_xml_location = (len(sys.argv) == 4) and sys.argv[3] or None + + +import xml.etree.ElementTree as ET +from ConfigParser import ConfigParser +import re + +from sharedutils import * # local + + +def sort_as_in(elements, tag_order): + order_map = dict((v, i) for i, v in enumerate(tag_order)) + deco = (t for t in enumerate(elements)) + deco_sorted = sorted(deco, key=lambda (i, v): (order_map[v.tag], i)) + return list(v for _, v in deco_sorted) + +class ChangeLog: + def __init__(self, repo_name, is_new): + self.empty = True + self.repo_name = repo_name + self.is_new = is_new + + def log(self, kind, details): + if self.empty: + if self.is_new: + print 'Repo "%s" missing completely' % self.repo_name + else: + print 'Analyzing repo "%s":' % self.repo_name + self.empty = False + elif not self.is_new: + print '- Missing %s "%s"' % (kind, details) + + +OWNER_REGEX = re.compile('^([^<]+) (?:\([^)]+\) )?<([^ ]+@[^ ]+)>$') +NOT_AN_OVERLAY_MESSAGE = 'Skipping %s (not an overlay)' + + +gitosis_conf = ConfigParser() +gitosis_conf.read(gitosis_conf_location) + +a = ET.parse(open(repositories_xml_location)) +repositories = a.getroot() +overlays_gentoo_org_dict = dict([[e.find('name').text, e] for e in repositories]) + +for section_name in gitosis_conf.sections(): + if section_name.startswith('repo '): + _repo_base = section_name[len('repo '):].strip() + if _repo_base.startswith('dev/'): + repo_name = _repo_base[len('dev/'):].strip() + owner_type = "person" + elif _repo_base.startswith('proj/'): + repo_name = _repo_base[len('proj/'):].strip() + owner_type = "project" + else: + # TODO print NOT_AN_OVERLAY_MESSAGE % repo_name + continue + + _description = gitosis_conf.get(section_name, 'description') + if not gitosis_conf.has_option(section_name, 'gentoo-is-overlay') or \ + not gitosis_conf.getboolean(section_name, 'gentoo-is-overlay'): + if not _description.lower().endswith('overlay'): + # TODO print NOT_AN_OVERLAY_MESSAGE % repo_name + continue + + is_new = repo_name not in overlays_gentoo_org_dict + if is_new: + repo = ET.Element('repo') + repositories.append(repo) + name = ET.Element('name') + name.text = repo_name + repo.append(name) + else: + repo = overlays_gentoo_org_dict[repo_name] + log = ChangeLog(repo_name, is_new) + + if 'status' not in repo.attrib: + repo.attrib['status'] = 'official' + log.log('attribute', 'status') + + if 'quality' not in repo.attrib: + repo.attrib['quality'] = 'experiental' + log.log('attribute', 'quality') + + homepage = repo.find('homepage') + if homepage == None: + homepage = ET.Element('homepage') + homepage.text = 'http://git.overlays.gentoo.org/gitweb/?p=%s.git;a=summary' % _repo_base + repo.append(homepage) + log.log('homepage', homepage.text) + + description = repo.find('description') + if description == None: + description = ET.Element('description', lang='en') + description.text = _description + repo.append(description) + log.log('description', _description) + + + _owner = gitosis_conf.get(section_name, 'owner') + _owner_match = OWNER_REGEX.match(_owner) + + owner = repo.find('owner') + if owner == None: + owner = ET.Element('owner', type=owner_type) + repo.append(owner) + log.log('owner', 'TODO') + + owner_name = owner.find('name') + if owner_name == None: + owner_name = ET.Element('name') + owner_name.text = _owner_match.group(1) + log.log('owner name', owner_name.text) + + owner_email = owner.find('email') + if owner_email == None: + owner_email = ET.Element('email') + owner_email.text = _owner_match.group(2) + log.log('owner email', owner_email.text) + + owner[:] = [owner_email, owner_name] + + + _sources = set((source.attrib['type'], source.text) for source in repo.findall('source')) + source_uris = ( + 'git://git.overlays.gentoo.org/%s.git' % _repo_base, + 'http://git.overlays.gentoo.org/gitroot/%s.git' % _repo_base, + 'git+ssh://git@git.overlays.gentoo.org/%s.git' % _repo_base, + ) + for uri in source_uris: + if ('git', uri) not in _sources and \ + ('git', uri[:-len('.git')]) not in _sources: + source = ET.Element('source', type='git') + source.text = uri + repo.append(source) + log.log('git source', uri) + + + _feeds = set(feed.text for feed in repo.findall('feed')) + feed_uris = ( + 'http://git.overlays.gentoo.org/gitweb/?p=%s.git;a=atom' % _repo_base, + 'http://git.overlays.gentoo.org/gitweb/?p=%s.git;a=rss' % _repo_base, + ) + for uri in feed_uris: + if uri not in _feeds: + feed = ET.Element('feed') + feed.text = uri + repo.append(feed) + log.log('feed', uri) + + repo[:] = sort_as_in(repo[:], ( + 'name', 'description', 'longdescription', + 'homepage', 'owner', 'source', 'feed')) + + if is_new or not log.empty: + if extended_xml_location == None: + TERM_WIDTH = 67 + print '-'*TERM_WIDTH + sys.stdout.write(' ') + indent(repo, 1) + repo.tail = '\n' + ET.ElementTree(repo).write(sys.stdout) + print '-'*TERM_WIDTH + print + + +if extended_xml_location != None: + indent(repositories) + a.write(extended_xml_location) |