diff options
author | Lars Wirzenius <liw@liw.fi> | 2012-05-23 12:15:56 +0200 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2012-05-23 12:15:56 +0200 |
commit | a750aa29c29ba60b3d848c56482059c556374fa6 (patch) | |
tree | 3515c26502591d00ef4a2d5a59575c80aad32ad5 /summainlib.py | |
parent | dcd33d3089bec1de05a96839d49e3bb586b918ad (diff) | |
download | summain-a750aa29c29ba60b3d848c56482059c556374fa6.tar.gz |
Add xattrs support
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 + |