summaryrefslogtreecommitdiff
path: root/summainlib.py
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2011-12-29 13:27:40 +0000
committerLars Wirzenius <liw@liw.fi>2011-12-29 13:27:40 +0000
commit1f68a394826daabe18c5662ba60c583450cdb72d (patch)
treecd5b8f1308128cea39a2b9a22642fd6b29775b8d /summainlib.py
parentdb9fc04e3542ff3475f0caecbfe0409c0aa63f8c (diff)
downloadsummain-1f68a394826daabe18c5662ba60c583450cdb72d.tar.gz
use nanosecond resolution for timestamps
Diffstat (limited to 'summainlib.py')
-rw-r--r--summainlib.py57
1 files changed, 39 insertions, 18 deletions
diff --git a/summainlib.py b/summainlib.py
index 87d61ee..8eac369 100644
--- a/summainlib.py
+++ b/summainlib.py
@@ -24,6 +24,8 @@ import stat
import time
import urllib
+import _summain
+
__version__ = '0.10'
@@ -101,6 +103,25 @@ class SamePath(object): # pragma: no cover
return path
+RESULT_RET = 0
+RESULT_DEV = 1
+RESULT_INO = 2
+RESULT_MODE = 3
+RESULT_NLINK = 4
+RESULT_UID = 5
+RESULT_GID = 6
+RESULT_RDEV = 7
+RESULT_SIZE = 8
+RESULT_BLKSIZE = 9
+RESULT_BLOCKS = 10
+RESULT_ATIME_SEC = 11
+RESULT_ATIME_NSEC = 12
+RESULT_MTIME_SEC = 13
+RESULT_MTIME_NSEC = 14
+RESULT_CTIME_SEC = 15
+RESULT_CTIME_NSEC = 16
+
+
class FilesystemObject(object):
'''An object in the file system.
@@ -126,7 +147,7 @@ class FilesystemObject(object):
self._sha256 = sha256 or hashlib.sha256()
self._sha384 = sha384 or hashlib.sha384()
self._sha512 = sha512 or hashlib.sha512()
- self._stat_result = stat_result or os.lstat(filename)
+ self._stat_result = stat_result or _summain.lstat(filename)
self.open_file = open_file or file
self.readlink = readlink or os.readlink
self.values = dict()
@@ -135,35 +156,36 @@ class FilesystemObject(object):
return urllib.quote(self._pn.normalize(self._filename))
def _compute_mtime(self):
- return self.format_time(self._stat_result.st_mtime)
+ return self.format_time(self._stat_result[RESULT_MTIME_SEC],
+ self._stat_result[RESULT_MTIME_NSEC])
def _compute_mode(self):
- return '%o' % self._stat_result.st_mode
+ return '%o' % self._stat_result[RESULT_MODE]
def _compute_ino(self):
- return '%d' % self._nn.get_ino(self._stat_result.st_ino)
+ return '%d' % self._nn.get_ino(self._stat_result[RESULT_INO])
def _compute_dev(self):
- return '%d' % self._nn.get_dev(self._stat_result.st_dev)
+ return '%d' % self._nn.get_dev(self._stat_result[RESULT_DEV])
def _compute_nlink(self):
- return '%d' % self._stat_result.st_nlink
+ return '%d' % self._stat_result[RESULT_NLINK]
def _compute_size(self):
- if not stat.S_ISDIR(self._stat_result.st_mode):
- return '%d' % self._stat_result.st_size
+ if not stat.S_ISDIR(self._stat_result[RESULT_MODE]):
+ return '%d' % self._stat_result[RESULT_SIZE]
def _compute_uid(self):
- return '%d' % self._stat_result.st_uid
+ return '%d' % self._stat_result[RESULT_UID]
def _compute_username(self):
- return self.lookup_username(self._stat_result.st_uid)
+ return self.lookup_username(self._stat_result[RESULT_UID])
def _compute_gid(self):
- return '%d' % self._stat_result.st_gid
+ return '%d' % self._stat_result[RESULT_GID]
def _compute_group(self):
- return self.lookup_group(self._stat_result.st_gid)
+ return self.lookup_group(self._stat_result[RESULT_GID])
def _compute_md5(self):
return self.compute_checksum(self._filename, self._md5)
@@ -184,13 +206,12 @@ class FilesystemObject(object):
return self.compute_checksum(self._filename, self._sha512)
def _compute_target(self):
- if stat.S_ISLNK(self._stat_result.st_mode):
+ if stat.S_ISLNK(self._stat_result[RESULT_MODE]):
return self.readlink(self._filename)
- def format_time(self, timestamp):
- s = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(timestamp))
- fract, whole = math.modf(timestamp)
- s += ('%.6f' % fract)[1:] # Skip leading '.'
+ def format_time(self, secs, nsecs):
+ s = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(secs))
+ s += ('%.6f' % (nsecs * 1e-9))[1:] # skip leading 0
s += ' +0000'
return s
@@ -201,7 +222,7 @@ class FilesystemObject(object):
return grp.getgrgid(gid).gr_name
def compute_checksum(self, filename, checksummer):
- if stat.S_ISREG(self._stat_result.st_mode):
+ if stat.S_ISREG(self._stat_result[RESULT_MODE]):
with self.open_file(filename) as f:
while True:
data = f.read(64*1024) # 64 KiB seems reasonable.