def trees_difference(a, b, current_name=""): """Compare SVNTreeNodes A and B, and create Trees_difference class.""" assert a.name == b.name result = Trees_difference() try: # A and B are both files. if ((a.children is None) and (b.children is None)): assert a.name == b.name if svn_tree.compare_file_nodes(a, b): result.modified_files.append(current_name) elif (a.mtime != b.mtime): result.touched_files.append(current_name) # One is a file, one is a directory. # this case is disabled because svn_tree doesn't distinguish # empty directories from files, at least on Cygwin. elif 0 and (((a.children is None) and (b.children is not None)) or ((a.children is not None) and (b.children is None))): a.pprint() b.pprint() raise svn_tree.SVNTypeMismatch # They're both directories. else: # accounted_for holds childrens present in both trees accounted_for = [] for a_child in (a.children or []): b_child = svn_tree.get_child(b, a_child.name) if b_child: accounted_for.append(b_child) if current_name: result.append( trees_difference(a_child, b_child, current_name + "/" + a_child.name)) else: result.append( trees_difference(a_child, b_child, a_child.name)) else: if current_name: result.removed_files.append(current_name + "/" + a_child.name) else: result.removed_files.append(a_child.name) for b_child in (b.children or []): if (b_child not in accounted_for): result.added_files.extend( traverse_tree(b_child, current_name)) except svn_tree.SVNTypeMismatch: print 'Unequal Types: one Node is a file, the other is a directory' raise svn_tree.SVNTreeUnequal except svn_tree.SVNTreeIsNotDirectory: print "Error: Foolish call to get_child." sys.exit(1) except IndexError: print "Error: unequal number of children" raise svn_tree.SVNTreeUnequal return result
def trees_difference(a, b, current_name=""): """Compare SVNTreeNodes A and B, and create Trees_difference class.""" assert a.name == b.name result = Trees_difference() try: # A and B are both files. if ((a.children is None) and (b.children is None)): assert a.name == b.name if svn_tree.compare_file_nodes(a, b): result.modified_files.append(current_name) elif (a.mtime != b.mtime): result.touched_files.append(current_name) # One is a file, one is a directory. # this case is disabled because svn_tree doesn't distinguish # empty directories from files, at least on Cygwin. elif 0 and (((a.children is None) and (b.children is not None)) or ((a.children is not None) and (b.children is None))): a.pprint() b.pprint() raise svn_tree.SVNTypeMismatch # They're both directories. else: # accounted_for holds childrens present in both trees accounted_for = [] for a_child in (a.children or []): b_child = svn_tree.get_child(b, a_child.name) if b_child: accounted_for.append(b_child) if current_name: result.append(trees_difference(a_child, b_child, current_name + "/" + a_child.name)) else: result.append(trees_difference(a_child, b_child, a_child.name)) else: if current_name: result.removed_files.append(current_name + "/" + a_child.name) else: result.removed_files.append(a_child.name) for b_child in (b.children or []): if (b_child not in accounted_for): result.added_files.extend(traverse_tree(b_child, current_name)) except svn_tree.SVNTypeMismatch: print 'Unequal Types: one Node is a file, the other is a directory' raise svn_tree.SVNTreeUnequal except svn_tree.SVNTreeIsNotDirectory: print "Error: Foolish call to get_child." sys.exit(1) except IndexError: print "Error: unequal number of children" raise svn_tree.SVNTreeUnequal return result