From: Michael Tremer Date: Thu, 31 Mar 2011 18:54:53 +0000 (+0200) Subject: Add --offline flag on CLI. X-Git-Tag: 0.9.3~58 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=25b2c2dbcd59b96035b3439cf0d2b4956dfd2cdb;p=pakfire.git Add --offline flag on CLI. --- diff --git a/pakfire/__init__.py b/pakfire/__init__.py index a049c457f..08d2d7bee 100644 --- a/pakfire/__init__.py +++ b/pakfire/__init__.py @@ -24,7 +24,7 @@ __version__ = PAKFIRE_VERSION class Pakfire(object): def __init__(self, path="/", builder=False, configs=[], - disable_repos=None): + disable_repos=None, offline=False): # Check if we are operating as the root user. self.check_root_user() @@ -73,7 +73,7 @@ class Pakfire(object): # Update all indexes of the repositories (not force) so that we will # always work with valid data. - self.repos.update() + self.repos.update(offline=offline) def check_root_user(self): if not os.getuid() == 0 or not os.getgid() == 0: diff --git a/pakfire/cli.py b/pakfire/cli.py index 2241fcc3d..e60743088 100644 --- a/pakfire/cli.py +++ b/pakfire/cli.py @@ -63,6 +63,7 @@ class Cli(object): self.args.instroot, configs = [self.args.config], disable_repos = self.args.disable_repo, + offline = self.args.offline, ) self.action2func = { @@ -87,6 +88,9 @@ class Cli(object): self.parser.add_argument("--disable-repo", nargs="*", metavar="REPO", help=_("Disable a repository temporarily.")) + self.parser.add_argument("--offline", action="store_true", + help=_("Run in offline mode.")) + def parse_command_install(self): # Implement the "install" command. sub_install = self.sub_commands.add_parser("install", @@ -267,6 +271,7 @@ class CliBuilder(Cli): builder = True, configs = [self.args.config], disable_repos = self.args.disable_repo, + offline = self.args.offline, ) self.action2func = { @@ -409,6 +414,7 @@ class CliServer(Cli): builder = True, configs = [self.args.config], disable_repos = self.args.disable_repo, + offline = self.args.offline, ) self.action2func = { diff --git a/pakfire/repository/__init__.py b/pakfire/repository/__init__.py index ce943e440..7bd25962c 100644 --- a/pakfire/repository/__init__.py +++ b/pakfire/repository/__init__.py @@ -86,12 +86,12 @@ class Repositories(object): repo.enabled = False continue - def update(self, force=False): + def update(self, force=False, offline=False): logging.debug("Updating all repository indexes (force=%s)" % force) # XXX update all indexes if necessary or forced for repo in self.enabled: - repo.update(force=force) + repo.update(force=force, offline=offline) #def get_all(self): # for repo in self.enabled: diff --git a/pakfire/repository/base.py b/pakfire/repository/base.py index e6d4e9afe..bf8ce54ec 100644 --- a/pakfire/repository/base.py +++ b/pakfire/repository/base.py @@ -39,13 +39,13 @@ class RepositoryFactory(object): """ return False - def update(self, force=False): + def update(self, force=False, offline=False): """ A function that is called to update the local data of the repository. """ if hasattr(self, "index"): - self.index.update(force) + self.index.update(force, offline=offline) def get_all(self): """ diff --git a/pakfire/repository/index.py b/pakfire/repository/index.py index f18c97d95..776cf29b4 100644 --- a/pakfire/repository/index.py +++ b/pakfire/repository/index.py @@ -64,7 +64,7 @@ class Index(object): for pkg in self._packages: yield pkg - def update(self, force=False): + def update(self, force=False, offline=False): pass def add_package(self, pkg): @@ -82,7 +82,7 @@ class DirectoryIndex(Index): # Always update this because it will otherwise contain no data self.update(force=True) - def update(self, force=False): + def update(self, force=False, offline=False): logging.debug("Updating repository index '%s' (force=%s)" % (self.path, force)) # Do nothing if the update is not forced but populate the database @@ -241,16 +241,16 @@ class LocalIndex(DatabaseIndexFactory): class RemoteIndex(DatabaseIndexFactory): def open_database(self): - self.update(force=False) + self.update(force=False, offline=True) - def _update_metadata(self, force): + def _update_metadata(self, force, offline): # Shortcut to repository cache. cache = self.repo.cache filename = os.path.join(METADATA_DOWNLOAD_PATH, METADATA_DOWNLOAD_FILE) # Marker if we need to do the download. - download = True + download = not offline # Marker for the current metadata. old_metadata = None @@ -292,7 +292,7 @@ class RemoteIndex(DatabaseIndexFactory): self.metadata = metadata.Metadata(self.pakfire, self, cache.abspath(filename)) - def _update_database(self, force): + def _update_database(self, force, offline): # Shortcut to repository cache. cache = self.repo.cache @@ -300,6 +300,9 @@ class RemoteIndex(DatabaseIndexFactory): filename = os.path.join(METADATA_DOWNLOAD_PATH, self.metadata.database) if not cache.exists(filename): + if offline: + raise Exception, "No database. Cannot download one in offline mode..." + # Initialize a grabber for download. grabber = downloader.DatabaseDownloader( text = _("%s: package database") % self.repo.name, @@ -333,7 +336,7 @@ class RemoteIndex(DatabaseIndexFactory): self.db = database.RemotePackageDatabase(self.pakfire, cache.abspath(filename)) - def update(self, force=False): + def update(self, force=False, offline=False): """ Download the repository metadata and the package database. """ @@ -343,10 +346,10 @@ class RemoteIndex(DatabaseIndexFactory): return # At first, update the metadata. - self._update_metadata(force) + self._update_metadata(force, offline) # Then, we download the database eventually. - self._update_database(force) + self._update_database(force, offline) # XXX this code needs lots of work: # XXX * check the metadata content diff --git a/pakfire/repository/remote.py b/pakfire/repository/remote.py index c2ffcff1a..1b57d1027 100644 --- a/pakfire/repository/remote.py +++ b/pakfire/repository/remote.py @@ -76,9 +76,9 @@ class RemoteRepository(RepositoryFactory): return priority - def update(self, force=False): + def update(self, force=False, offline=False): if self.index: - self.index.update(force=force) + self.index.update(force=force, offline=offline) def _replace_from_cache(self, pkg): for _pkg in self.cache.packages: