]>
Commit | Line | Data |
---|---|---|
9137135a MT |
1 | #!/usr/bin/python |
2 | ||
f6e6ff79 MT |
3 | import logging |
4 | ||
512b2188 | 5 | from . import arches |
2c909128 MT |
6 | from . import base |
7 | from . import builds | |
8 | from . import packages | |
9 | from . import sources | |
f6e6ff79 | 10 | |
2c909128 | 11 | from .repository import Repository, RepositoryAux |
9137135a | 12 | |
e459cbba MT |
13 | from .decorators import * |
14 | ||
9137135a | 15 | class 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 |
50 | class 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 |