예제 #1
0
    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),
        )
예제 #2
0
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)
예제 #3
0
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)
예제 #4
0
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
예제 #5
0
    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
예제 #6
0
    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