fstree.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from enum import Enum
  2. from collections import OrderedDict
  3. class FsNode:
  4. class Type(Enum):
  5. File = 0
  6. Directory = 1
  7. def __init__(self, name: str, type: "FsNode.Type", **kwargs):
  8. self.name = name
  9. self.type = type
  10. self.data = kwargs
  11. self.parent = None
  12. self.children = OrderedDict()
  13. def addChild(self, node: "FsNode"):
  14. self.children[node.name] = node
  15. node.parent = self
  16. def addDirectory(self, path):
  17. fragments = path.split("/")
  18. name = fragments[-1]
  19. fragments = fragments[:-1]
  20. parent_node = self.traverse(fragments)
  21. if not parent_node:
  22. raise Exception(f"No parent node found for: {path}")
  23. parent_node.addChild(FsNode(name, FsNode.Type.Directory))
  24. def addFile(self, path, md5, size):
  25. fragments = path.split("/")
  26. name = fragments[-1]
  27. fragments = fragments[:-1]
  28. parent_node = self.traverse(fragments)
  29. if not parent_node:
  30. raise Exception(f"No parent node found for: {path}")
  31. parent_node.addChild(FsNode(name, FsNode.Type.File, md5=md5, size=size))
  32. def getChild(self, name):
  33. return self.children[name]
  34. def traverse(self, fragments):
  35. current = self
  36. for fragment in fragments:
  37. current = current.getChild(fragment)
  38. if not current:
  39. break
  40. return current
  41. def getPath(self):
  42. fragments = []
  43. current = self
  44. while current.parent:
  45. fragments.append(current.name)
  46. current = current.parent
  47. return "/".join(reversed(fragments))
  48. def dump(self):
  49. ret = {}
  50. ret["name"] = (self.name,)
  51. ret["type"] = (self.type,)
  52. ret["path"] = (self.getPath(),)
  53. if len(self.children):
  54. ret["children"] = [node.dump() for node in self.children.values()]
  55. return ret
  56. def compare_fs_trees(left: FsNode, right: FsNode):
  57. # import pprint
  58. # pprint.pprint(left.dump())
  59. # pprint.pprint(right.dump())
  60. only_in_left = []
  61. changed = []
  62. only_in_right = []
  63. return [], [], []