mirror of
https://github.com/facebook/sapling.git
synced 2024-10-09 08:18:15 +03:00
545f670504
Summary: A simple utility that does paths <-> local bytes conversion. It's needed since Mercurial stores paths using local encoding in manifests. For POSIX, the code is zero-cost - no real conversion or error can happen. This is in theory cheaper than what treedirstate does. For Windows, the "local_encoding" crate is selected as Yuya suggested the `MultiByteToWideChar` Win32 API [1] and "local_encoding" uses it. It does the right thing given my experiment with GBK (Chinese, simplified) encoding. ``` .... C:\Users\quark\enc>hg debugshell --config extensions.debugshell= >>> repo[0].manifest().text() '\xc4\xbf\xc2\xbc1/\xce\xc4\xbc\xfe1\x00b80de5d138758541c5f05265ad144ab9fa86d1db\n' >>> repo[0].files() ['\xc4\xbf\xc2\xbc1/\xce\xc4\xbc\xfe1'] extern crate local_encoding; use std::path::PathBuf; use local_encoding::{Encoder, Encoding}; const mpath: &[u8] = b"\xc4\xbf\xc2\xbc1/\xce\xc4\xbc\xfe1"; fn main() { let p = PathBuf::from(Encoding::OEM.to_string(mpath).unwrap()); println!("exists: {}", p.exists()); println!("mpath len: {}, osstr len: {}", mpath.len(), p.as_path().as_os_str().len()); } exists: true mpath len: 11, osstr len: 15 ``` In the future, we might normalize the paths to UTF-8 before storing them in manifest to avoid issues. Differential Revision: D7319604 fbshipit-source-id: a7ed5284be116c4176598b4c742e8228abcc3b02 |
||
---|---|---|
.. | ||
cdatapack | ||
clib | ||
indexedlog | ||
linelog | ||
pathencoding | ||
radixbuf | ||
third-party | ||
vlqencoding | ||
README.md |
lib
Any native code (C/C++/Rust) that Mercurial (either core or extensions)
depends on should go here. Python code, or native code that depends on
Python code (e.g. #include <Python.h>
or use cpython
) is disallowed.
As we start to convert more of Mercurial into Rust, and write new paths entrirely in native code, we'll want to limit our dependency on Python, which is why this barrier exists.
See also hgext/extlib/README.md
, mercurial/cext/README.mb
.
How do I choose between lib
and extlib
(and cext
)?
If your code is native and doesn't depend on Python (awesome!), it goes here.
Otherwise, put it in hgext/extlib
(if it's only used by extensions) or
mercurial/cext
(if it's used by extensions or core).