aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'g_sorcery/package_db.py')
-rw-r--r--g_sorcery/package_db.py60
1 files changed, 31 insertions, 29 deletions
diff --git a/g_sorcery/package_db.py b/g_sorcery/package_db.py
index a88474d..8daa665 100644
--- a/g_sorcery/package_db.py
+++ b/g_sorcery/package_db.py
@@ -11,18 +11,18 @@
:license: GPL-2, see LICENSE for more details.
"""
-import glob
import os
import portage
-from .compatibility import basestring, py2k, TemporaryDirectory
+from .compatibility import basestring, py2k
from .db_layout import DBLayout, JSON_FILE_SUFFIX, SUPPORTED_DB_LAYOUTS, SUPPORTED_FILE_FORMATS
from .exceptions import DBError, DBLayoutError, DBStructureError, InvalidKeyError, SyncError
-from .fileutils import FileJSON, load_remote_file, copy_all, wget
+from .fileutils import FileJSON, load_remote_file, copy_all
from .g_collections import Package
from .logger import Logger
+from .syncer import SUPPORTED_SYNCERS
SUPPORTED_DB_STRUCTURES=[0, 1]
@@ -137,6 +137,7 @@ class PackageDB(object):
def __init__(self, directory,
+ persistent_datadir = None,
preferred_layout_version=1,
preferred_db_version=1,
preferred_category_format=JSON_FILE_SUFFIX):
@@ -157,6 +158,11 @@ class PackageDB(object):
self.logger = Logger()
self.directory = os.path.abspath(directory)
+
+ self.persistent_datadir = persistent_datadir
+ if self.persistent_datadir is not None:
+ self.persistent_datadir = os.path.abspath(self.persistent_datadir)
+
self.preferred_layout_version = preferred_layout_version
self.preferred_db_version = preferred_db_version
self.preferred_category_format = preferred_category_format
@@ -176,24 +182,30 @@ class PackageDB(object):
self.categories = {}
- def sync(self, db_uri):
+ def sync(self, db_uri, repository_config = None, sync_method="tgz"):
"""
Synchronize local database with remote database.
Args:
db_uri: URI for synchronization with remote database.
- """
- real_db_uri = self.get_real_db_uri(db_uri)
- download_dir = TemporaryDirectory()
- if wget(real_db_uri, download_dir.name):
- raise SyncError('sync failed: ' + real_db_uri)
-
- temp_dir = TemporaryDirectory()
- for f_name in glob.iglob(os.path.join(download_dir.name, '*.tar.gz')):
- self.logger.info("unpacking " + f_name)
- os.system("tar -xvzf " + f_name + " -C " + temp_dir.name)
+ repository_config: repository config.
+ sync_method: sync method (tgz or git).
+ """
+ if repository_config is None:
+ repository_config = {}
+
+ try:
+ syncer_cls = SUPPORTED_SYNCERS[sync_method]
+ except KeyError:
+ raise SyncError('unsupported sync method: ' + sync_method)
+ if self.persistent_datadir is not None:
+ remotedb_dir = os.path.join(self.persistent_datadir, 'remote')
+ else:
+ remotedb_dir = None
+ syncer = syncer_cls(remotedb_dir)
+ synced_data = syncer.sync(db_uri, repository_config)
- tempdb_dir = os.path.join(temp_dir.name, os.listdir(temp_dir.name)[0])
+ tempdb_dir = synced_data.get_path()
tempdb = PackageDB(tempdb_dir)
tempdb.db_layout.check_manifest()
@@ -204,19 +216,7 @@ class PackageDB(object):
self.db_layout.check_manifest()
- del download_dir
- del temp_dir
-
-
- def get_real_db_uri(self, db_uri):
- """
- Convert self.db_uri to URI where remote database can be
- fetched from.
-
- Returns:
- URI of remote database file.
- """
- return db_uri
+ del synced_data
def clean(self):
@@ -538,10 +538,12 @@ class DBGenerator(object):
Package database.
"""
db_path = os.path.join(directory, repository, "db")
+ persistent_datadir = os.path.join(directory, repository, "persistent")
pkg_db = self.package_db_class(db_path,
preferred_layout_version=self.preferred_layout_version,
preferred_db_version=self.preferred_db_version,
- preferred_category_format=self.preferred_category_format)
+ preferred_category_format=self.preferred_category_format,
+ persistent_datadir=persistent_datadir)
config_f = FileJSON(os.path.join(directory, repository),
"config.json", [])