Commit be5b9ddf by willmcgugan

Added support for xattr to MemoryFile

parent 55dd394e
......@@ -117,6 +117,7 @@ class MemoryFile(object):
return self.mem_file.truncate(*args, **kwargs)
def write(self, data):
self.memory_fs._on_modify_memory_file(self.path)
return self.mem_file.write(data)
def writelines(self, *args, **kwargs):
......@@ -150,6 +151,9 @@ class DirEntry(object):
self.created_time = datetime.datetime.now()
self.modified_time = self.created_time
self.accessed_time = self.created_time
self.st_mode = 0700
self.xattrs = {}
def lock(self):
self.locks += 1
......@@ -215,6 +219,13 @@ class MemoryFS(FS):
return current_dir
@synchronize
def _dir_entry(self, path):
dir_entry = self._get_dir_entry(path)
if dir_entry is None:
raise ResourceNotFoundError(path)
return dir_entry
@synchronize
def desc(self, path):
if self.isdir(path):
return "Memory dir"
......@@ -333,7 +344,6 @@ class MemoryFS(FS):
if 'a' in mode:
if file_dir_entry.islocked():
raise ResourceLockedError(path)
file_dir_entry.modified_time = datetime.datetime.now()
file_dir_entry.accessed_time = datetime.datetime.now()
self._lock_dir_entry(path)
......@@ -351,7 +361,6 @@ class MemoryFS(FS):
if file_dir_entry.islocked():
raise ResourceLockedError(path)
file_dir_entry.accessed_time = datetime.datetime.now()
file_dir_entry.modified_time = datetime.datetime.now()
self._lock_dir_entry(path)
......@@ -425,11 +434,13 @@ class MemoryFS(FS):
raise DestinationExistsError(path)
src_dir_entry = self._get_dir_entry(src_dir)
src_xattrs = src_dir_entry.xattrs.copy()
dst_dir_entry = self._get_dir_entry(dst_dir)
if dst_dir_entry is None:
raise ParentDirectoryMissingError(dst)
dst_dir_entry.contents[dst_name] = src_dir_entry.contents[src_name]
dst_dir_entry.contents[dst_name].name = dst_name
dst_dir_entry.xattrs.update(src_xattrs)
del src_dir_entry.contents[src_name]
......@@ -464,6 +475,12 @@ class MemoryFS(FS):
dir_entry.data = value
@synchronize
def _on_modify_memory_file(self, path):
dir_entry = self._get_dir_entry(path)
dir_entry.modified_time = datetime.datetime.now()
@synchronize
def listdir(self, path="/", wildcard=None, full=False, absolute=False, dirs_only=False, files_only=False):
dir_entry = self._get_dir_entry(path)
if dir_entry is None:
......@@ -490,5 +507,70 @@ class MemoryFS(FS):
if dir_entry.isfile():
info['size'] = len(dir_entry.data or '')
info['st_mode'] = 0666
else:
info['st_mode'] = 0700
return info
@synchronize
def copydir(self, src, dst, overwrite=False, ignore_errors=False, chunk_size=16384):
src_dir_entry = self._get_dir_entry(src)
src_xattrs = src_dir_entry.xattrs.copy()
super(MemoryFS, self).copydir(src, dst, overwrite, ignore_errors=ignore_errors, chunk_size=chunk_size)
dst_dir_entry = self._get_dir_entry(dst)
if dst_dir_entry is not None:
dst_dir_entry.xattrs.update(src_xattrs)
@synchronize
def movedir(self, src, dst, overwrite=False, ignore_errors=False, chunk_size=16384):
src_dir_entry = self._get_dir_entry(src)
src_xattrs = src_dir_entry.xattrs.copy()
super(MemoryFS, self).movedir(src, dst, overwrite, ignore_errors=ignore_errors, chunk_size=chunk_size)
dst_dir_entry = self._get_dir_entry(dst)
if dst_dir_entry is not None:
dst_dir_entry.xattrs.update(src_xattrs)
@synchronize
def copy(self, src, dst, overwrite=False, chunk_size=16384):
src_dir_entry = self._get_dir_entry(src)
src_xattrs = src_dir_entry.xattrs.copy()
super(MemoryFS, self).copy(src, dst, overwrite, chunk_size)
dst_dir_entry = self._get_dir_entry(dst)
if dst_dir_entry is not None:
dst_dir_entry.xattrs.update(src_xattrs)
@synchronize
def move(self, src, dst, overwrite=False, chunk_size=16384):
src_dir_entry = self._get_dir_entry(src)
src_xattrs = src_dir_entry.xattrs.copy()
super(MemoryFS, self).move(src, dst, overwrite, chunk_size)
dst_dir_entry = self._get_dir_entry(dst)
if dst_dir_entry is not None:
dst_dir_entry.xattrs.update(src_xattrs)
@synchronize
def setxattr(self, path, key, value):
dir_entry = self._dir_entry(path)
key = unicode(key)
dir_entry.xattrs[key] = value
@synchronize
def getxattr(self, path, key, default=None):
key = unicode(key)
dir_entry = self._dir_entry(path)
return dir_entry.xattrs.get(key, default)
@synchronize
def delxattr(self, path, key):
dir_entry = self._dir_entry(path)
try:
del dir_entry.xattrs[key]
except KeyError:
pass
@synchronize
def listxattrs(self, path):
dir_entry = self._dir_entry(path)
return dir_entry.xattrs.keys()
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment