]>
git.ipfire.org Git - people/jschlag/pbs.git/blob - src/buildservice/repository.py
a1205dab289c40b3b497d88c5c27e136e40114d2
8 from .decorators
import *
10 class Repositories(base
.Object
):
11 def _get_repository(self
, query
, *args
):
12 res
= self
.db
.get(query
, *args
)
15 return Repository(self
.backend
, res
.id, data
=res
)
17 def _get_repositories(self
, query
, *args
):
18 res
= self
.db
.query(query
, *args
)
21 yield Repository(self
.backend
, row
.id, data
=row
)
24 repositories
= self
._get
_repositories
("SELECT * FROM repositories \
25 WHERE deleted IS FALSE ORDER BY distro_id, name")
27 return iter(repositories
)
29 def create(self
, distro
, name
, description
):
30 return self
._get
_repository
("INSERT INTO repositories(distro_id, name, description) \
31 VALUES(%s, %s, %s) RETURNING *", distro
.id, name
, description
)
33 def get_by_id(self
, repo_id
):
34 return self
._get
_repository
("SELECT * FROM repositories \
35 WHERE id = %s", repo_id
)
37 def get_needs_update(self
, limit
=None):
38 query
= "SELECT id FROM repositories WHERE needs_update = 'Y'"
39 query
+= " ORDER BY last_update ASC"
43 query
+= " LIMIT %d" % limit
45 repos
= self
.db
.query(query
)
47 return [Repository(self
.pakfire
, r
.id) for r
in repos
]
49 def get_history(self
, limit
=None, offset
=None, build
=None, repo
=None, user
=None):
50 query
= "SELECT * FROM repositories_history"
53 query
+= " ORDER BY time DESC"
57 query
+= " LIMIT %s,%s"
58 args
+= [offset
, limit
,]
64 for entry
in self
.db
.query(query
, *args
):
65 entry
= logs
.RepositoryLogEntry(self
.pakfire
, entry
)
71 class Repository(base
.DataObject
):
72 table
= "repositories"
74 def __eq__(self
, other
):
75 if isinstance(other
, self
.__class
__):
76 return self
.id == other
.id
78 def __lt__(self
, other
):
79 if isinstance(other
, self
.__class
__):
80 return self
.parent_id
== other
.id
83 builds
= self
.backend
.builds
._get
_builds
("SELECT builds.* FROM repositories_builds \
84 LEFT JOIN builds ON repositories_builds.build_id = builds.id \
85 WHERE repositories_builds.repo_id = %s", self
.id)
90 res
= self
.db
.get("SELECT COUNT(*) AS len FROM repositories_builds \
91 WHERE repo_id = %s", self
.id)
97 return self
.backend
.repos
._get
_repository
("SELECT * FROM repositories \
98 WHERE parent_id = %s", self
.id)
102 if self
.data
.parent_id
:
103 return self
.backend
.repos
._get
_repository
("SELECT * FROM repositories \
104 WHERE id = %s", self
.data
.parent_id
)
108 return self
.backend
.distros
.get_by_id(self
.data
.distro_id
)
114 "distro" : self
.distro
.info
,
116 "arches" : self
.arches
,
122 self
.settings
.get("repository_baseurl", "http://pakfire.ipfire.org/repositories/"),
123 self
.distro
.identifier
,
131 def mirrorlist(self
):
133 self
.settings
.get("mirrorlist_baseurl", "https://pakfire.ipfire.org/"),
134 "distro", self
.distro
.identifier
,
135 "repo", self
.identifier
,
136 "mirrorlist?arch=%{arch}"
149 priority
= prioritymap
[self
.type]
154 "[repo:%s]" % self
.identifier
,
155 "description = %s - %s" % (self
.distro
.name
, self
.summary
),
157 "baseurl = %s" % self
.url
,
158 "mirrors = %s" % self
.mirrorlist
,
162 lines
.append("priority = %s" % priority
)
164 return "\n".join(lines
)
168 return self
.data
.name
171 def identifier(self
):
172 return self
.name
.lower()
176 return self
.data
.type
180 lines
= self
.description
.splitlines()
188 def description(self
):
189 return self
.data
.description
or ""
193 return self
.data
.parent_id
197 if not self
.data
.key_id
:
200 return self
.pakfire
.keys
.get_by_id(self
.data
.key_id
)
204 return self
.distro
.arches
208 return self
.data
.mirrored
210 def set_enabled_for_builds(self
, state
):
211 self
._set
_attribute
("enabled_for_builds", state
)
213 enabled_for_builds
= property(lambda s
: s
.data
.enabled_for_builds
, set_enabled_for_builds
)
216 def score_needed(self
):
217 return self
.data
.score_needed
221 return self
.data
.time_min
225 return self
.data
.time_max
227 def _log_build(self
, action
, build
, from_repo
=None, to_repo
=None, user
=None):
234 from_repo_id
= from_repo
.id
238 to_repo_id
= to_repo
.id
240 self
.db
.execute("INSERT INTO repositories_history(action, build_id, from_repo_id, to_repo_id, user_id, time) \
241 VALUES(%s, %s, %s, %s, %s, NOW())", action
, build
.id, from_repo_id
, to_repo_id
, user_id
)
243 def add_build(self
, build
, user
=None, log
=True):
244 self
.db
.execute("INSERT INTO repositories_builds(repo_id, build_id, time_added)"
245 " VALUES(%s, %s, NOW())", self
.id, build
.id)
248 build
._update
_bugs
_helper
(self
)
251 self
._log
_build
("added", build
, to_repo
=self
, user
=user
)
253 def rem_build(self
, build
, user
=None, log
=True):
254 self
.db
.execute("DELETE FROM repositories_builds \
255 WHERE repo_id = %s AND build_id = %s", self
.id, build
.id)
258 self
._log
_build
("removed", build
, from_repo
=self
, user
=user
)
260 def move_build(self
, build
, to_repo
, user
=None, log
=True):
261 self
.db
.execute("UPDATE repositories_builds SET repo_id = %s, time_added = NOW() \
262 WHERE repo_id = %s AND build_id = %s", to_repo
.id, self
.id, build
.id)
265 build
._update
_bugs
_helper
(to_repo
)
268 self
._log
_build
("moved", build
, from_repo
=self
, to_repo
=to_repo
,
271 def get_builds(self
, limit
=None, offset
=None):
272 query
= "SELECT build_id AS id FROM repositories_builds \
273 WHERE repo_id = %s ORDER BY time_added DESC"
278 query
+= " LIMIT %s,%s"
279 args
+= [offset
, limit
,]
285 for build
in self
.db
.query(query
, *args
):
286 build
= self
.pakfire
.builds
.get_by_id(build
.id)
289 _builds
.append(build
)
293 def _get_packages(self
, arch
):
294 if arch
.name
== "src":
295 pkgs
= self
.db
.query("SELECT packages.id AS id, packages.path AS path FROM packages \
296 JOIN builds ON builds.pkg_id = packages.id \
297 JOIN repositories_builds ON builds.id = repositories_builds.build_id \
298 WHERE packages.arch = %s AND repositories_builds.repo_id = %s",
302 pkgs
= self
.db
.query("SELECT packages.id AS id, packages.path AS path FROM packages \
303 JOIN jobs_packages ON jobs_packages.pkg_id = packages.id \
304 JOIN jobs ON jobs_packages.job_id = jobs.id \
305 JOIN builds ON builds.id = jobs.build_id \
306 JOIN repositories_builds ON builds.id = repositories_builds.build_id \
307 WHERE (jobs.arch = %s OR jobs.arch = %s) AND \
308 repositories_builds.repo_id = %s",
309 arch
.name
, "noarch", self
.id)
313 def get_packages(self
, arch
):
314 pkgs
= [self
.pakfire
.packages
.get_by_id(p
.id) for p
in self
._get
_packages
(arch
)]
319 def get_paths(self
, arch
):
320 paths
= [p
.path
for p
in self
._get
_packages
(arch
)]
327 return self
.get_packages()
329 def get_unpushed_builds(self
):
330 query
= self
.db
.query("SELECT build_id FROM repositories_builds \
331 WHERE repo_id = %s AND \
332 time_added > (SELECT last_update FROM repositories WHERE id = %s)",
337 b
= self
.pakfire
.builds
.get_by_id(row
.build_id
)
342 def get_obsolete_builds(self
):
343 return self
.pakfire
.builds
.get_obsolete(self
)
345 def needs_update(self
):
346 if self
.get_unpushed_builds
:
352 self
.db
.execute("UPDATE repositories SET last_update = NOW() \
353 WHERE id = %s", self
.id)
355 def get_history(self
, **kwargs
):
360 return self
.pakfire
.repos
.get_history(**kwargs
)
362 def get_build_times(self
):
364 for arch
in self
.arches
:
365 time
= self
.db
.get("SELECT SUM(jobs.time_finished - jobs.time_started) AS time FROM jobs \
366 JOIN builds ON builds.id = jobs.build_id \
367 JOIN repositories_builds ON builds.id = repositories_builds.build_id \
368 WHERE (jobs.arch = %s OR jobs.arch = %s) AND \
369 jobs.type = 'build' AND \
370 repositories_builds.repo_id = %s", arch
, "noarch", self
.id)
372 times
.append((arch
, time
.time
.total_seconds()))
377 class RepositoryAux(base
.DataObject
):
378 table
= "repositories_aux"
382 return self
.data
.name
385 def description(self
):
386 return self
.data
.description
or ""
393 def identifier(self
):
394 return self
.name
.lower()
398 return self
.pakfire
.distros
.get_by_id(self
.data
.distro_id
)
402 "[repo:%s]" % self
.identifier
,
403 "description = %s - %s" % (self
.distro
.name
, self
.name
),
405 "baseurl = %s" % self
.url
,
409 return "\n".join(lines
)