remove TODO, empathy has been added
[check-version.git] / component.py
blob2a21442a65452113b27526bfc7b3283af85e3d37
1 import urllib2
2 import re
3 import commands
4 import os
5 import git
7 try:
8 import elementtree.ElementTree as ET
9 except ImportError:
10 import xml.etree.ElementTree as ET
12 from version import Version
13 try:
14 from PPARequest import PPARequest
15 except ImportError:
16 PPARequest = None
17 import config
19 LOCAL_GIT_REPOS_PATH = os.path.join(config.check_versions_dir, 'git')
21 class Component(object):
22 """abstract class"""
23 def __init__(self, name):
24 self.name = name
26 self.upstream = self._get_upstream_version()
27 self.ubuntu = self._get_ubuntu_versions()
28 self.debian = self._get_debian_versions()
29 self.jhbuild = self._get_jhbuild_versions()
31 if Component.ppa_enabled():
32 self.ppa = self._get_ppa_versions()
33 else:
34 self.ppa = None
36 def _get_upstream_version(self):
37 raise NotImplemented
39 def _get_jhbuild_versions(self):
40 module_set = JhbuildModulesetCache.get_module_set()
41 for child in module_set.getchildren():
42 if child.attrib.get('id') != self.name:
43 continue
44 if child.attrib.get('version'):
45 return {'trunk': Version(child.attrib.get('version'))}
46 return {'trunk': Version(child.find('branch').attrib.get('version'))}
47 return {}
49 def _get_ubuntu_versions(self):
50 return self._rmadison('ubuntu')
52 def _get_debian_versions(self):
53 return self._rmadison('debian')
55 def _rmadison(self, distro):
56 versions = {}
57 (s, o) = commands.getstatusoutput('rmadison -u %s %s' % (distro, self.name))
59 for l in o.split('\n'):
60 try:
61 pkg, ver, distro, archi = l.split('|')
62 except ValueError:
63 continue
65 ver = ver.strip()
66 distro = distro.strip()
67 distro = distro.split('/')[0]
69 versions[distro] = Version(ver, debian=True)
71 return versions
73 def _get_ppa_versions(self):
74 return PPARequest().query(self.name)
76 def __str__(self):
77 return self.name
79 @staticmethod
80 def ppa_enabled():
81 return 'CHECK_VERSION_LAUNCHPAD' in os.environ and PPARequest is not None
83 class HttpComponent(Component):
84 def __init__(self, name, repo):
85 self.repo = repo
87 Component.__init__(self, name)
89 def _get_upstream_version(self):
90 # FIXME: there is probably a better regexp
91 reg_exp = re.compile('%s-.*(?=.tar.gz">)' % self.name)
92 listing = urllib2.urlopen(self.repo)
94 versions = []
95 for release in reg_exp.findall(listing.read()):
96 version = re.split('%s-' % self.name, release)[1]
97 versions.append(Version(version))
99 return max(versions)
101 class GitComponent(Component):
102 def __init__(self, name, remote_repo):
103 self.remote_repo = remote_repo
104 self.local_repo_path = os.path.join(LOCAL_GIT_REPOS_PATH, name)
106 if os.path.exists(self.local_repo_path):
107 # update repo
108 os.chdir(self.local_repo_path)
109 commands.getstatusoutput('git pull')
110 self.local_repo = git.Repo(self.local_repo_path)
111 else:
112 self.local_repo = self._clone_repo()
114 Component.__init__(self, name)
116 def _clone_repo(self):
117 if not os.path.exists(LOCAL_GIT_REPOS_PATH):
118 print "create", LOCAL_GIT_REPOS_PATH
119 os.makedirs(LOCAL_GIT_REPOS_PATH)
121 print "clone", self.remote_repo
122 cmd = 'git clone %s %s' % (self.remote_repo, self.local_repo_path)
123 status, out = commands.getstatusoutput(cmd)
125 return git.Repo(self.local_repo_path)
127 def _get_upstream_version(self):
128 versions = []
130 for tag in self.local_repo.tags:
131 try:
132 version = tag.name.rsplit('-', 1)[1]
133 except IndexError:
134 # assume '_' is used to separate version (as Empathy does)
135 # FIXME: this is horrible
136 version = tag.name.split('_', 1)[1]
137 version = version.replace('_', '.')
139 versions.append(Version(version))
141 return max(versions)
143 class TelepathyComponent(HttpComponent):
144 def __init__(self, name):
145 repo = 'http://telepathy.freedesktop.org/releases/%s' % name
147 HttpComponent.__init__(self, name, repo)
149 class FarsightComponent(HttpComponent):
150 def __init__(self, name):
151 repo = 'http://farsight.freedesktop.org/releases/%s' % name
153 HttpComponent.__init__(self, name, repo)
155 class NiceComponent(HttpComponent):
156 def __init__(self, name):
157 repo = 'http://nice.freedesktop.org/releases/'
159 HttpComponent.__init__(self, name, repo)
162 class JhbuildModulesetCache:
163 module_set = None
164 def get_module_set(cls):
165 if cls.module_set:
166 return cls.module_set
167 external_deps = urllib2.urlopen('http://svn.gnome.org/svn/jhbuild/trunk/modulesets/gnome-external-deps-2.26.modules').read()
168 module_set = ET.fromstring(external_deps)
169 cls.module_set = module_set
170 return module_set
171 get_module_set = classmethod(get_module_set)
173 if __name__ == '__main__':
174 def display(comp):
175 print comp, comp.upstream, comp.ubuntu, comp.debian, comp.ppa, comp.jhbuild
177 display(TelepathyComponent('telepathy-gabble'))
178 display(FarsightComponent('farsight2'))
179 display(NiceComponent('libnice'))
180 display(GitComponent('telepathy-sofiasip', 'git://git.collabora.co.uk/git/telepathy-sofiasip.git'))
181 display(GitComponent('empathy', 'git://git.collabora.co.uk/git/empathy.git'))