def revchunk(self, revlog, rev, prev, linknode): node = revlog.node(rev) p1, p2 = revlog.parentrevs(rev) base = self.deltaparent(revlog, rev, p1, p2, prev) prefix = '' if revlog.iscensored(base) or revlog.iscensored(rev): try: delta = revlog.revision(node) except error.CensoredNodeError as e: delta = e.tombstone if base == nullrev: prefix = mdiff.trivialdiffheader(len(delta)) else: baselen = revlog.rawsize(base) prefix = mdiff.replacediffheader(baselen, len(delta)) elif base == nullrev: delta = revlog.revision(node) prefix = mdiff.trivialdiffheader(len(delta)) else: delta = revlog.revdiff(base, rev) p1n, p2n = revlog.parents(node) basenode = revlog.node(base) meta = self.builddeltaheader(node, p1n, p2n, basenode, linknode) meta += prefix l = len(meta) + len(delta) yield chunkheader(l) yield meta yield delta
def revchunk(self, revlog, rev, prev, linknode): node = revlog.node(rev) p1, p2 = revlog.parentrevs(rev) base = self.deltaparent(revlog, rev, p1, p2, prev) prefix = '' if revlog.iscensored(base) or revlog.iscensored(rev): try: delta = revlog.revision(node) except error.CensoredNodeError, e: delta = e.tombstone if base == nullrev: prefix = mdiff.trivialdiffheader(len(delta)) else: baselen = revlog.rawsize(base) prefix = mdiff.replacediffheader(baselen, len(delta))
def _peek_iscensored(self, baserev, delta, flush): """Quickly check if a delta produces a censored revision.""" # Fragile heuristic: unless new file meta keys are added alphabetically # preceding "censored", all censored revisions are prefixed by # "\1\ncensored:". A delta producing such a censored revision must be a # full-replacement delta, so we inspect the first and only patch in the # delta for this prefix. hlen = struct.calcsize(">lll") if len(delta) <= hlen: return False oldlen = self.rawsize(baserev) newlen = len(delta) - hlen if delta[:hlen] != mdiff.replacediffheader(oldlen, newlen): return False add = "\1\ncensored:" addlen = len(add) return newlen >= addlen and delta[hlen:hlen + addlen] == add