diff options
Diffstat (limited to 'roverlay/remote/repolist.py')
-rw-r--r-- | roverlay/remote/repolist.py | 78 |
1 files changed, 59 insertions, 19 deletions
diff --git a/roverlay/remote/repolist.py b/roverlay/remote/repolist.py index 4617057..ae740dd 100644 --- a/roverlay/remote/repolist.py +++ b/roverlay/remote/repolist.py @@ -1,13 +1,19 @@ +import logging from roverlay import config - from roverlay.remote.repoloader import read_repofile +LOGGER = logging.getLogger ( 'RepoList' ) + class RepoList ( object ): def __init__ ( self ): self.repos = list() + self.sync_enabled = True + + # if True: use all repos when looking for packages, even those that + # could not be synced self.use_broken_repos = False def sort ( self ): @@ -25,28 +31,62 @@ class RepoList ( object ): self.load_file ( f ) # --- end of load (...) --- - def sync_all ( self, package_queue=None ): - q = None - if package_queue is None: - q = list() - add = q.append - else: - # TODO: _nowait? raises Exception when queue is full which is - # good in non-threaded execution - # -> timeout,.. - add = q.put + def _queue_packages_from_repo ( self, repo, add_method ): + if not repo.ready(): + if self.use_broken_repos: + # warn and continue + pass + else: + # repo cannot be used + LOGGER.warning ( "!!" ) + return False + + for p in repo.scan_distdir(): + LOGGER.debug ( "adding package %s from repo %s" % ( p, repo ) ) + add_method ( p ) + # --- end of _queue_packages_from_repo (...) --- + + def add_packages ( self, add_method ): + for repo in self.repos: + self._queue_packages_from_repo ( repo, add_method ) + # --- end of add_packages (...) --- + + def _sync_all_repos_and_run ( + self, + when_repo_success=None, when_repo_fail=None, when_repo_done=None, + when_all_done=None + ): + try_call = lambda f, *x, **z : None if f is None else f ( *x, **z ) + + LOGGER.debug ( "Syncing repos ..." ) + for repo in self.repos: + if repo.sync ( sync_enabled=self.sync_enabled ): + # repo successfully synced + try_call ( when_repo_success, repo ) + else: + # else log fail <> + try_call ( when_repo_fail, repo ) + try_call ( when_repo_done, repo ) - # !! TODO resume here. + try_call ( when_all_done ) + # --- end of _sync_all_repos_and_run (...) --- + def sync ( self ): + LOGGER.debug ( "Syncing repos ..." ) for repo in self.repos: - if repo.sync() if self.sync_enabled else repo.nosync(): - # scan repo and create package infos - for p in repo.scan_distdir(): add ( p ) - elif self.use_broken_repos: - # warn and scan repo - ## .. - for p in repo.scan_distdir(): add ( p ) + repo.sync ( sync_enabled=self.sync_enabled ) + # --- end of sync_all (...) --- + + def sync_and_add ( self, add_method ): + """Syncs all repos and adds packages immediately to the package queue.""" + # TODO: _nowait? raises Exception when queue is full which is + # good in non-threaded execution + # -> timeout,.. + + qput = lambda r: self._queue_packages_from_repo ( r, add_method ) + + self._sync_all_repos_and_run ( when_repo_done=qput ) # --- end of sync_all (...) --- |