diff options
Diffstat (limited to 'summainlib.py')
-rw-r--r-- | summainlib.py | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/summainlib.py b/summainlib.py index 784efe5..93d3737 100644 --- a/summainlib.py +++ b/summainlib.py @@ -136,7 +136,8 @@ class FilesystemObject(object): def __init__(self, filename, nn, pn, exclude, stat_result=None, sha1=None, sha224=None, sha256=None, sha384=None, sha512=None, - md5=None, open_file=None, readlink=None): + md5=None, open_file=None, readlink=None, + xattrs=None): self.filename = filename self.relative = None self._exclude = set(self._normalize_key(k) for k in exclude) @@ -149,6 +150,8 @@ class FilesystemObject(object): self._sha384 = sha384 or hashlib.sha384() self._sha512 = sha512 or hashlib.sha512() self._stat_result = stat_result or _summain.lstat(filename) + self._xattrs = (xattrs if xattrs is not None + else self.get_xattrs(filename)) self.open_file = open_file or file self.readlink = readlink or os.readlink self.values = dict() @@ -214,6 +217,12 @@ class FilesystemObject(object): if stat.S_ISLNK(self._stat_result[RESULT_MODE]): return self.readlink(self.filename) + def _compute_xattrs(self): # pragma: no cover + if len(self._xattrs) == 0: + return '' + parts = [' %s=%s' % (k, self._xattrs[k]) for k in self._xattrs] + return '\n' + '\n'.join(parts) + def format_time(self, secs, nsecs): s = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(secs)) s += '.%09d' % nsecs @@ -261,3 +270,15 @@ class FilesystemObject(object): '''Is this a directory?''' return stat.S_ISDIR(int(self['Mode'], 8)) + def get_xattrs(self, filename): # pragma: no cover + ret = _summain.llistxattr(filename) + if type(ret) is int: + raise OSError((ret, os.strerror(ret), filename)) + + names = [s for s in ret.split('\0') if s] + + xattrs = {} + for name in names: + xattrs[name] = _summain.lgetxattr(filename, name) + return xattrs + |