Mercurial > public > mercurial-scm > hg-stable
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 |