summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--code/directory.py22
-rw-r--r--code/fsobject.py6
-rw-r--r--ranger5
-rw-r--r--test/dirsize_benchmark.py26
-rw-r--r--test/tc_directory.py29
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()