summaryrefslogtreecommitdiff
path: root/summainlib.py
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2012-05-23 12:15:56 +0200
committerLars Wirzenius <liw@liw.fi>2012-05-23 12:15:56 +0200
commita750aa29c29ba60b3d848c56482059c556374fa6 (patch)
tree3515c26502591d00ef4a2d5a59575c80aad32ad5 /summainlib.py
parentdcd33d3089bec1de05a96839d49e3bb586b918ad (diff)
downloadsummain-a750aa29c29ba60b3d848c56482059c556374fa6.tar.gz
Add xattrs support
Diffstat (limited to 'summainlib.py')
-rw-r--r--summainlib.py23
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
+