def addrevision( self, text, transaction, linknode, p1, p2, cachedelta=None, node=None, flags=revlog.REVIDX_DEFAULT_FLAGS, sidedata=None, ): # text passed to "addrevision" includes hg filelog metadata header if node is None: node = storageutil.hashrevisionsha1(text, p1, p2) if sidedata is None: sidedata = {} meta, metaoffset = storageutil.parsemeta(text) rawtext, validatehash = flagutil.processflagswrite( self, text, flags, sidedata=sidedata ) return self.addrawrevision( rawtext, transaction, linknode, p1, p2, node, flags, cachedelta, _metatuple=(meta, metaoffset), )
def filelogaddrevision(orig, self, text, transaction, link, p1, p2, cachedelta=None, node=None, flags=revlog.REVIDX_DEFAULT_FLAGS, **kwds): # The matcher isn't available if reposetup() wasn't called. lfstrack = self._revlog.opener.options.get(b'lfstrack') if lfstrack: textlen = len(text) # exclude hg rename meta from file size meta, offset = storageutil.parsemeta(text) if offset: textlen -= offset if lfstrack(self._revlog.filename, textlen): flags |= revlog.REVIDX_EXTSTORED return orig(self, text, transaction, link, p1, p2, cachedelta=cachedelta, node=node, flags=flags, **kwds)
def writetostore(self, text, sidedata): # hg filelog metadata (includes rename, etc) hgmeta, offset = storageutil.parsemeta(text) if offset and offset > 0: # lfs blob does not contain hg filelog metadata text = text[offset:] # git-lfs only supports sha256 oid = hex(hashlib.sha256(text).digest()) self.opener.lfslocalblobstore.write(oid, text) # replace contents with metadata longoid = b'sha256:%s' % oid metadata = pointer.gitlfspointer(oid=longoid, size=b'%d' % len(text)) # by default, we expect the content to be binary. however, LFS could also # be used for non-binary content. add a special entry for non-binary data. # this will be used by filectx.isbinary(). if not stringutil.binary(text): # not hg filelog metadata (affecting commit hash), no "x-hg-" prefix metadata[b'x-is-binary'] = b'0' # translate hg filelog metadata to lfs metadata with "x-hg-" prefix if hgmeta is not None: for k, v in pycompat.iteritems(hgmeta): metadata[b'x-hg-%s' % k] = v rawtext = metadata.serialize() return (rawtext, False)
def parsemeta(text): """parse mercurial filelog metadata""" meta, size = storageutil.parsemeta(text) if text.startswith('\1\n'): s = text.index('\1\n', 2) text = text[s + 2:] return meta or {}, text
def renamed(self, node): validatenode(node) if self.parents(node)[0] != nullid: return False fulltext = self.revision(node) m = storageutil.parsemeta(fulltext)[0] if m and 'copy' in m: return m['copy'], bin(m['copyrev']) return False
def addrawrevision( self, rawtext, transaction, linknode, p1, p2, node, flags, cachedelta=None, _metatuple=None, ): if _metatuple: # _metatuple: used by "addrevision" internally by remotefilelog # meta was parsed confidently meta, metaoffset = _metatuple else: # not from self.addrevision, but something else (repo._filecommit) # calls addrawrevision directly. remotefilelog needs to get and # strip filelog metadata. # we don't have confidence about whether rawtext contains filelog # metadata or not (flag processor could replace it), so we just # parse it as best-effort. # in LFS (flags != 0)'s case, the best way is to call LFS code to # get the meta information, instead of storageutil.parsemeta. meta, metaoffset = storageutil.parsemeta(rawtext) if flags != 0: # when flags != 0, be conservative and do not mangle rawtext, since # a read flag processor expects the text not being mangled at all. metaoffset = 0 if metaoffset: # remotefilelog fileblob stores copy metadata in its ancestortext, # not its main blob. so we need to remove filelog metadata # (containing copy information) from text. blobtext = rawtext[metaoffset:] else: blobtext = rawtext data = self._createfileblob( blobtext, meta, flags, p1, p2, node, linknode ) self.repo.contentstore.addremotefilelognode(self.filename, node, data) return node