comparison mercurial/revlog.py @ 23857:8a3c132f93d2

revlog: verify censored flag when hashing added revision fulltext When receiving a delta via exchange, three possible storage outcomes emerge: 1. The delta is added directly to the revlog. ("fast-path") 2. A freshly-computed delta with a different base is stored. 3. The new revision's fulltext is computed and stored outright. Both (2) and (3) require materializing the full text of the new revision by applying the delta to its base. This is typically followed by a hash check. The new flags argument allows callers to _addrevision to signal that they expect that hash check to fail. We can use this opportunity to verify that expectation. If the hash fails, require the flag be set; if the hash passes, require the flag be unset. Rather than simply eliding the hash check, this approach provides some assurance that the censored flag is not applied to valid revisions. Read more at: http://mercurial.selenic.com/wiki/CensorPlan
author Mike Edgar <adgar@google.com>
date Mon, 12 Jan 2015 14:41:25 -0500
parents 062c3ad86651
children 828dc8db5515
comparison
equal deleted inserted replaced
23856:062c3ad86651 23857:8a3c132f93d2
1233 ifh.flush() 1233 ifh.flush()
1234 basetext = self.revision(self.node(cachedelta[0])) 1234 basetext = self.revision(self.node(cachedelta[0]))
1235 btext[0] = mdiff.patch(basetext, cachedelta[1]) 1235 btext[0] = mdiff.patch(basetext, cachedelta[1])
1236 try: 1236 try:
1237 self.checkhash(btext[0], p1, p2, node) 1237 self.checkhash(btext[0], p1, p2, node)
1238 if flags & REVIDX_ISCENSORED:
1239 raise RevlogError(_('node %s is not censored') % node)
1238 except CensoredNodeError: 1240 except CensoredNodeError:
1239 pass # always import a censor tombstone. 1241 # must pass the censored index flag to add censored revisions
1242 if not flags & REVIDX_ISCENSORED:
1243 raise
1240 return btext[0] 1244 return btext[0]
1241 1245
1242 def builddelta(rev): 1246 def builddelta(rev):
1243 # can we use the cached delta? 1247 # can we use the cached delta?
1244 if cachedelta and cachedelta[0] == rev: 1248 if cachedelta and cachedelta[0] == rev: