]>
git.ipfire.org Git - people/jschlag/pbs.git/blob - backend/repository.py
10 class Repositories(base
.Object
):
12 repos
= self
.db
.query("SELECT * FROM repositories")
14 return [Repository(self
.pakfire
, r
.id, r
) for r
in repos
]
16 def get_by_id(self
, repo_id
):
17 repo
= self
.db
.get("SELECT * FROM repositories WHERE id = %s", repo_id
)
20 return Repository(self
.pakfire
, repo
.id, repo
)
22 def get_needs_update(self
, limit
=None):
23 query
= "SELECT id FROM repositories WHERE needs_update = 'Y'"
24 query
+= " ORDER BY last_update ASC"
28 query
+= " LIMIT %d" % limit
30 repos
= self
.db
.query(query
)
32 return [Repository(self
.pakfire
, r
.id) for r
in repos
]
34 def get_history(self
, limit
=None, offset
=None, build
=None, repo
=None, user
=None):
35 query
= "SELECT * FROM repositories_history"
38 query
+= " ORDER BY time DESC"
42 query
+= " LIMIT %s,%s"
43 args
+= [offset
, limit
,]
49 for entry
in self
.db
.query(query
, *args
):
50 entry
= logs
.RepositoryLogEntry(self
.pakfire
, entry
)
56 class Repository(base
.Object
):
57 def __init__(self
, pakfire
, id, data
=None):
58 base
.Object
.__init
__(self
, pakfire
)
70 if self
._data
is None:
71 self
._data
= self
.db
.get("SELECT * FROM repositories WHERE id = %s", self
.id)
75 def __cmp__(self
, other
):
79 if self
.id == other
.id:
82 elif self
.id == other
.parent_id
:
85 elif self
.parent_id
== other
.id:
91 if self
._next
is None:
92 repo
= self
.db
.get("SELECT id FROM repositories \
93 WHERE parent_id = %s LIMIT 1", self
.id)
98 self
._next
= Repository(self
.pakfire
, repo
.id)
103 if not self
.parent_id
:
106 if self
._prev
is None:
107 self
._prev
= Repository(self
.pakfire
, self
.parent_id
)
116 def create(cls
, pakfire
, distro
, name
, description
):
117 id = pakfire
.db
.execute("INSERT INTO repositories(distro_id, name, description)"
118 " VALUES(%s, %s, %s)", distro
.id, name
, description
)
120 return cls(pakfire
, id)
124 if self
._distro
is None:
125 self
._distro
= self
.pakfire
.distros
.get_by_id(self
.data
.distro_id
)
134 "distro" : self
.distro
.info
,
136 "arches" : self
.arches
,
142 self
.settings
.get("repository_baseurl", "http://pakfire.ipfire.org/repositories/"),
143 self
.distro
.identifier
,
151 def mirrorlist(self
):
153 self
.settings
.get("mirrorlist_baseurl", "https://pakfire.ipfire.org/"),
154 "distro", self
.distro
.identifier
,
155 "repo", self
.identifier
,
156 "mirrorlist?arch=%{arch}"
169 priority
= prioritymap
[self
.type]
174 "[repo:%s]" % self
.identifier
,
175 "description = %s - %s" % (self
.distro
.name
, self
.summary
),
177 "baseurl = %s" % self
.url
,
178 "mirrors = %s" % self
.mirrorlist
,
182 lines
.append("priority = %s" % priority
)
184 return "\n".join(lines
)
188 return self
.data
.name
191 def identifier(self
):
192 return self
.name
.lower()
196 return self
.data
.type
200 lines
= self
.description
.splitlines()
208 def description(self
):
209 return self
.data
.description
or ""
213 return self
.data
.parent_id
217 if not self
.data
.key_id
:
220 if self
._key
is None:
221 self
._key
= self
.pakfire
.keys
.get_by_id(self
.data
.key_id
)
228 return self
.distro
.arches
232 return self
.data
.mirrored
== "Y"
234 def get_enabled_for_builds(self
):
235 return self
.data
.enabled_for_builds
== "Y"
237 def set_enabled_for_builds(self
, state
):
243 self
.db
.execute("UPDATE repositories SET enabled_for_builds = %s WHERE id = %s",
247 self
._data
["enabled_for_builds"] = state
249 enabled_for_builds
= property(get_enabled_for_builds
, set_enabled_for_builds
)
252 def score_needed(self
):
253 return self
.data
.score_needed
257 return self
.data
.time_min
261 return self
.data
.time_max
263 def _log_build(self
, action
, build
, from_repo
=None, to_repo
=None, user
=None):
270 from_repo_id
= from_repo
.id
274 to_repo_id
= to_repo
.id
276 self
.db
.execute("INSERT INTO repositories_history(action, build_id, from_repo_id, to_repo_id, user_id, time) \
277 VALUES(%s, %s, %s, %s, %s, NOW())", action
, build
.id, from_repo_id
, to_repo_id
, user_id
)
279 def add_build(self
, build
, user
=None, log
=True):
280 self
.db
.execute("INSERT INTO repositories_builds(repo_id, build_id, time_added)"
281 " VALUES(%s, %s, NOW())", self
.id, build
.id)
284 build
._update
_bugs
_helper
(self
)
287 self
._log
_build
("added", build
, to_repo
=self
, user
=user
)
289 def rem_build(self
, build
, user
=None, log
=True):
290 self
.db
.execute("DELETE FROM repositories_builds \
291 WHERE repo_id = %s AND build_id = %s", self
.id, build
.id)
294 self
._log
_build
("removed", build
, from_repo
=self
, user
=user
)
296 def move_build(self
, build
, to_repo
, user
=None, log
=True):
297 self
.db
.execute("UPDATE repositories_builds SET repo_id = %s, time_added = NOW() \
298 WHERE repo_id = %s AND build_id = %s", to_repo
.id, self
.id, build
.id)
301 build
._update
_bugs
_helper
(to_repo
)
304 self
._log
_build
("moved", build
, from_repo
=self
, to_repo
=to_repo
,
307 def build_count(self
):
308 query
= self
.db
.get("SELECT COUNT(*) AS count FROM repositories_builds \
309 WHERE repo_id = %s", self
.id)
314 def get_builds(self
, limit
=None, offset
=None):
315 query
= "SELECT build_id AS id FROM repositories_builds \
316 WHERE repo_id = %s ORDER BY time_added DESC"
321 query
+= " LIMIT %s,%s"
322 args
+= [offset
, limit
,]
328 for build
in self
.db
.query(query
, *args
):
329 build
= builds
.Build(self
.pakfire
, build
.id)
332 _builds
.append(build
)
336 def _get_packages(self
, arch
):
337 if arch
.name
== "src":
338 pkgs
= self
.db
.query("SELECT packages.id AS id, packages.path AS path FROM packages \
339 JOIN builds ON builds.pkg_id = packages.id \
340 JOIN repositories_builds ON builds.id = repositories_builds.build_id \
341 WHERE packages.arch = %s AND repositories_builds.repo_id = %s",
345 noarch
= self
.pakfire
.arches
.get_by_name("noarch")
348 pkgs
= self
.db
.query("SELECT packages.id AS id, packages.path AS path FROM packages \
349 JOIN jobs_packages ON jobs_packages.pkg_id = packages.id \
350 JOIN jobs ON jobs_packages.job_id = jobs.id \
351 JOIN builds ON builds.id = jobs.build_id \
352 JOIN repositories_builds ON builds.id = repositories_builds.build_id \
353 WHERE (jobs.arch_id = %s OR jobs.arch_id = %s) AND \
354 repositories_builds.repo_id = %s",
355 arch
.id, noarch
.id, self
.id)
359 def get_packages(self
, arch
):
360 pkgs
= [packages
.Package(self
.pakfire
, p
.id) for p
in self
._get
_packages
(arch
)]
365 def get_paths(self
, arch
):
366 paths
= [p
.path
for p
in self
._get
_packages
(arch
)]
373 return self
.get_packages()
375 def get_unpushed_builds(self
):
376 query
= self
.db
.query("SELECT build_id FROM repositories_builds \
377 WHERE repo_id = %s AND \
378 time_added > (SELECT last_update FROM repositories WHERE id = %s)",
383 b
= builds
.Build(self
.pakfire
, row
.build_id
)
388 def get_obsolete_builds(self
):
389 #query = self.db.query("SELECT build_id AS id FROM repositories_builds \
390 # JOIN builds ON repositories.build_id = builds.id \
391 # WHERE repositories_builds.repo_id = %s AND builds.state = 'obsolete'",
396 # b = builds.Build(self.pakfire, row.id)
400 return self
.pakfire
.builds
.get_obsolete(self
)
402 def needs_update(self
):
403 if self
.get_unpushed_builds
:
409 self
.db
.execute("UPDATE repositories SET last_update = NOW() \
410 WHERE id = %s", self
.id)
412 def get_history(self
, **kwargs
):
417 return self
.pakfire
.repos
.get_history(**kwargs
)
419 def get_build_times(self
):
420 noarch
= self
.pakfire
.arches
.get_by_name("noarch")
424 for arch
in self
.pakfire
.arches
.get_all():
425 time
= self
.db
.get("SELECT SUM(UNIX_TIMESTAMP(jobs.time_finished) - UNIX_TIMESTAMP(jobs.time_started)) AS time FROM jobs \
426 JOIN builds ON builds.id = jobs.build_id \
427 JOIN repositories_builds ON builds.id = repositories_builds.build_id \
428 WHERE (jobs.arch_id = %s OR jobs.arch_id = %s) AND \
429 jobs.type = 'build' AND \
430 repositories_builds.repo_id = %s", arch
.id, noarch
.id, self
.id)
432 times
.append((arch
, time
.time
))
437 class RepositoryAux(base
.Object
):
438 def __init__(self
, pakfire
, id):
439 base
.Object
.__init
__(self
, pakfire
)
449 if self
._data
is None:
450 self
._data
= self
.db
.get("SELECT * FROM repositories_aux WHERE id = %s", self
.id)
457 return self
.data
.name
460 def description(self
):
461 return self
.data
.description
or ""
468 def identifier(self
):
469 return self
.name
.lower()
473 if self
._distro
is None:
474 self
._distro
= self
.pakfire
.distros
.get_by_id(self
.data
.distro_id
)
481 "[repo:%s]" % self
.identifier
,
482 "description = %s - %s" % (self
.distro
.name
, self
.name
),
484 "baseurl = %s" % self
.url
,
488 return "\n".join(lines
)