From ee777400cf624b4f7a24b15614c2b6c745560dcb Mon Sep 17 00:00:00 2001 From: Rob Browning Date: Fri, 4 Apr 2014 14:29:24 -0500 Subject: [PATCH] save-cmd.py: hashsplit .bupm metadata files. Previously the metdata for each directory's content was being written as a single blob, with no deduplication -- probably not what we want. Fix it. Signed-off-by: Rob Browning --- cmd/save-cmd.py | 7 ++++++- lib/bup/vfs.py | 5 ++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/cmd/save-cmd.py b/cmd/save-cmd.py index 0c0c3ef..042a607 100755 --- a/cmd/save-cmd.py +++ b/cmd/save-cmd.py @@ -1,5 +1,6 @@ #!/usr/bin/env python import sys, stat, time, math +from cStringIO import StringIO from bup import hashsplit, git, options, index, client, metadata, hlinkdb from bup.helpers import * from bup.hashsplit import GIT_MODE_TREE, GIT_MODE_FILE, GIT_MODE_SYMLINK @@ -132,7 +133,11 @@ def _pop(force_tree, dir_metadata=None): metalist = [('', dir_metadata)] + metalist[1:] sorted_metalist = sorted(metalist, key = lambda x : x[0]) metadata = ''.join([m[1].encode() for m in sorted_metalist]) - shalist.append((0100644, '.bupm', w.new_blob(metadata))) + metadata_f = StringIO(metadata) + mode, id = hashsplit.split_to_blob_or_tree(w.new_blob, w.new_tree, + [metadata_f], + keep_boundaries=False) + shalist.append((mode, '.bupm', id)) tree = force_tree or w.new_tree(shalist) if shalists: shalists[-1].append((GIT_MODE_TREE, diff --git a/lib/bup/vfs.py b/lib/bup/vfs.py index 728a7a0..e1de1fe 100644 --- a/lib/bup/vfs.py +++ b/lib/bup/vfs.py @@ -6,6 +6,7 @@ and abstracts internal name mangling and storage from the exposition layer. import os, re, stat, time from bup import git, metadata from helpers import * +from bup.git import BUP_NORMAL, BUP_CHUNKED from bup.hashsplit import GIT_MODE_TREE, GIT_MODE_FILE EMPTY_SHA='\0'*20 @@ -425,7 +426,9 @@ class Dir(Node): assert(type == 'tree') for (mode,mangled_name,sha) in git.tree_decode(''.join(it)): if mangled_name == '.bupm': - self._bupm = File(self, mangled_name, mode, sha, git.BUP_NORMAL) + bupmode = stat.S_ISDIR(mode) and BUP_CHUNKED or BUP_NORMAL + self._bupm = File(self, mangled_name, GIT_MODE_FILE, sha, + bupmode) continue name = mangled_name (name,bupmode) = git.demangle_name(mangled_name) -- 2.39.2