# HG changeset patch # User Mads Kiilerich # Date 2020-03-28 21:21:47 # Node ID 31250d5e3c6a4d7fe81c25ed97c1c9bc46dd289d # Parent 9757ad98ea0986f48086251d1df3077341723941 vcs: avoid node base class knowledge of sub classes Pytype very reasonably got confused over the sub class property references in the base class. Fixed by moving base class specific parts of comparison to the sub classes and calling the base class. With .content only referenced in FileNode, there is even less need for an explicitly failing .content getter for DirNode. diff --git a/kallithea/lib/vcs/nodes.py b/kallithea/lib/vcs/nodes.py --- a/kallithea/lib/vcs/nodes.py +++ b/kallithea/lib/vcs/nodes.py @@ -135,13 +135,6 @@ class Node(object): return False if self.path != other.path: return False - if self.is_file(): - return self.content == other.content - else: - # For DirNode's check without entering each dir - self_nodes_paths = list(sorted(n.path for n in self.nodes)) - other_nodes_paths = list(sorted(n.path for n in self.nodes)) - return self_nodes_paths == other_nodes_paths def __lt__(self, other): if self.kind < other.kind: @@ -152,13 +145,6 @@ class Node(object): return True if self.path > other.path: return False - if self.is_file(): - return self.content < other.content - else: - # For DirNode's check without entering each dir - self_nodes_paths = list(sorted(n.path for n in self.nodes)) - other_nodes_paths = list(sorted(n.path for n in self.nodes)) - return self_nodes_paths < other_nodes_paths def __repr__(self): return '<%s %r>' % (self.__class__.__name__, self.path) @@ -247,6 +233,18 @@ class FileNode(Node): self._content = content self._mode = mode or 0o100644 + def __eq__(self, other): + eq = super(FileNode, self).__eq__(other) + if eq is not None: + return eq + return self.content == other.content + + def __lt__(self, other): + lt = super(FileNode, self).__lt__(other) + if lt is not None: + return lt + return self.content < other.content + @LazyProperty def mode(self): """ @@ -465,10 +463,23 @@ class DirNode(Node): self.changeset = changeset self._nodes = nodes - @LazyProperty - def content(self): - raise NodeError("%s represents a dir and has no ``content`` attribute" - % self) + def __eq__(self, other): + eq = super(DirNode, self).__eq__(other) + if eq is not None: + return eq + # check without entering each dir + self_nodes_paths = list(sorted(n.path for n in self.nodes)) + other_nodes_paths = list(sorted(n.path for n in self.nodes)) + return self_nodes_paths == other_nodes_paths + + def __lt__(self, other): + lt = super(DirNode, self).__lt__(other) + if lt is not None: + return lt + # check without entering each dir + self_nodes_paths = list(sorted(n.path for n in self.nodes)) + other_nodes_paths = list(sorted(n.path for n in self.nodes)) + return self_nodes_paths < other_nodes_paths @LazyProperty def nodes(self):