[PATCH 6 of 7 RFC v2] filelog: censored files compare against empty data, have 0 size

Mike Edgar michaeljedgar at gmail.com
Mon Sep 15 07:01:27 CDT 2014


# HG changeset patch
# User Mike Edgar <adgar at google.com>
# Date 1410741154 14400
#      Sun Sep 14 20:32:34 2014 -0400
# Node ID 03684b2891165ba0f6626216a1a6eaed4c502547
# Parent  cb2d62a677e6df6b50df1699e7eea212a82af98d
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.

diff -r cb2d62a677e6 -r 03684b289116 mercurial/filelog.py
--- a/mercurial/filelog.py	Sun Sep 14 20:30:09 2014 -0400
+++ b/mercurial/filelog.py	Sun Sep 14 20:32:34 2014 -0400
@@ -64,6 +64,8 @@
         node = self.node(rev)
         if self.renamed(node):
             return len(self.read(node))
+        if self._iscensored(rev):
+            return 0
 
         # XXX if self.read(node).startswith("\1\n"), this returns (size+4)
         return super(filelog, self).size(rev)
@@ -82,6 +84,10 @@
         if samehashes:
             return False
 
+        # censored files compare against the empty file
+        if self._iscensored(node):
+            return text != ''
+
         # renaming a file produces a different hash, even if the data
         # remains unchanged. Check if it's the case (slow):
         if self.renamed(node):
@@ -100,3 +106,11 @@
 
     def _file(self, f):
         return filelog(self.opener, f)
+
+    def _iscensored(self, revornode):
+        """Check if a file revision is censored."""
+        try:
+            self.revision(revornode)
+            return False
+        except error.CensoredNodeError:
+            return True


More information about the Mercurial-devel mailing list