|
|
|
@ -44,26 +44,18 @@ class Noder:
|
|
|
|
|
if self.arc:
|
|
|
|
|
self.decomp = Decomp()
|
|
|
|
|
|
|
|
|
|
def set_hashing(self, val):
|
|
|
|
|
self.hash = val
|
|
|
|
|
|
|
|
|
|
def get_storage_names(self, top):
|
|
|
|
|
'''return a list of all storage names'''
|
|
|
|
|
return [x.name for x in list(top.children)]
|
|
|
|
|
|
|
|
|
|
def get_storage_node(self, top, name):
|
|
|
|
|
''' return the storage node '''
|
|
|
|
|
'''return the storage node if any'''
|
|
|
|
|
for n in top.children:
|
|
|
|
|
if n.type != self.TYPE_STORAGE:
|
|
|
|
|
continue
|
|
|
|
|
if n.name == name:
|
|
|
|
|
return n
|
|
|
|
|
|
|
|
|
|
def clean_storage_attr(self, attr):
|
|
|
|
|
if not attr:
|
|
|
|
|
return ''
|
|
|
|
|
return ', '.join(attr)
|
|
|
|
|
|
|
|
|
|
def get_node(self, top, path):
|
|
|
|
|
'''get the node by internal tree path'''
|
|
|
|
|
r = anytree.resolver.Resolver('name')
|
|
|
|
@ -73,6 +65,44 @@ class Noder:
|
|
|
|
|
Logger.err('No node at path \"{}\"'.format(path))
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
def get_meta_node(self, top):
|
|
|
|
|
'''return the meta node if any'''
|
|
|
|
|
try:
|
|
|
|
|
return next(filter(lambda x: x.type == self.TYPE_META,
|
|
|
|
|
top.children))
|
|
|
|
|
except StopIteration:
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
def rec_size(self, node):
|
|
|
|
|
'''recursively traverse tree and store dir size'''
|
|
|
|
|
if self.verbose:
|
|
|
|
|
Logger.info('getting folder size recursively')
|
|
|
|
|
if node.type == self.TYPE_FILE:
|
|
|
|
|
return node.size
|
|
|
|
|
size = 0
|
|
|
|
|
for i in node.children:
|
|
|
|
|
if node.type == self.TYPE_DIR:
|
|
|
|
|
size += self.rec_size(i)
|
|
|
|
|
if node.type == self.TYPE_STORAGE:
|
|
|
|
|
self.rec_size(i)
|
|
|
|
|
else:
|
|
|
|
|
continue
|
|
|
|
|
node.size = size
|
|
|
|
|
return size
|
|
|
|
|
|
|
|
|
|
###############################################################
|
|
|
|
|
# public helpers
|
|
|
|
|
###############################################################
|
|
|
|
|
def format_storage_attr(self, attr):
|
|
|
|
|
'''format the storage attr for saving'''
|
|
|
|
|
if not attr:
|
|
|
|
|
return ''
|
|
|
|
|
return ', '.join(attr)
|
|
|
|
|
|
|
|
|
|
def set_hashing(self, val):
|
|
|
|
|
'''hash files when indexing'''
|
|
|
|
|
self.hash = val
|
|
|
|
|
|
|
|
|
|
###############################################################
|
|
|
|
|
# node creationg
|
|
|
|
|
###############################################################
|
|
|
|
@ -135,6 +165,7 @@ class Noder:
|
|
|
|
|
total=total, parent=parent, attr=attr, ts=epoch)
|
|
|
|
|
|
|
|
|
|
def archive_node(self, name, path, parent, archive):
|
|
|
|
|
'''crete a new node for archive data'''
|
|
|
|
|
return anytree.AnyNode(name=name, type=self.TYPE_ARC, relpath=path,
|
|
|
|
|
parent=parent, size=0, md5=None,
|
|
|
|
|
archive=archive)
|
|
|
|
@ -198,6 +229,12 @@ class Noder:
|
|
|
|
|
for pre, fill, node in rend:
|
|
|
|
|
self._print_node(node, pre=pre, withdepth=True)
|
|
|
|
|
|
|
|
|
|
def to_dot(self, node, path='tree.dot'):
|
|
|
|
|
'''export to dot for graphing'''
|
|
|
|
|
anytree.exporter.DotExporter(node).to_dotfile(path)
|
|
|
|
|
Logger.info('dot file created under \"{}\"'.format(path))
|
|
|
|
|
return 'dot {} -T png -o /tmp/tree.png'.format(path)
|
|
|
|
|
|
|
|
|
|
###############################################################
|
|
|
|
|
# searching
|
|
|
|
|
###############################################################
|
|
|
|
@ -303,37 +340,6 @@ class Noder:
|
|
|
|
|
except AttributeError:
|
|
|
|
|
return 0
|
|
|
|
|
|
|
|
|
|
def to_dot(self, node, path='tree.dot'):
|
|
|
|
|
''' export to dot for graphing '''
|
|
|
|
|
anytree.exporter.DotExporter(node).to_dotfile(path)
|
|
|
|
|
Logger.info('dot file created under \"{}\"'.format(path))
|
|
|
|
|
return 'dot {} -T png -o /tmp/tree.png'.format(path)
|
|
|
|
|
|
|
|
|
|
def _get_storage(self, node):
|
|
|
|
|
'''recursively traverse up to find storage'''
|
|
|
|
|
return node.ancestors[1]
|
|
|
|
|
|
|
|
|
|
def get_meta_node(self, top):
|
|
|
|
|
''' return the meta node if any '''
|
|
|
|
|
try:
|
|
|
|
|
return next(filter(lambda x: x.type == self.TYPE_META,
|
|
|
|
|
top.children))
|
|
|
|
|
except StopIteration:
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
def rec_size(self, node):
|
|
|
|
|
''' recursively traverse tree and store dir size '''
|
|
|
|
|
if self.verbose:
|
|
|
|
|
Logger.info('getting folder size recursively')
|
|
|
|
|
if node.type == self.TYPE_FILE:
|
|
|
|
|
return node.size
|
|
|
|
|
size = 0
|
|
|
|
|
for i in node.children:
|
|
|
|
|
if node.type == self.TYPE_DIR:
|
|
|
|
|
size += self.rec_size(i)
|
|
|
|
|
if node.type == self.TYPE_STORAGE:
|
|
|
|
|
self.rec_size(i)
|
|
|
|
|
else:
|
|
|
|
|
continue
|
|
|
|
|
node.size = size
|
|
|
|
|
return size
|
|
|
|
|