KEY_ROLLOVER_TIME = datetime.timedelta(days=60)
class Repositories(base.Object):
- def _get_repository(self, query, *args):
- res = self.db.get(query, *args)
+ def _get_repositories(self, query, *args, **kwargs):
+ return self.db.fetch_many(Repository, query, *args, **kwargs)
- if res:
- return Repository(self.backend, res.id, data=res)
-
- def _get_repositories(self, query, *args):
- res = self.db.query(query, *args)
-
- for row in res:
- yield Repository(self.backend, row.id, data=row)
+ def _get_repository(self, query, *args, **kwargs):
+ return self.db.fetch_one(Repository, query, *args, **kwargs)
def __iter__(self):
repositories = self._get_repositories("SELECT * FROM repositories \
def distro(self):
return self.backend.distros.get_by_id(self.data.distro_id)
+ # Repo Types
+
+ def is_user(self):
+ """
+ Returns True if this is a user repository
+ """
+ if self.owner:
+ return True
+
+ return False
+
+ def is_distro(self):
+ """
+ Returns True if this is a distro repository
+ """
+ return not self.is_user()
+
# Priority
def get_priority(self):
# Sibling repositories
@property
- def siblings(self):
- # XXX TODO
- return []
+ def parents(self):
+ """
+ Returns all parent repositories
+ """
+ # User repositories have the distro repositories as parents
+ if self.is_user():
+ return self.distro.repos
+
+ # Distro repositories don't have any parents
+ elif self.is_distro():
+ return []
+
+ @property
+ def children(self):
+ """
+ Returns all repositories that depend on this
+ """
+ # User repositories don't have any children
+ if self.is_user():
+ return []
+
+ # Distro repositories are parents for all user repositories
+ elif self.is_distro():
+ return self.backend.repos._get_repositories("""
+ SELECT
+ *
+ FROM
+ repositories
+ WHERE
+ deleted_at IS NULL
+ AND
+ distro_id = %s
+ AND
+ owner_id IS NOT NULL
+ ORDER BY
+ created_at
+ """, self.distro,
+
+ # Cache
+ distro=self.distro,
+ )
# Add/Remove Builds
if self.has_changed.is_set():
await self.update()
+ log.info("Finished updating %s" % self)
+
# Relaunch any pending jobs
await self.relaunch_pending_jobs()
async def relaunch_pending_jobs(self):
+ """
+ Relaunches all pending jobs
+ """
# Perform this on this repository
- self._relaunch_pending_jobs()
+ await self._relaunch_pending_jobs()
- # Perform this for all sibling repositories
- # XXX
- #for repo in self.siblings:
- # repo._relaunch_pending_jobs()
+ # Perform this for all child repositories
+ for repo in self.children:
+ await repo._relaunch_pending_jobs()
- def _relaunch_pending_jobs(self):
+ async def _relaunch_pending_jobs(self):
"""
This function needs to be called whenever the repository has to be
- changed so that all pending jobs will have their dependencies recalculated.
+ changed so that all pending jobs will have their dependencies re-checked.
"""
- # Perform dependency checks on all pending jobs
- self.backend.run_task(self.backend.jobs.launch, self.pending_jobs)
+ log.debug("%s: Relaunching pending jobs" % self)
+
+ # Try to relaunch all pending jobs
+ await self.backend.jobs.launch(self.pending_jobs)
# Write repository