Complete the diff generating functionality.
This commit is contained in:
parent
decb324411
commit
a1164269be
6 changed files with 113 additions and 32 deletions
|
@ -1,5 +1,6 @@
|
|||
import marisa_trie
|
||||
import os
|
||||
import tarfile
|
||||
|
||||
|
||||
AUFS_METADATA = u'.wh..wh.'
|
||||
|
@ -8,33 +9,34 @@ AUFS_WHITEOUT = u'.wh.'
|
|||
AUFS_WHITEOUT_PREFIX_LENGTH = len(AUFS_WHITEOUT)
|
||||
|
||||
|
||||
def files_and_dirs(root_path, removed_prefix_collector):
|
||||
for root, dirs, files in os.walk(unicode(root_path)):
|
||||
def files_and_dirs_from_tar(source_stream, removed_prefix_collector):
|
||||
tar_stream = tarfile.open(mode='r|*', fileobj=source_stream)
|
||||
|
||||
for tar_info in tar_stream:
|
||||
absolute = os.path.relpath(unicode(tar_info.name), './')
|
||||
filename = os.path.basename(absolute)
|
||||
|
||||
rel_root = os.path.relpath(root, root_path)
|
||||
yield rel_root
|
||||
if (filename.startswith(AUFS_METADATA) or
|
||||
absolute.startswith(AUFS_METADATA)):
|
||||
# Skip
|
||||
continue
|
||||
|
||||
for one_file in files:
|
||||
if one_file.startswith(AUFS_METADATA):
|
||||
# Skip
|
||||
continue
|
||||
elif filename.startswith(AUFS_WHITEOUT):
|
||||
filename = filename[AUFS_WHITEOUT_PREFIX_LENGTH:]
|
||||
removed_prefix_collector.add(absolute)
|
||||
continue
|
||||
|
||||
elif one_file.startswith(AUFS_WHITEOUT):
|
||||
filename = one_file[AUFS_WHITEOUT_PREFIX_LENGTH:]
|
||||
removed_prefix_collector.add(os.path.join(rel_root, filename))
|
||||
continue
|
||||
|
||||
else:
|
||||
yield os.path.join(rel_root, one_file)
|
||||
else:
|
||||
yield absolute
|
||||
|
||||
|
||||
def compute_removed(base_trie, removed_prefixes):
|
||||
def __compute_removed(base_trie, removed_prefixes):
|
||||
for prefix in removed_prefixes:
|
||||
for filename in base_trie.keys(prefix):
|
||||
yield filename
|
||||
|
||||
|
||||
def compute_added_changed(base_trie, delta_trie):
|
||||
def __compute_added_changed(base_trie, delta_trie):
|
||||
added = set()
|
||||
changed = set()
|
||||
|
||||
|
@ -47,10 +49,27 @@ def compute_added_changed(base_trie, delta_trie):
|
|||
return added, changed
|
||||
|
||||
|
||||
def new_fs(base_trie, added, removed):
|
||||
def __new_fs(base_trie, added, removed):
|
||||
for filename in base_trie.keys():
|
||||
if filename not in removed:
|
||||
yield filename
|
||||
|
||||
for filename in added:
|
||||
yield filename
|
||||
yield filename
|
||||
|
||||
|
||||
def empty_fs():
|
||||
return marisa_trie.Trie()
|
||||
|
||||
|
||||
def compute_new_diffs_and_fs(base_trie, filename_source,
|
||||
removed_prefix_collector):
|
||||
new_trie = marisa_trie.Trie(filename_source)
|
||||
(new_added, new_changed) = __compute_added_changed(base_trie, new_trie)
|
||||
|
||||
new_removed = marisa_trie.Trie(__compute_removed(base_trie,
|
||||
removed_prefix_collector))
|
||||
|
||||
new_fs = marisa_trie.Trie(__new_fs(base_trie, new_added, new_removed))
|
||||
|
||||
return (new_fs, new_added, new_changed, new_removed.keys())
|
||||
|
|
Reference in a new issue