diff options
Diffstat (limited to 'src/fringlib/fringwalker.py')
-rw-r--r-- | src/fringlib/fringwalker.py | 142 |
1 files changed, 53 insertions, 89 deletions
diff --git a/src/fringlib/fringwalker.py b/src/fringlib/fringwalker.py index bb6195b..5137306 100644 --- a/src/fringlib/fringwalker.py +++ b/src/fringlib/fringwalker.py @@ -1,40 +1,18 @@ -import os, os.path, stat, sys, time +import os, os.path, stat, sys import gobject, gtk from threading import Thread +import time +import fringtools -class sum_list: - def __init__(self, l, name = None): - self.the_sum = 0 - self.data = list(l) - self.name = name +def print_tree( t, tab=0 ): + """ An utility function to print out the tree returned by FringWalker::_parse """ - for fn, i in self.data: - - if isinstance(i, sum_list): - self.the_sum += i.the_sum - else: - self.the_sum += i - - def __str__(self): - return self.name+": "+str(self.data) - - def sort(self): - - def cmp_fn(a, b): - a_dir = isinstance(a[1], sum_list) - b_dir = isinstance(b[1], sum_list) - - if a_dir and not b_dir: - return 1 - elif b_dir and not a_dir: - return -1 - elif a_dir: - return cmp(a[1].the_sum, b[1].the_sum) - else: - return cmp(a[1], b[1]) - - self.data.sort(cmp_fn) + fn, data, size = t + print " "*tab,"%s (%i)"%(fn,size) + if not data: return + for e in data: + print_tree(e,tab+1) class FringWalker( gobject.GObject ): @@ -50,11 +28,13 @@ class FringWalker( gobject.GObject ): self.stopsignal = False self.showhidden = False + def walk(self,path): self.thread = Thread(None,self._parse,None,(path,)) self.stopsignal = False print "start thread (%s)"%path self.thread.start() + def stop(self): if self.thread is None: @@ -69,79 +49,63 @@ class FringWalker( gobject.GObject ): #self.thread.join() print "ok" + def _parse(self,path): """ Parse the root directory """ - def progress_fn(c, l, r): - # emit signals - gtk.gdk.threads_enter() - self.emit("progress", c, l) - self.emit("list-changed", r) - gtk.gdk.threads_leave() - - r = self._build_tree(path, progress_fn) + l = [] + i = 0 + subdirectories = {} - gtk.gdk.threads_enter() - self.emit("finished", r) - gtk.gdk.threads_leave() + total = 0 - print "finished walking", path - - def _build_tree(self, path, progress_fn = None): - """ Parse directories recursively """ - - ret = [] - tmp_dirs = [] - try: - # walk files in directory for fn in os.listdir(path): - if self.stopsignal: - return sum_list([]) + if not self.showhidden and fn[0] == '.': continue - if not self.showhidden and fn[0] == '.': - continue + try: p = os.path.join(path, fn) + except: continue - try: - p = os.path.join(path, fn) - s = os.lstat(p) - except: - continue + s = os.lstat(p) if stat.S_ISDIR(s.st_mode): - tmp_dirs.append(fn); + subdirectories[i] = (fn,p); + l.append((fn, None, s.st_size)) elif stat.S_ISREG(s.st_mode): - ret.append((fn, s.st_size)) - except OSError: + l.append((fn, None, s.st_size)) + + total += s.st_size + i += 1 + + except: pass - try: - c = 0 + gtk.gdk.threads_enter() + self.emit("list-changed",(os.path.split(path)[-1], l, total)) + gtk.gdk.threads_leave() + + c = 0 + for n in subdirectories: + c += 1 + + fn,p = subdirectories[n] + sub = fringtools.build_tree(p,True) # call faster c++ extension + total += sub[2] - for fn in tmp_dirs: - c += 1 - - if self.stopsignal: - return sum_list([]) - - try: - p = os.path.join(path, fn) - except: - continue - - ret.append((fn, self._build_tree(p))) - - if not (progress_fn is None): - r = sum_list(ret, os.path.split(path)[-1]) - r.sort() - progress_fn(c, len(tmp_dirs), r) - - except OSError: - pass + l[n] = (fn,sub[1],sub[2]); + + if self.stopsignal: return - r = sum_list(ret, os.path.split(path)[-1]) - r.sort() + # emit signals + gtk.gdk.threads_enter() + self.emit("list-changed",(os.path.split(path)[-1], l, total)) + print "%s parsed"%fn + gtk.gdk.threads_leave() + - return r + gtk.gdk.threads_enter() + self.emit("finished",(os.path.split(path)[-1], l, total)) + gtk.gdk.threads_leave() + print "finished walking",path |