]>
git.ipfire.org Git - people/jschlag/pbs.git/blob - src/buildservice/repository.py
6 log
= logging
.getLogger("repositories")
12 from .constants
import *
13 from .decorators
import *
15 class Repositories(base
.Object
):
16 def _get_repository(self
, query
, *args
):
17 res
= self
.db
.get(query
, *args
)
20 return Repository(self
.backend
, res
.id, data
=res
)
22 def _get_repositories(self
, query
, *args
):
23 res
= self
.db
.query(query
, *args
)
26 yield Repository(self
.backend
, row
.id, data
=row
)
29 repositories
= self
._get
_repositories
("SELECT * FROM repositories \
30 WHERE deleted IS FALSE ORDER BY distro_id, name")
32 return iter(repositories
)
34 def create(self
, distro
, name
, description
):
35 return self
._get
_repository
("INSERT INTO repositories(distro_id, name, description) \
36 VALUES(%s, %s, %s) RETURNING *", distro
.id, name
, description
)
38 def get_by_id(self
, repo_id
):
39 return self
._get
_repository
("SELECT * FROM repositories \
40 WHERE id = %s", repo_id
)
42 def get_history(self
, limit
=None, offset
=None, build
=None, repo
=None, user
=None):
43 query
= "SELECT * FROM repositories_history"
46 query
+= " ORDER BY time DESC"
50 query
+= " LIMIT %s,%s"
51 args
+= [offset
, limit
,]
57 for entry
in self
.db
.query(query
, *args
):
58 entry
= logs
.RepositoryLogEntry(self
.pakfire
, entry
)
65 Remasters all repositories
68 # Skip all repositories that don't need an update
69 if not repo
.needs_update
:
70 log
.debug("Repository %s does not need an update" % repo
)
73 with self
.db
.transaction():
77 class Repository(base
.DataObject
):
78 table
= "repositories"
80 def __eq__(self
, other
):
81 if isinstance(other
, self
.__class
__):
82 return self
.id == other
.id
84 def __lt__(self
, other
):
85 if isinstance(other
, self
.__class
__):
86 return self
.parent_id
== other
.id
89 builds
= self
.backend
.builds
._get
_builds
("SELECT builds.* FROM repositories_builds \
90 LEFT JOIN builds ON repositories_builds.build_id = builds.id \
91 WHERE repositories_builds.repo_id = %s", self
.id)
96 res
= self
.db
.get("SELECT COUNT(*) AS len FROM repositories_builds \
97 WHERE repo_id = %s", self
.id)
103 return self
.backend
.repos
._get
_repository
("SELECT * FROM repositories \
104 WHERE parent_id = %s", self
.id)
108 if self
.data
.parent_id
:
109 return self
.backend
.repos
._get
_repository
("SELECT * FROM repositories \
110 WHERE id = %s", self
.data
.parent_id
)
114 return self
.backend
.distros
.get_by_id(self
.data
.distro_id
)
116 def set_priority(self
, priority
):
117 self
._set
_attribute
("priority", priority
)
119 priority
= property(lambda s
: s
.data
.priority
, set_priority
)
122 if self
.data
.user_id
:
123 return self
.backend
.users
.get_by_id(self
.data
.user_id
)
125 def set_user(self
, user
):
126 self
._set
_attribute
("user_id", user
.id)
128 user
= property(get_user
, set_user
)
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}"
163 "[repo:%s]" % self
.identifier
,
164 "description = %s - %s" % (self
.distro
.name
, self
.summary
),
166 "baseurl = %s" % self
.url
,
170 lines
.append("mirrors = %s" % self
.mirrorlist
)
173 lines
.append("priority = %s" % self
.priority
)
175 return "\n".join(lines
)
179 return self
.data
.name
182 def identifier(self
):
183 return self
.name
.lower()
187 return self
.data
.type
191 lines
= self
.description
.splitlines()
199 def description(self
):
200 return self
.data
.description
or ""
204 return self
.data
.parent_id
208 if not self
.data
.key_id
:
211 return self
.pakfire
.keys
.get_by_id(self
.data
.key_id
)
215 return self
.distro
.arches
+ ["src"]
217 def set_mirrored(self
, mirrored
):
218 self
._set
_attribute
("mirrored", mirrored
)
220 mirrored
= property(lambda s
: s
.data
.mirrored
, set_mirrored
)
222 def set_enabled_for_builds(self
, state
):
223 self
._set
_attribute
("enabled_for_builds", state
)
225 enabled_for_builds
= property(lambda s
: s
.data
.enabled_for_builds
, set_enabled_for_builds
)
228 def score_needed(self
):
229 return self
.data
.score_needed
233 return self
.data
.time_min
237 return self
.data
.time_max
239 def _log_build(self
, action
, build
, from_repo
=None, to_repo
=None, user
=None):
246 from_repo_id
= from_repo
.id
250 to_repo_id
= to_repo
.id
252 self
.db
.execute("INSERT INTO repositories_history(action, build_id, from_repo_id, to_repo_id, user_id, time) \
253 VALUES(%s, %s, %s, %s, %s, NOW())", action
, build
.id, from_repo_id
, to_repo_id
, user_id
)
255 def add_build(self
, build
, user
=None, log
=True):
256 self
.db
.execute("INSERT INTO repositories_builds(repo_id, build_id, time_added)"
257 " VALUES(%s, %s, NOW())", self
.id, build
.id)
260 build
._update
_bugs
_helper
(self
)
263 self
._log
_build
("added", build
, to_repo
=self
, user
=user
)
265 def rem_build(self
, build
, user
=None, log
=True):
266 self
.db
.execute("DELETE FROM repositories_builds \
267 WHERE repo_id = %s AND build_id = %s", self
.id, build
.id)
270 self
._log
_build
("removed", build
, from_repo
=self
, user
=user
)
272 def move_build(self
, build
, to_repo
, user
=None, log
=True):
273 self
.db
.execute("UPDATE repositories_builds SET repo_id = %s, time_added = NOW() \
274 WHERE repo_id = %s AND build_id = %s", to_repo
.id, self
.id, build
.id)
277 build
._update
_bugs
_helper
(to_repo
)
280 self
._log
_build
("moved", build
, from_repo
=self
, to_repo
=to_repo
,
283 def get_builds(self
, limit
=None, offset
=None):
284 query
= "SELECT build_id AS id FROM repositories_builds \
285 WHERE repo_id = %s ORDER BY time_added DESC"
290 query
+= " LIMIT %s,%s"
291 args
+= [offset
, limit
,]
297 for build
in self
.db
.query(query
, *args
):
298 build
= self
.pakfire
.builds
.get_by_id(build
.id)
301 _builds
.append(build
)
305 def _get_packages(self
, arch
):
306 if arch
.name
== "src":
307 pkgs
= self
.db
.query("SELECT packages.id AS id, packages.path AS path FROM packages \
308 JOIN builds ON builds.pkg_id = packages.id \
309 JOIN repositories_builds ON builds.id = repositories_builds.build_id \
310 WHERE packages.arch = %s AND repositories_builds.repo_id = %s",
314 pkgs
= self
.db
.query("SELECT packages.id AS id, packages.path AS path FROM packages \
315 JOIN jobs_packages ON jobs_packages.pkg_id = packages.id \
316 JOIN jobs ON jobs_packages.job_id = jobs.id \
317 JOIN builds ON builds.id = jobs.build_id \
318 JOIN repositories_builds ON builds.id = repositories_builds.build_id \
319 WHERE (jobs.arch = %s OR jobs.arch = %s) AND \
320 repositories_builds.repo_id = %s",
321 arch
.name
, "noarch", self
.id)
325 def get_packages(self
, arch
):
326 pkgs
= [self
.pakfire
.packages
.get_by_id(p
.id) for p
in self
._get
_packages
(arch
)]
331 def get_paths(self
, arch
):
332 paths
= [p
.path
for p
in self
._get
_packages
(arch
)]
339 return self
.get_packages()
342 def unpushed_builds(self
):
343 return self
.backend
.builds
._get
_builds
("SELECT builds.* FROM repositories \
344 LEFT JOIN repositories_builds ON repositories.id = repositories_builds.repo_id \
345 LEFT JOIN builds ON repositories_builds.build_id = builds.id \
346 WHERE repositories.id = %s \
347 AND repositories_builds.time_added >= repositories.last_update", self
.id)
349 def get_obsolete_builds(self
):
350 return self
.pakfire
.builds
.get_obsolete(self
)
353 def needs_update(self
):
354 if self
.unpushed_builds
:
360 self
.db
.execute("UPDATE repositories SET last_update = NOW() \
361 WHERE id = %s", self
.id)
364 log
.info("Going to update repository %s..." % self
.name
)
366 # Update the timestamp when we started at last.
369 for arch
in self
.arches
:
372 # Get all package paths that are to be included in this repository.
373 paths
= self
.get_paths(arch
)
375 repo_path
= os
.path
.join(
377 self
.distro
.identifier
,
382 if not os
.path
.exists(repo_path
):
383 os
.makedirs(repo_path
)
388 for filename
in os
.listdir(repo_path
):
389 path
= os
.path
.join(repo_path
, filename
)
391 if not os
.path
.isfile(path
):
394 remove_files
.append(path
)
397 filename
= os
.path
.basename(path
)
399 source_file
= os
.path
.join(PACKAGES_DIR
, path
)
400 target_file
= os
.path
.join(repo_path
, filename
)
402 # Do not add duplicate files twice.
403 if source_file
in source_files
:
406 source_files
.append(source_file
)
409 remove_files
.remove(target_file
)
416 # If nothing in the repository data has changed, there
419 log
.info("The repository has updates...")
421 log
.info("Nothing to update.")
424 # Find the key to sign the package.
427 key_id
= self
.key
.fingerprint
429 # Create package index.
430 p
= pakfire
.PakfireServer(arch
=arch
)
432 p
.repo_create(repo_path
, source_files
,
433 name
="%s - %s.%s" % (self
.distro
.name
, self
.name
, arch
),
436 # Remove files afterwards.
437 for file in remove_files
:
438 file = os
.path
.join(repo_path
, file)
443 log
.warning("Could not remove %s." % file)
445 def get_history(self
, **kwargs
):
450 return self
.pakfire
.repos
.get_history(**kwargs
)
452 def get_build_times(self
):
454 for arch
in self
.arches
:
455 time
= self
.db
.get("SELECT SUM(jobs.time_finished - jobs.time_started) AS time FROM jobs \
456 JOIN builds ON builds.id = jobs.build_id \
457 JOIN repositories_builds ON builds.id = repositories_builds.build_id \
458 WHERE (jobs.arch = %s OR jobs.arch = %s) AND \
459 jobs.type = 'build' AND \
460 repositories_builds.repo_id = %s", arch
, "noarch", self
.id)
462 times
.append((arch
, time
.time
.total_seconds()))
467 class RepositoryAux(base
.DataObject
):
468 table
= "repositories_aux"
472 return self
.data
.name
475 def description(self
):
476 return self
.data
.description
or ""
483 def identifier(self
):
484 return self
.name
.lower()
488 return self
.pakfire
.distros
.get_by_id(self
.data
.distro_id
)
492 "[repo:%s]" % self
.identifier
,
493 "description = %s - %s" % (self
.distro
.name
, self
.name
),
495 "baseurl = %s" % self
.url
,
499 return "\n".join(lines
)