comparison mercurial/filelog.py @ 22597:58ec36686f0e

filelog: censored files compare against empty data, have 0 size To support "status" operations against working directories that are the children of censored revisions, filelog must define "cmp" and "size" for censored content.
author Mike Edgar <adgar@google.com>
date Sun, 14 Sep 2014 20:32:34 -0400
parents 27e2317efe89
children 22a979d1ae56
comparison
equal deleted inserted replaced
22596:27e2317efe89 22597:58ec36686f0e
62 62
63 # for revisions with renames, we have to go the slow way 63 # for revisions with renames, we have to go the slow way
64 node = self.node(rev) 64 node = self.node(rev)
65 if self.renamed(node): 65 if self.renamed(node):
66 return len(self.read(node)) 66 return len(self.read(node))
67 if self._iscensored(rev):
68 return 0
67 69
68 # XXX if self.read(node).startswith("\1\n"), this returns (size+4) 70 # XXX if self.read(node).startswith("\1\n"), this returns (size+4)
69 return super(filelog, self).size(rev) 71 return super(filelog, self).size(rev)
70 72
71 def cmp(self, node, text): 73 def cmp(self, node, text):
79 t = '\1\n\1\n' + text 81 t = '\1\n\1\n' + text
80 82
81 samehashes = not super(filelog, self).cmp(node, t) 83 samehashes = not super(filelog, self).cmp(node, t)
82 if samehashes: 84 if samehashes:
83 return False 85 return False
86
87 # censored files compare against the empty file
88 if self._iscensored(node):
89 return text != ''
84 90
85 # renaming a file produces a different hash, even if the data 91 # renaming a file produces a different hash, even if the data
86 # remains unchanged. Check if it's the case (slow): 92 # remains unchanged. Check if it's the case (slow):
87 if self.renamed(node): 93 if self.renamed(node):
88 t2 = self.read(node) 94 t2 = self.read(node)
98 raise error.CensoredNodeError(self.indexfile, node) 104 raise error.CensoredNodeError(self.indexfile, node)
99 raise 105 raise
100 106
101 def _file(self, f): 107 def _file(self, f):
102 return filelog(self.opener, f) 108 return filelog(self.opener, f)
109
110 def _iscensored(self, revornode):
111 """Check if a file revision is censored."""
112 try:
113 self.revision(revornode)
114 return False
115 except error.CensoredNodeError:
116 return True