aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'roverlay/remote/repolist.py')
-rw-r--r--roverlay/remote/repolist.py78
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 (...) ---