summaryrefslogtreecommitdiff
path: root/tools/build/v2/test/tree.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/build/v2/test/tree.py')
-rw-r--r--tools/build/v2/test/tree.py120
1 files changed, 120 insertions, 0 deletions
diff --git a/tools/build/v2/test/tree.py b/tools/build/v2/test/tree.py
new file mode 100644
index 0000000000..89f8ad4ff1
--- /dev/null
+++ b/tools/build/v2/test/tree.py
@@ -0,0 +1,120 @@
+# Copyright 2003 Dave Abrahams
+# Copyright 2001, 2002 Vladimir Prus
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+# This file is based in part on the content of svn_tree.py.
+
+import svn_tree;
+
+class Trees_difference:
+
+ def __init__(self):
+ self.added_files = []
+ self.removed_files = []
+ self.modified_files = []
+ self.touched_files = []
+
+ def append(self, other):
+ self.added_files.extend(other.added_files)
+ self.removed_files.extend(other.removed_files)
+ self.modified_files.extend(other.modified_files)
+ self.touched_files.extend(other.touched_files)
+
+ def ignore_directories(self):
+ "Removes directories for list of found differences"
+
+ def not_dir(x):
+ return x[-1] != "/"
+ self.added_files = filter(not_dir, self.added_files)
+ self.removed_files = filter(not_dir, self.removed_files)
+ self.modified_files = filter(not_dir, self.modified_files)
+ self.touched_files = filter(not_dir, self.touched_files)
+
+ def pprint(self, f=None):
+ print >> f, "Added files :", self.added_files
+ print >> f, "Removed files :", self.removed_files
+ print >> f, "Modified files:", self.modified_files
+ print >> f, "Touched files :", self.touched_files
+
+ def empty(self):
+ return ( len(self.added_files) == 0 ) and \
+ ( len(self.removed_files) == 0 ) and \
+ ( len(self.modified_files) == 0 ) and \
+ ( len(self.touched_files) == 0 )
+
+def build_tree(dir):
+ return svn_tree.build_tree_from_wc(dir, load_props=0, ignore_svn=1)
+
+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 dump_tree(t):
+ svn_tree.dump_tree(t)
+
+def traverse_tree(t, parent_name=""):
+ """ Returns the list of all names in tree. """
+ if parent_name:
+ full_node_name = parent_name + "/" + t.name
+ else:
+ full_node_name = t.name
+
+ if (t.children is None):
+ result = [full_node_name]
+ else:
+ result = [full_node_name + "/"]
+ for i in t.children:
+ result.extend(traverse_tree(i, full_node_name))
+ return result