summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2015-08-19 15:36:58 +0200
committerLars Wirzenius <liw@liw.fi>2015-08-19 16:18:05 +0200
commitecc2d0b97adb395f0312a6862d74329e6fb111b6 (patch)
tree5d8f5cd8b8210712ab20989ae95386a4db501059
parent80005417e68b91454927928107f2490e68a2467e (diff)
downloadobnam-ecc2d0b97adb395f0312a6862d74329e6fb111b6.tar.gz
Add set_file_keys_from_metadata to interface
-rw-r--r--obnamlib/delegator.py6
-rw-r--r--obnamlib/fmt_ga/client.py34
-rw-r--r--obnamlib/plugins/backup_plugin.py27
-rw-r--r--obnamlib/repo_interface.py35
4 files changed, 77 insertions, 25 deletions
diff --git a/obnamlib/delegator.py b/obnamlib/delegator.py
index 68e932b8..e477d706 100644
--- a/obnamlib/delegator.py
+++ b/obnamlib/delegator.py
@@ -240,6 +240,12 @@ class RepositoryDelegator(obnamlib.RepositoryInterface):
return client.set_file_key(
generation_id.gen_number, filename, key, value)
+ def set_file_keys_from_metadata(self, generation_id, filename, metadata):
+ self._require_got_client_lock(generation_id.client_name)
+ client = self._lookup_client_by_generation(generation_id)
+ return client.set_file_keys_from_metadata(
+ generation_id.gen_number, filename, metadata)
+
def get_file_chunk_ids(self, generation_id, filename):
client = self._lookup_client_by_generation(generation_id)
return client.get_file_chunk_ids(generation_id.gen_number, filename)
diff --git a/obnamlib/fmt_ga/client.py b/obnamlib/fmt_ga/client.py
index 57b77e54..015b48d8 100644
--- a/obnamlib/fmt_ga/client.py
+++ b/obnamlib/fmt_ga/client.py
@@ -272,6 +272,40 @@ class GAClient(object):
genspec=gen_number,
filename=filename)
+ def set_file_keys_from_metadata(self, gen_number, filename, file_metadata):
+ self._load_data()
+
+ generation = self._lookup_generation_by_gen_number(gen_number)
+ metadata = generation.get_file_metadata()
+
+ mapping = [
+ (obnamlib.REPO_FILE_MODE, 'st_mode'),
+ (obnamlib.REPO_FILE_MTIME_SEC, 'st_mtime_sec'),
+ (obnamlib.REPO_FILE_MTIME_NSEC, 'st_mtime_nsec'),
+ (obnamlib.REPO_FILE_ATIME_SEC, 'st_atime_sec'),
+ (obnamlib.REPO_FILE_ATIME_NSEC, 'st_atime_nsec'),
+ (obnamlib.REPO_FILE_NLINK, 'st_nlink'),
+ (obnamlib.REPO_FILE_SIZE, 'st_size'),
+ (obnamlib.REPO_FILE_UID, 'st_uid'),
+ (obnamlib.REPO_FILE_USERNAME, 'username'),
+ (obnamlib.REPO_FILE_GID, 'st_gid'),
+ (obnamlib.REPO_FILE_GROUPNAME, 'groupname'),
+ (obnamlib.REPO_FILE_SYMLINK_TARGET, 'target'),
+ (obnamlib.REPO_FILE_XATTR_BLOB, 'xattr'),
+ (obnamlib.REPO_FILE_BLOCKS, 'st_blocks'),
+ (obnamlib.REPO_FILE_DEV, 'st_dev'),
+ (obnamlib.REPO_FILE_INO, 'st_ino'),
+ (obnamlib.REPO_FILE_MD5, 'md5'),
+ ]
+
+ for key, field in mapping:
+ value = getattr(file_metadata, field)
+ if not metadata.set_file_key(filename, key, value):
+ raise obnamlib.RepositoryFileDoesNotExistInGeneration(
+ client_name=self._client_name,
+ genspec=gen_number,
+ filename=filename)
+
def get_file_chunk_ids(self, gen_number, filename):
self._load_data()
self._require_file_exists(gen_number, filename)
diff --git a/obnamlib/plugins/backup_plugin.py b/obnamlib/plugins/backup_plugin.py
index 1598a830..15dcf21f 100644
--- a/obnamlib/plugins/backup_plugin.py
+++ b/obnamlib/plugins/backup_plugin.py
@@ -828,31 +828,8 @@ class BackupPlugin(obnamlib.ObnamPlugin):
def add_file_to_generation(self, filename, metadata):
self.repo.add_file(self.new_generation, filename)
-
- things = [
- ('st_mtime_sec', obnamlib.REPO_FILE_MTIME_SEC),
- ('st_mtime_nsec', obnamlib.REPO_FILE_MTIME_NSEC),
- ('st_atime_sec', obnamlib.REPO_FILE_ATIME_SEC),
- ('st_atime_nsec', obnamlib.REPO_FILE_ATIME_NSEC),
- ('st_mode', obnamlib.REPO_FILE_MODE),
- ('st_nlink', obnamlib.REPO_FILE_NLINK),
- ('st_size', obnamlib.REPO_FILE_SIZE),
- ('st_uid', obnamlib.REPO_FILE_UID),
- ('st_gid', obnamlib.REPO_FILE_GID),
- ('st_blocks', obnamlib.REPO_FILE_BLOCKS),
- ('st_dev', obnamlib.REPO_FILE_DEV),
- ('st_ino', obnamlib.REPO_FILE_INO),
- ('username', obnamlib.REPO_FILE_USERNAME),
- ('groupname', obnamlib.REPO_FILE_GROUPNAME),
- ('target', obnamlib.REPO_FILE_SYMLINK_TARGET),
- ('xattr', obnamlib.REPO_FILE_XATTR_BLOB),
- ('md5', obnamlib.REPO_FILE_MD5),
- ]
-
- for field, key in things:
- self.repo.set_file_key(
- self.new_generation, filename, key,
- getattr(metadata, field))
+ self.repo.set_file_keys_from_metadata(
+ self.new_generation, filename, metadata)
def backup_parents(self, root):
'''Back up parents of root, non-recursively.'''
diff --git a/obnamlib/repo_interface.py b/obnamlib/repo_interface.py
index 7c00a0fe..d0d1521a 100644
--- a/obnamlib/repo_interface.py
+++ b/obnamlib/repo_interface.py
@@ -690,7 +690,42 @@ class RepositoryInterface(object):
'''
raise NotImplementedError()
+ def set_file_keys_from_metadata(self, generation_id, filename, metadata):
+ '''Set all allowed file keys from obnamlib.Metadata.
+
+ This is the same as calling set_file_key for each allowed key,
+ but hopefully faster.
+
+ '''
+
+ mapping = [
+ (REPO_FILE_MODE, 'st_mode'),
+ (REPO_FILE_MTIME_SEC, 'st_mtime_sec'),
+ (REPO_FILE_MTIME_NSEC, 'st_mtime_nsec'),
+ (REPO_FILE_ATIME_SEC, 'st_atime_sec'),
+ (REPO_FILE_ATIME_NSEC, 'st_atime_nsec'),
+ (REPO_FILE_NLINK, 'st_nlink'),
+ (REPO_FILE_SIZE, 'st_size'),
+ (REPO_FILE_UID, 'st_uid'),
+ (REPO_FILE_USERNAME, 'username'),
+ (REPO_FILE_GID, 'st_gid'),
+ (REPO_FILE_GROUPNAME, 'groupname'),
+ (REPO_FILE_SYMLINK_TARGET, 'target'),
+ (REPO_FILE_XATTR_BLOB, 'xattr'),
+ (REPO_FILE_BLOCKS, 'st_blocks'),
+ (REPO_FILE_DEV, 'st_dev'),
+ (REPO_FILE_INO, 'st_ino'),
+ (REPO_FILE_MD5, 'md5'),
+ ]
+
+ allowed = set(self.get_allowed_file_keys())
+ for key, field in mapping:
+ if key in allowed:
+ self.set_file_key(
+ generation_id, filename, key, getattr(metadata, field))
+
def get_file_chunk_ids(self, generation_id, filename):
+
'''Get the list of chunk ids for a file.'''
raise NotImplementedError()