mirror of
https://github.com/facebook/sapling.git
synced 2024-10-07 15:27:13 +03:00
44343769f8
Summary: We want to rename away from "mercurial". Rather than rename the "mercurial" Python package, we opted to just collapse it into the parent "edenscm" package. This is also a step towards further organizing we want to do around the new project name. To ease the transition wrt hotfixes, we now replace "edenscm.mercurial" with "mercurial" to fix imports within base64-python extensions. Reviewed By: sggutier Differential Revision: D38943169 fbshipit-source-id: 03fa18079c51e2f7fac05d65b127095da3ab7c99
109 lines
3.1 KiB
Python
109 lines
3.1 KiB
Python
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
#
|
|
# This software may be used and distributed according to the terms of the
|
|
# GNU General Public License version 2.
|
|
|
|
import bindings
|
|
|
|
from . import error, filelog, revlog
|
|
from .i18n import _
|
|
from .node import bin, nullid
|
|
|
|
EAGEREPO_REQUIREMENT = "eagerepo"
|
|
|
|
|
|
def iseagerepo(repo):
|
|
return EAGEREPO_REQUIREMENT in repo.storerequirements
|
|
|
|
|
|
def openstore(repo):
|
|
from .changelog2 import HGCOMMITS_DIR
|
|
|
|
path = repo.svfs.join(HGCOMMITS_DIR)
|
|
return bindings.eagerepo.EagerRepoStore.open(path)
|
|
|
|
|
|
class eagerfilelog(object):
|
|
"""filelog-like interface for EagerRepoStore"""
|
|
|
|
def __init__(self, repo, name):
|
|
self.store = repo.fileslog.contentstore
|
|
self.name = name
|
|
|
|
def lookup(self, node):
|
|
assert len(node) == 20
|
|
return node
|
|
|
|
def read(self, node):
|
|
t = self._get_content(node)
|
|
# see filelog.read - strip filelog metadata
|
|
if not t.startswith(b"\1\n"):
|
|
return t
|
|
else:
|
|
s = t.index(b"\1\n", 2)
|
|
return t[s + 2 :]
|
|
|
|
def size(self, node):
|
|
return len(self.read(node))
|
|
|
|
def rev(self, node):
|
|
# same trick as remotefilelog
|
|
return node
|
|
|
|
def cmp(self, node, text):
|
|
"""returns True if blob hash is different from text"""
|
|
# PERF: This does use a fast path avoid read() - a fast path requires
|
|
# fast path reading p1, p2, which does not exist.
|
|
return self.read(node) != text
|
|
|
|
def renamed(self, node):
|
|
t = self._get_content(node)
|
|
if not t.startswith(b"\1\n"):
|
|
return False
|
|
m = filelog.parsemeta(t)[0]
|
|
if m and "copy" in m:
|
|
return (m["copy"], bin(m["copyrev"]))
|
|
return False
|
|
|
|
def add(self, text, meta, _tr, _linkrev, fparent1, fparent2):
|
|
# see filelog.add and revlog.addrevision
|
|
if meta or text.startswith(b"\1\n"):
|
|
text = filelog.packmeta(meta, text)
|
|
rawtext = revlog.textwithheader(text, fparent1, fparent2)
|
|
# SPACE: didn't set the "bases" for candidate delta bases.
|
|
node = self.store.add_sha1_blob(rawtext)
|
|
return node
|
|
|
|
def flags(self, rev):
|
|
return 0
|
|
|
|
def parents(self, node):
|
|
if node == nullid:
|
|
return (nullid, nullid)
|
|
else:
|
|
t = self._get_sha1_blob(node)
|
|
p1 = t[len(nullid) : len(nullid) * 2]
|
|
p2 = t[: len(nullid)]
|
|
return (p1, p2)
|
|
|
|
def revision(self, node, raw=True):
|
|
return self._get_content(node)
|
|
|
|
def _get_sha1_blob(self, node):
|
|
"""get the SHA1 prefixed (sorted([p1, p2])) content"""
|
|
if node == nullid:
|
|
return b""
|
|
t = self.store.get_sha1_blob(node)
|
|
if t is None:
|
|
raise error.LookupError(node, self.name, _("no node"))
|
|
return t
|
|
|
|
def _get_content(self, node):
|
|
"""get the content without hg's parent SHA1 prefix"""
|
|
if node == nullid:
|
|
return b""
|
|
t = self.store.get_content(node)
|
|
if t is None:
|
|
raise error.LookupError(node, self.name, _("no node"))
|
|
return t
|