diff options
-rw-r--r-- | code/directory.py | 22 | ||||
-rw-r--r-- | code/fsobject.py | 6 | ||||
-rw-r--r-- | ranger | 5 | ||||
-rw-r--r-- | test/dirsize_benchmark.py | 26 | ||||
-rw-r--r-- | test/tc_directory.py | 29 |
5 files changed, 74 insertions, 14 deletions
diff --git a/code/directory.py b/code/directory.py index da7c0948..2554ca72 100644 --- a/code/directory.py +++ b/code/directory.py @@ -12,6 +12,7 @@ class Directory(fsobject.FSObject): self.files = None self.filter = None self.pointed_index = None + self.pointed_file = None def load_content(self): self.stop_if_frozen() @@ -22,8 +23,7 @@ class Directory(fsobject.FSObject): basenames = os.listdir(self.path) mapped = map(lambda name: os.path.join(self.path, name), basenames) self.filenames = list(mapped) - self.infostring = ' %d' % len(self.filenames) - debug.log('infostring set!') + self.infostring = ' %d' % len(self.filenames) # update the infostring self.files = [] for name in self.filenames: if os.path.isdir(name): @@ -35,7 +35,23 @@ class Directory(fsobject.FSObject): def load_content_once(self): self.stop_if_frozen() - if not self.content_loaded: self.load_content() + if not self.content_loaded: + self.load_content() + return True + return False + + def load_content_if_outdated(self): + self.stop_if_frozen() + if self.load_content_once(): return True + + import os + real_mtime = os.stat(self.path).st_mtime + cached_mtime = self.stat.st_mtime + + if real_mtime != cached_mtime: + self.load_content() + return True + return False def __len__(self): if not self.accessible: raise fsobject.NotLoadedYet() diff --git a/code/fsobject.py b/code/fsobject.py index 148976d2..6e93140f 100644 --- a/code/fsobject.py +++ b/code/fsobject.py @@ -36,7 +36,7 @@ class FSObject(object): if os.path.isdir(self.path): self.type = fstype.Directory - self.infostring = '--' + self.infostring = ' %d' % len(os.listdir(self.path)) elif os.path.isfile(self.path): self.type = fstype.File self.infostring = ' %d' % self.stat.st_size @@ -60,17 +60,15 @@ class FSObject(object): def load_if_outdated(self): self.stop_if_frozen() - import os - if self.load_once(): return True + import os real_mtime = os.stat(self.path).st_mtime cached_mtime = self.stat.st_mtime if real_mtime != cached_mtime: self.load() return True - return False def clone(self): diff --git a/ranger b/ranger index 4973e42f..b6050ca8 100644 --- a/ranger +++ b/ranger @@ -12,10 +12,11 @@ from code import debug, fm, ui, options, environment # TODO: load config def main(): - import locale + import locale, os + os.stat_float_times(True) locale.setlocale(locale.LC_ALL, 'en_US.utf8') - path = '..' + path = '/srv/music/compilations/' opt = options.get() env = environment.Environment() diff --git a/test/dirsize_benchmark.py b/test/dirsize_benchmark.py new file mode 100644 index 00000000..38f0bfd7 --- /dev/null +++ b/test/dirsize_benchmark.py @@ -0,0 +1,26 @@ +import os, time +class Dirsize(): + def a(path): + return len(os.listdir(path)) + + def b(path): + for _, dirs, files in os.walk(path): + return len(files) + len(dirs) + + def c(path): + first = next(os.walk(path)) + return len(first[1]) + len(first[2]) + +paths = { + '/usr/lib': None, + '/usr/bin': None, + '/home/hut': None +} + +for key in paths.keys(): + paths[key] = Dirsize.a(key) # assume Dirsize.a() returns a correct result + for algo in ['a', 'b', 'c']: + t = time.time() + for i in range(4): + assert Dirsize.__dict__[algo](key) == paths[key] + print("algorithm %s: %20s: %f" % (algo, key, time.time() - t)) diff --git a/test/tc_directory.py b/test/tc_directory.py index f97f9913..ebbd6b5e 100644 --- a/test/tc_directory.py +++ b/test/tc_directory.py @@ -1,6 +1,7 @@ import unittest -import sys, os +import sys, os, time sys.path.append('../code') +os.stat_float_times(True) import directory, fsobject, file, debug TESTDIR = os.path.realpath(os.path.join(os.path.dirname(sys.argv[0]), 'testdir')) @@ -78,15 +79,33 @@ class Test1(unittest.TestCase): self.assertRaises(fsobject.FrozenException, clone.load_content) def test_load_if_outdated(self): - if os.path.exists(TESTFILE): os.unlink(TESTFILE) + # modify the directory. If the time between the last modification + # was within the filesystems resolution of mtime, we should have a re-load. + + def modify_dir(): + open(TESTFILE, 'w').close() + os.unlink(TESTFILE) + + def mtime(): + return os.stat(TESTDIR).st_mtime + dir = directory.Directory(TESTDIR) dir.load() - open(TESTFILE, 'w').close() + # If the modification happens to be in the same second as the + # last modification, it will result in mtime having the same + # integer value. So we wait until the resolution is exceeded + # and mtime differs. + old_mtime = mtime() + for i in range(50): + modify_dir() + if old_mtime != mtime(): break + time.sleep(0.1) + else: + # fail after 5 seconds of trying + self.fail("Cannot perform test: mtime of TESTDIR is not being updated.") self.assertTrue(dir.load_if_outdated()) - os.unlink(TESTFILE) - unittest.main() |