pretty_table
This commit is contained in:
parent
733458f375
commit
0b189b8e5f
@ -116,6 +116,8 @@ def diff_snap(last_tree, current_tree, path='./'):
|
||||
# compute moved could save bandwidth
|
||||
res['moved'] = []
|
||||
for n, r in enumerate(res['removed']):
|
||||
if r.get('hash') is None:
|
||||
continue
|
||||
found, path = find_subtree(current_tree, {
|
||||
r['name'] : r['hash'],
|
||||
})
|
||||
|
@ -541,7 +541,6 @@ class Manager():
|
||||
changes = local_snap_diff.get('changed') or []
|
||||
|
||||
unmerged = []
|
||||
|
||||
dones = []
|
||||
|
||||
for node in changes:
|
||||
@ -569,6 +568,38 @@ class Manager():
|
||||
|
||||
return dones
|
||||
|
||||
def sync_removed(self, removed=None):
|
||||
if removed is None:
|
||||
local_snap_diff = self.get_local_snap_diff()
|
||||
removed = local_snap_diff.get('removed') or []
|
||||
|
||||
unmerged = []
|
||||
dones = []
|
||||
|
||||
for node in removed:
|
||||
node_name = node['name']
|
||||
last_hash = node['last_hash']
|
||||
print(f'Checking local {node_name}')
|
||||
|
||||
rstatus = self.get_rnode_status(node)
|
||||
rfile_buf, rhash, rexists = map(rstatus.get, ['iobuffer', 'hash', 'exists'])
|
||||
node['remote_hash'] = rhash
|
||||
node['remote_file_buf'] = rfile_buf
|
||||
|
||||
if rexists and last_hash != rhash:
|
||||
print(f'Put node {node_name} in unmerged, node exists in remote but hash diff from know last_hash snapshot')
|
||||
unmerged.append(node)
|
||||
continue
|
||||
|
||||
dones.append(node)
|
||||
print(f'You can proceed to remove {node_name} file it is not changed from the last version')
|
||||
self.remove_node_remotely(node)
|
||||
|
||||
if unmerged:
|
||||
self.store_unmerged_diff(unmerged)
|
||||
|
||||
return dones
|
||||
|
||||
def sync(self):
|
||||
'''
|
||||
sync:
|
||||
@ -602,6 +633,12 @@ class Manager():
|
||||
for node in added_done:
|
||||
local_tree = self.update_local_hash('add', node, tree=local_tree)
|
||||
|
||||
removed = local_snap_diff.get('removed') or []
|
||||
removed_done = self.sync_removed(removed=removed)
|
||||
|
||||
for node in removed_done:
|
||||
local_tree = self.update_local_hash('removed', node, tree=local_tree)
|
||||
|
||||
## dump new tree
|
||||
self.dump_local_hash(hsh=local_tree)
|
||||
|
||||
@ -620,6 +657,10 @@ class Manager():
|
||||
if kpath == '.': continue
|
||||
subtree = subtree[kpath]
|
||||
|
||||
if action == 'remove':
|
||||
subtree.pop(node_name, None)
|
||||
return tree
|
||||
|
||||
if action == 'add':
|
||||
subtree[node_name] = {}
|
||||
|
||||
|
@ -2,8 +2,29 @@ import os
|
||||
|
||||
from lib.snapshot.generate import local as _genlocal
|
||||
|
||||
from tools import pretty_print
|
||||
from testing import sync
|
||||
|
||||
def test_tree_hash():
|
||||
m = sync.get_test_manager()
|
||||
agent = m.get_agent()
|
||||
## verify
|
||||
local_node_hash = _genlocal.generate_tree_hash('/home/luca/sharednotes_dev/')
|
||||
|
||||
remote_node_hash = agent.generate_tree_hash_oversftp('/home/notanamber/notes_dev/')
|
||||
|
||||
try:
|
||||
assert local_node_hash == remote_node_hash
|
||||
print('Test executed succesfully')
|
||||
return
|
||||
except:
|
||||
pretty_print.pp(local_node_hash)
|
||||
print('*************************')
|
||||
print('*************************')
|
||||
print('*************************')
|
||||
print('*************************')
|
||||
pretty_print.pp(remote_node_hash)
|
||||
|
||||
def test_add_folder():
|
||||
new_path = '/home/luca/sharednotes_dev/test_add/test_add_nested'
|
||||
try:
|
||||
@ -14,6 +35,25 @@ def test_add_folder():
|
||||
m = sync.get_test_manager()
|
||||
m.sync()
|
||||
|
||||
return test_tree_hash()
|
||||
|
||||
def test_remove_folder():
|
||||
'''
|
||||
remove /home/luca/sharednotes_dev/test_add/
|
||||
'''
|
||||
m = sync.get_test_manager()
|
||||
m.sync()
|
||||
## verify
|
||||
test_tree_hash()
|
||||
|
||||
def test_add_file():
|
||||
'''
|
||||
add manually a file then
|
||||
launch test_add_file
|
||||
'''
|
||||
m = sync.get_test_manager()
|
||||
m.sync()
|
||||
|
||||
## verify
|
||||
local_node_hash = _genlocal.generate_tree_hash('/home/luca/sharednotes_dev/test_add/')
|
||||
|
||||
|
50
src/tools/pretty_table.py
Normal file
50
src/tools/pretty_table.py
Normal file
@ -0,0 +1,50 @@
|
||||
class PrettyTable():
|
||||
def __init__(self):
|
||||
self.col_sep = '\uFF5C'
|
||||
self.hor_fill = '\u2015'
|
||||
self.pad_right = 5
|
||||
self.head_str = ''
|
||||
self.body_str = ''
|
||||
self.sep_str = ''
|
||||
self.hspecs = []
|
||||
|
||||
def get_separator_str(self):
|
||||
if self.sep_str:
|
||||
return self.sep_str
|
||||
|
||||
self.sep_str = ''
|
||||
for _, thead_len in self.hspecs:
|
||||
self.sep_str += '{0:{fill}<{flen}}'.format('',fill=self.hor_fill, flen=thead_len)
|
||||
self.sep_str += self.col_sep
|
||||
self.sep_str += '\n'
|
||||
return self.sep_str
|
||||
|
||||
def head(self, hspecs):
|
||||
'''
|
||||
@param hspecs [('header_text', int)] text and length of column
|
||||
'''
|
||||
|
||||
self.hspecs = hspecs
|
||||
self.head_str = ''
|
||||
# for thead_text, thead_len, align in zip(htexts, hlens, ['^']*len(hlens)):
|
||||
for (thead_text, thead_len), align in zip(hspecs, ['^']*len(hspecs)):
|
||||
self.head_str += "{0:{align}{flen}}".format(thead_text, align=align, flen=thead_len)
|
||||
self.head_str += self.col_sep
|
||||
self.head_str += '\n'
|
||||
self.head_str += self.get_separator_str()
|
||||
# print(self.head_str)
|
||||
|
||||
def body(self, rows):
|
||||
hlens = [thead_len for (thead_text, thead_len) in self.hspecs]
|
||||
|
||||
self.body_str = ''
|
||||
for row in rows:
|
||||
row_str = ''
|
||||
for trow_text, flen in zip(row, hlens):
|
||||
row_str += "{0:{flen}}".format(' %s' % trow_text, flen=flen)
|
||||
row_str += self.col_sep
|
||||
self.body_str += row_str + '\n' + self.get_separator_str()
|
||||
# print(self.body_str)
|
||||
|
||||
def print(self):
|
||||
return print(self.head_str + self.body_str)
|
Loading…
x
Reference in New Issue
Block a user