]> arthur.barton.de Git - bup.git/commitdiff
save-cmd.py: hashsplit .bupm metadata files.
authorRob Browning <rlb@defaultvalue.org>
Fri, 4 Apr 2014 19:29:24 +0000 (14:29 -0500)
committerRob Browning <rlb@defaultvalue.org>
Thu, 10 Apr 2014 21:08:36 +0000 (16:08 -0500)
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 <rlb@defaultvalue.org>
cmd/save-cmd.py
lib/bup/vfs.py

index 0c0c3ef7039a8640b97678c561e8e19337c922c1..042a607c0fe87590f6d4b7056546a628b0f9571d 100755 (executable)
@@ -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,
index 728a7a01f469219957ca06419e7127351508557e..e1de1fe6bb19d12caab951de3884b668cc164cbd 100644 (file)
@@ -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)