mirror of
https://github.com/facebook/sapling.git
synced 2024-10-06 14:58:03 +03:00
treestate: move hgext.extlib.treedirstate to mercurial.rust.treestate
Summary: Going to make changes to `mercurial/` for cleaner fsmonitor support directly. So let's move the Rust python bridge there first. Reviewed By: markbt Differential Revision: D7909174 fbshipit-source-id: 454d784b5dca18a3af9328fc7b2f342cd4188cf6
This commit is contained in:
parent
46ab269f99
commit
ee83f12849
@ -60,8 +60,7 @@ from mercurial import (
|
||||
util,
|
||||
)
|
||||
from mercurial.i18n import _
|
||||
|
||||
from .extlib import treedirstate as rusttreedirstate
|
||||
from mercurial.rust import treestate as rusttreedirstate
|
||||
|
||||
|
||||
dirstateheader = b"########################treedirstate####"
|
||||
|
@ -1,5 +1,5 @@
|
||||
[package]
|
||||
name = "treedirstate"
|
||||
name = "treestate"
|
||||
version = "0.1.0"
|
||||
authors = ["Facebook Source Control Team <sourcecontrol-dev@fb.com>"]
|
||||
|
||||
@ -7,7 +7,7 @@ authors = ["Facebook Source Control Team <sourcecontrol-dev@fb.com>"]
|
||||
lto = true
|
||||
|
||||
[lib]
|
||||
name = "treedirstate"
|
||||
name = "treestate"
|
||||
crate-type = ["cdylib"]
|
||||
|
||||
[dependencies]
|
@ -1,5 +1,5 @@
|
||||
// Copyright Facebook, Inc. 2017
|
||||
//! Python bindings for treedirstate.
|
||||
//! Python bindings for treedirstate and treestate.
|
||||
|
||||
use cpython::*;
|
||||
use pathencoding::local_bytes_to_path;
|
||||
@ -12,23 +12,18 @@ use treestate::tree::{Key, KeyRef};
|
||||
use treestate::treedirstate::TreeDirstate;
|
||||
use treestate::treestate::TreeState;
|
||||
|
||||
py_module_initializer!(
|
||||
treedirstate,
|
||||
inittreedirstate,
|
||||
PyInit_treedirstate,
|
||||
|py, m| {
|
||||
m.add_class::<treedirstatemap>(py)?;
|
||||
m.add_class::<treestate>(py)?;
|
||||
m.add(py, "EXIST_P1", StateFlags::EXIST_P1.to_bits())?;
|
||||
m.add(py, "EXIST_P2", StateFlags::EXIST_P2.to_bits())?;
|
||||
m.add(py, "EXIST_NEXT", StateFlags::EXIST_NEXT.to_bits())?;
|
||||
m.add(py, "IGNORED", StateFlags::IGNORED.to_bits())?;
|
||||
m.add(py, "NEED_CHECK", StateFlags::NEED_CHECK.to_bits())?;
|
||||
m.add(py, "COPIED", StateFlags::COPIED.to_bits())?;
|
||||
m.add(py, "tohgstate", py_fn!(py, flags_to_hg_state(flags: u16)))?;
|
||||
Ok(())
|
||||
}
|
||||
);
|
||||
py_module_initializer!(treestate, inittreestate, PyInit_treestate, |py, m| {
|
||||
m.add_class::<treedirstatemap>(py)?;
|
||||
m.add_class::<treestate>(py)?;
|
||||
m.add(py, "EXIST_P1", StateFlags::EXIST_P1.to_bits())?;
|
||||
m.add(py, "EXIST_P2", StateFlags::EXIST_P2.to_bits())?;
|
||||
m.add(py, "EXIST_NEXT", StateFlags::EXIST_NEXT.to_bits())?;
|
||||
m.add(py, "IGNORED", StateFlags::IGNORED.to_bits())?;
|
||||
m.add(py, "NEED_CHECK", StateFlags::NEED_CHECK.to_bits())?;
|
||||
m.add(py, "COPIED", StateFlags::COPIED.to_bits())?;
|
||||
m.add(py, "tohgstate", py_fn!(py, flags_to_hg_state(flags: u16)))?;
|
||||
Ok(())
|
||||
});
|
||||
|
||||
fn callback_error(py: Python, mut e: PyErr) -> ErrorKind {
|
||||
let s = e.instance(py)
|
6
setup.py
6
setup.py
@ -1506,9 +1506,9 @@ rustextmodules = [
|
||||
manifest="mercurial/rust/matcher/Cargo.toml",
|
||||
),
|
||||
RustExtension(
|
||||
"treedirstate",
|
||||
package="hgext.extlib",
|
||||
manifest="hgext/extlib/treedirstate/Cargo.toml",
|
||||
"treestate",
|
||||
package="mercurial.rust",
|
||||
manifest="mercurial/rust/treestate/Cargo.toml",
|
||||
),
|
||||
]
|
||||
|
||||
|
@ -7,10 +7,9 @@ import tempfile
|
||||
import unittest
|
||||
|
||||
import silenttestrunner
|
||||
from hgext.extlib import treedirstate
|
||||
from mercurial.rust import treestate
|
||||
|
||||
|
||||
treestate = treedirstate.treestate
|
||||
testtmp = os.getenv("TESTTMP") or tempfile.mkdtemp("test-treestate")
|
||||
|
||||
|
||||
@ -57,16 +56,16 @@ def genfiles():
|
||||
|
||||
# bits (StateFlags)
|
||||
for bit in [
|
||||
treedirstate.EXIST_P1,
|
||||
treedirstate.EXIST_P2,
|
||||
treedirstate.EXIST_NEXT,
|
||||
treedirstate.IGNORED,
|
||||
treedirstate.NEED_CHECK,
|
||||
treestate.EXIST_P1,
|
||||
treestate.EXIST_P2,
|
||||
treestate.EXIST_NEXT,
|
||||
treestate.IGNORED,
|
||||
treestate.NEED_CHECK,
|
||||
]:
|
||||
if random.randint(0, 1):
|
||||
bits |= bit
|
||||
if random.randint(0, 1):
|
||||
bits |= treedirstate.COPIED
|
||||
bits |= treestate.COPIED
|
||||
copied = next(pathgen)
|
||||
|
||||
yield (path, bits, mode, size, mtime, copied)
|
||||
@ -75,7 +74,7 @@ def genfiles():
|
||||
class testtreestate(unittest.TestCase):
|
||||
|
||||
def testempty(self):
|
||||
tree = treestate(os.path.join(testtmp, "empty"), 0)
|
||||
tree = treestate.treestate(os.path.join(testtmp, "empty"), 0)
|
||||
self.assertEqual(len(tree), 0)
|
||||
self.assertEqual(tree.getmetadata(), "")
|
||||
self.assertEqual(tree.walk(0, 0), [])
|
||||
@ -87,7 +86,7 @@ class testtreestate(unittest.TestCase):
|
||||
self.assertIsNone(tree.get(path, None))
|
||||
|
||||
def testinsert(self):
|
||||
tree = treestate(os.path.join(testtmp, "insert"), 0)
|
||||
tree = treestate.treestate(os.path.join(testtmp, "insert"), 0)
|
||||
count = 5000
|
||||
files = list(itertools.islice(genfiles(), count))
|
||||
expected = {}
|
||||
@ -100,7 +99,7 @@ class testtreestate(unittest.TestCase):
|
||||
self.assertEqual(tree.get(path, None), expected[path])
|
||||
|
||||
def testremove(self):
|
||||
tree = treestate(os.path.join(testtmp, "remove"), 0)
|
||||
tree = treestate.treestate(os.path.join(testtmp, "remove"), 0)
|
||||
count = 5000
|
||||
files = list(itertools.islice(genfiles(), count))
|
||||
expected = {}
|
||||
@ -119,7 +118,7 @@ class testtreestate(unittest.TestCase):
|
||||
|
||||
def testwalk(self):
|
||||
treepath = os.path.join(testtmp, "walk")
|
||||
tree = treestate(treepath, 0)
|
||||
tree = treestate.treestate(treepath, 0)
|
||||
count = 5000
|
||||
files = list(itertools.islice(genfiles(), count))
|
||||
expected = {}
|
||||
@ -140,16 +139,16 @@ class testtreestate(unittest.TestCase):
|
||||
)
|
||||
|
||||
for i in ["in-memory", "flushed"]:
|
||||
for bit in [treedirstate.IGNORED, treedirstate.COPIED]:
|
||||
for bit in [treestate.IGNORED, treestate.COPIED]:
|
||||
check(0, bit)
|
||||
check(bit, 0)
|
||||
check(treedirstate.EXIST_P1, treedirstate.EXIST_P2)
|
||||
check(treestate.EXIST_P1, treestate.EXIST_P2)
|
||||
rootid = tree.flush()
|
||||
tree = treestate(treepath, rootid)
|
||||
tree = treestate.treestate(treepath, rootid)
|
||||
|
||||
def testflush(self):
|
||||
treepath = os.path.join(testtmp, "flush")
|
||||
tree = treestate(treepath, 0)
|
||||
tree = treestate.treestate(treepath, 0)
|
||||
tree.insert("a", 1, 2, 3, 4, None)
|
||||
tree.setmetadata("1")
|
||||
rootid1 = tree.flush()
|
||||
@ -159,19 +158,19 @@ class testtreestate(unittest.TestCase):
|
||||
tree.setmetadata("2")
|
||||
rootid2 = tree.flush()
|
||||
|
||||
tree = treestate(treepath, rootid1)
|
||||
tree = treestate.treestate(treepath, rootid1)
|
||||
self.assertTrue("a" in tree)
|
||||
self.assertFalse("b" in tree)
|
||||
self.assertEqual(tree.getmetadata(), "1")
|
||||
|
||||
tree = treestate(treepath, rootid2)
|
||||
tree = treestate.treestate(treepath, rootid2)
|
||||
self.assertFalse("a" in tree)
|
||||
self.assertTrue("b" in tree)
|
||||
self.assertEqual(tree.getmetadata(), "2")
|
||||
|
||||
def testsaveas(self):
|
||||
treepath = os.path.join(testtmp, "saveas")
|
||||
tree = treestate(treepath, 0)
|
||||
tree = treestate.treestate(treepath, 0)
|
||||
tree.insert("a", 1, 2, 3, 4, None)
|
||||
tree.setmetadata("1")
|
||||
tree.flush()
|
||||
@ -182,14 +181,14 @@ class testtreestate(unittest.TestCase):
|
||||
tree.setmetadata("2")
|
||||
rootid = tree.saveas(treepath)
|
||||
|
||||
tree = treestate(treepath, rootid)
|
||||
tree = treestate.treestate(treepath, rootid)
|
||||
self.assertFalse("a" in tree)
|
||||
self.assertTrue("b" in tree)
|
||||
self.assertEqual(tree.getmetadata(), "2")
|
||||
|
||||
def testfiltered(self):
|
||||
treepath = os.path.join(testtmp, "filtered")
|
||||
tree = treestate(treepath, 0)
|
||||
tree = treestate.treestate(treepath, 0)
|
||||
tree.insert("a/B/c", 1, 2, 3, 4, None)
|
||||
filtered = tree.getfiltered("A/B/C", lambda x: x.upper(), 1)
|
||||
self.assertEqual(filtered, "a/B/c")
|
||||
@ -198,7 +197,7 @@ class testtreestate(unittest.TestCase):
|
||||
|
||||
def testpathcomplete(self):
|
||||
treepath = os.path.join(testtmp, "pathcomplete")
|
||||
tree = treestate(treepath, 0)
|
||||
tree = treestate.treestate(treepath, 0)
|
||||
paths = ["a/b/c", "a/b/d", "a/c", "de"]
|
||||
for path in paths:
|
||||
tree.insert(path, 1, 2, 3, 4, None)
|
||||
|
Loading…
Reference in New Issue
Block a user