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:
Jun Wu 2018-05-26 13:49:54 -07:00 committed by Facebook Github Bot
parent 46ab269f99
commit ee83f12849
6 changed files with 40 additions and 47 deletions

View File

@ -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####"

View File

@ -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]

View File

@ -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)

View File

@ -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",
),
]

View File

@ -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)