Merge pull request #1558 from ThomasWaldmann/improve-fuse

Improve fuse
This commit is contained in:
enkore 2016-09-01 21:49:10 +02:00 committed by GitHub
commit d3cea7018c
1 changed files with 21 additions and 29 deletions

View File

@ -140,15 +140,12 @@ class FuseOperations(llfuse.Operations):
for item in unpacker: for item in unpacker:
item = Item(internal_dict=item) item = Item(internal_dict=item)
is_dir = stat.S_ISDIR(item.mode) is_dir = stat.S_ISDIR(item.mode)
if is_dir:
try: try:
# This can happen if an archive was created with a command line like # This can happen if an archive was created with a command line like
# $ borg create ... dir1/file dir1 # $ borg create ... dir1/file dir1
# In this case the code below will have created a default_dir inode for dir1 already. # In this case the code below will have created a default_dir inode for dir1 already.
path = safe_encode(item.path) inode = self._find_inode(item.path, prefix)
if not is_dir:
# not a directory -> no lookup needed
raise KeyError
inode = self._find_inode(path, prefix)
except KeyError: except KeyError:
pass pass
else: else:
@ -156,13 +153,10 @@ class FuseOperations(llfuse.Operations):
continue continue
segments = prefix + os.fsencode(os.path.normpath(item.path)).split(b'/') segments = prefix + os.fsencode(os.path.normpath(item.path)).split(b'/')
del item.path del item.path
num_segments = len(segments)
parent = 1 parent = 1
for i, segment in enumerate(segments, 1): for segment in segments[:-1]:
if i == num_segments:
self.process_leaf(segment, item, parent, prefix, is_dir)
else:
parent = self.process_inner(segment, parent) parent = self.process_inner(segment, parent)
self.process_leaf(segments[-1], item, parent, prefix, is_dir)
def process_leaf(self, name, item, parent, prefix, is_dir): def process_leaf(self, name, item, parent, prefix, is_dir):
def version_name(name, item): def version_name(name, item):
@ -176,9 +170,7 @@ class FuseOperations(llfuse.Operations):
if self.versions and not is_dir: if self.versions and not is_dir:
parent = self.process_inner(name, parent) parent = self.process_inner(name, parent)
name = version_name(name, item) name = version_name(name, item)
self.process_real_leaf(name, item, parent, prefix)
def process_real_leaf(self, name, item, parent, prefix):
if 'source' in item and stat.S_ISREG(item.mode): if 'source' in item and stat.S_ISREG(item.mode):
inode = self._find_inode(item.source, prefix) inode = self._find_inode(item.source, prefix)
item = self.cache.get(inode) item = self.cache.get(inode)
@ -190,15 +182,15 @@ class FuseOperations(llfuse.Operations):
if name: if name:
self.contents[parent][name] = inode self.contents[parent][name] = inode
def process_inner(self, name, parent): def process_inner(self, name, parent_inode):
if name in self.contents[parent]: dir = self.contents[parent_inode]
parent = self.contents[parent][name] if name in dir:
inode = dir[name]
else: else:
inode = self._create_dir(parent) inode = self._create_dir(parent_inode)
if name: if name:
self.contents[parent][name] = inode dir[name] = inode
parent = inode return inode
return parent
def allocate_inode(self): def allocate_inode(self):
self._inode_count += 1 self._inode_count += 1