]> git.ipfire.org Git - people/jschlag/pbs.git/blame - src/buildservice/distribution.py
Merge branch 'master' of git://git.ipfire.org/pbs
[people/jschlag/pbs.git] / src / buildservice / distribution.py
CommitLineData
9137135a
MT
1#!/usr/bin/python
2
f6e6ff79
MT
3import logging
4
512b2188 5from . import arches
2c909128
MT
6from . import base
7from . import builds
8from . import packages
9from . import sources
f6e6ff79 10
2c909128 11from .repository import Repository, RepositoryAux
9137135a 12
e459cbba
MT
13from .decorators import *
14
9137135a 15class Distributions(base.Object):
e459cbba
MT
16 def _get_distribution(self, query, *args):
17 res = self.db.get(query, *args)
18
19 if res:
20 return Distribution(self.backend, res.id, data=res)
9137135a 21
e459cbba
MT
22 def _get_distributions(self, query, *args):
23 res = self.db.query(query, *args)
9137135a 24
e459cbba
MT
25 for row in res:
26 yield Distribution(self.backend, row.id, data=row)
9137135a 27
e459cbba
MT
28 def __iter__(self):
29 distros = self._get_distributions("SELECT * FROM distributions \
30 WHERE deleted IS FALSE ORDER BY name")
9137135a 31
e459cbba 32 return iter(distros)
9137135a 33
e459cbba
MT
34 def get_by_id(self, distro_id):
35 return self._get_distribution("SELECT * FROM distributions \
36 WHERE id = %s", distro_id)
37
38 def get_by_name(self, sname):
39 return self._get_distribution("SELECT * FROM distributions \
40 WHERE sname = %s AND deleted IS FALSE", sname)
9137135a 41
f6e6ff79
MT
42 def get_by_ident(self, ident):
43 return self.get_by_name(ident)
44
45 def get_default(self):
46 # XXX a bit ugly
47 return self.get_by_ident("ipfire3")
48
9137135a 49
e459cbba
MT
50class Distribution(base.DataObject):
51 table = "distributions"
9137135a
MT
52
53 def __repr__(self):
54 return "<%s %s>" % (self.__class__.__name__, self.name)
55
9137135a
MT
56 @property
57 def info(self):
58 return {
59 "name" : self.name,
60 "sname" : self.sname,
61 "slogan" : self.slogan,
9137135a 62 "vendor" : self.vendor,
f6e6ff79 63 "contact" : self.contact,
9137135a
MT
64 "description" : self.description,
65 }
66
f6e6ff79
MT
67 def get_config(self):
68 try:
69 name, release = self.name.split()
70 except:
71 name = self.name
72 release = "N/A"
73
74 lines = [
75 "[distro]",
76 "name = %s" % name,
77 "release = %s" % release,
78 "slogan = %s" % self.slogan,
79 "",
80 "vendor = %s" % self.vendor,
81 "contact = %s" % self.contact,
82 ]
83
84 return "\n".join(lines)
85
9137135a
MT
86 @property
87 def name(self):
f6e6ff79 88 return self.data.name
9137135a
MT
89
90 @property
91 def sname(self):
f6e6ff79 92 return self.data.sname
9137135a
MT
93
94 @property
f6e6ff79
MT
95 def identifier(self):
96 return self.sname
9137135a
MT
97
98 @property
f6e6ff79
MT
99 def slogan(self):
100 return self.data.slogan
101
102 def get_arches(self):
e459cbba
MT
103 res = self.db.query("SELECT arch FROM distributions_arches \
104 WHERE distro_id = %s ORDER BY arch", self.id)
f6e6ff79 105
512b2188 106 return sorted((row.arch for row in res), key=arches.priority)
f6e6ff79 107
e459cbba 108 def set_arches(self, arches):
f6e6ff79
MT
109 self.db.execute("DELETE FROM distro_arches WHERE distro_id = %s", self.id)
110
e459cbba
MT
111 for arch in arches:
112 self.db.execute("INSERT INTO distro_arches(distro_id, arch) \
113 VALUES(%s, %s)", self.id, arch)
f6e6ff79 114
e459cbba 115 self.arches = sorted(arches)
f6e6ff79 116
e459cbba 117 arches = lazy_property(get_arches, set_arches)
9137135a
MT
118
119 @property
120 def vendor(self):
f6e6ff79
MT
121 return self.data.vendor
122
123 def get_contact(self):
124 return self.data.contact
125
126 def set_contact(self, contact):
e459cbba 127 self._set_attribute("contact", contact)
f6e6ff79
MT
128
129 contact = property(get_contact, set_contact)
130
131 def get_tag(self):
132 return self.data.tag
133
134 def set_tag(self, tag):
e459cbba 135 self._set_attribute("tag", tag)
f6e6ff79
MT
136
137 tag = property(get_tag, set_tag)
9137135a
MT
138
139 @property
140 def description(self):
f6e6ff79 141 return self.data.description or ""
9137135a 142
e459cbba 143 @lazy_property
9137135a 144 def repositories(self):
e459cbba
MT
145 _repositories = self.backend.repos._get_repositories("SELECT * FROM repositories \
146 WHERE distro_id = %s", self.id)
f6e6ff79 147
e459cbba
MT
148 # Cache
149 repositories = []
150 for repo in _repositories:
151 repo.distro = self
152 repositories.append(repo)
9137135a 153
e459cbba 154 return sorted(repositories)
f6e6ff79 155
e459cbba 156 @lazy_property
f6e6ff79
MT
157 def repositories_aux(self):
158 _repos = self.db.query("SELECT id FROM repositories_aux \
159 WHERE status = 'enabled' AND distro_id = %s", self.id)
160
161 repos = []
162 for repo in _repos:
163 repo = RepositoryAux(self.pakfire, repo.id)
164 repo._distro = self
165
166 repos.append(repo)
167
168 return sorted(repos)
9137135a
MT
169
170 def get_repo(self, name):
e459cbba
MT
171 repo = self.backend.repos._get_repository("SELECT * FROM repositories \
172 WHERE distro_id = %s AND name = %s", self.id, name)
9137135a 173
e459cbba
MT
174 # Cache
175 repo.distro = self
f6e6ff79
MT
176
177 return repo
178
179 def get_build_repos(self):
180 repos = []
181
182 for repo in self.repositories:
183 if repo.enabled_for_builds:
184 repos.append(repo)
185
186 # Add all aux. repositories.
187 repos += self.repositories_aux
188
189 return repos
190
191 @property
192 def first_repo(self):
193 repos = self.repositories
194
195 if repos:
196 return self.repositories[-1]
9137135a 197
9137135a 198 @property
f6e6ff79
MT
199 def log(self):
200 return [] # TODO
201
202 def has_package(self, name, epoch, version, release):
203 #pkg = self.db.get("SELECT packages.id AS id FROM packages \
204 # JOIN builds ON packages.id = builds.pkg_id \
205 # JOIN sources_commits ON packages.commit_id = sources_commits.id \
206 # JOIN sources ON sources_commits.source_id = sources.id \
207 # WHERE builds.type = 'release' AND sources.distro_id = %s \
208 # AND packages.name = %s AND packages.epoch = %s \
209 # AND packages.version = %s AND packages.release = %s LIMIT 1",
210 # self.id, name, epoch, version, release)
211
212 pkg = self.db.get("SELECT p.id AS id FROM packages p \
213 JOIN builds b ON p.id = b.pkg_id \
214 WHERE b.type = 'release' AND b.distro_id = %s AND \
215 p.name = %s AND p.epoch = %s AND p.version = %s AND p.release = %s \
216 LIMIT 1", self.id, name, epoch, version, release)
217
218 if not pkg:
219 logging.debug("Package %s-%s:%s-%s does not exist, yet." % \
220 (name, epoch, version, release))
221 return
222
223 logging.debug("Package %s-%s:%s-%s does already exist." % \
224 (name, epoch, version, release))
225
226 return packages.Package(self.pakfire, pkg.id)
227
228 def delete_package(self, name):
229 pass # XXX figure out what to do at this place
9137135a 230
e459cbba 231 @lazy_property
f6e6ff79 232 def sources(self):
e459cbba 233 _sources = []
f6e6ff79 234
e459cbba
MT
235 for source in self.db.query("SELECT id FROM sources WHERE distro_id = %s", self.id):
236 source = sources.Source(self.pakfire, source.id)
237 _sources.append(source)
f6e6ff79 238
e459cbba 239 return sorted(_sources)
f6e6ff79 240
e459cbba 241 def get_source(self, identifier):
f6e6ff79 242 for source in self.sources:
e459cbba 243 if not source.identifier == identifier:
f6e6ff79 244 continue
9137135a 245
f6e6ff79 246 return source