##// END OF EJS Templates
rawdata: update caller in wireprotov2server...
rawdata: update caller in wireprotov2server We update callers incrementally because this help bisecting failures. This was useful during development, so we expect it might be useful again in the future.

File last commit:

r42978:0def0fcb default
r43019:2d2e35c7 default
Show More
files.rs
94 lines | 2.6 KiB | application/rls-services+xml | RustLexer
Raphaël Gomès
rust-docstrings: add missing module docstrings...
r42996 // files.rs
//
// Copyright 2019
// Raphaël Gomès <rgomes@octobus.net>,
// Yuya Nishihara <yuya@tcha.org>
//
// This software may be used and distributed according to the terms of the
// GNU General Public License version 2 or any later version.
//! Functions for fiddling with files.
Yuya Nishihara
rust-dirstate: add helper to iterate ancestor paths...
r42789 use std::iter::FusedIterator;
Raphaël Gomès
rust-filepatterns: use bytes instead of String...
r42630 use std::path::Path;
pub fn get_path_from_bytes(bytes: &[u8]) -> &Path {
let os_str;
#[cfg(unix)]
{
use std::os::unix::ffi::OsStrExt;
os_str = std::ffi::OsStr::from_bytes(bytes);
}
#[cfg(windows)]
{
Yuya Nishihara
rust-filepatterns: add comment about Windows path handling...
r42684 // TODO: convert from Windows MBCS (ANSI encoding) to WTF8.
// Perhaps, the return type would have to be Result<PathBuf>.
Raphaël Gomès
rust-filepatterns: use bytes instead of String...
r42630 use std::os::windows::ffi::OsStrExt;
os_str = std::ffi::OsString::from_wide(bytes);
}
Path::new(os_str)
}
Yuya Nishihara
rust-dirstate: add helper to iterate ancestor paths...
r42789
/// An iterator over repository path yielding itself and its ancestors.
#[derive(Copy, Clone, Debug)]
pub struct Ancestors<'a> {
next: Option<&'a [u8]>,
}
impl<'a> Iterator for Ancestors<'a> {
// if we had an HgPath type, this would yield &'a HgPath
type Item = &'a [u8];
fn next(&mut self) -> Option<Self::Item> {
let next = self.next;
self.next = match self.next {
Some(s) if s.is_empty() => None,
Some(s) => {
let p = s.iter().rposition(|&c| c == b'/').unwrap_or(0);
Some(&s[..p])
}
None => None,
};
next
}
}
impl<'a> FusedIterator for Ancestors<'a> {}
/// Returns an iterator yielding ancestor directories of the given repository
/// path.
///
/// The path is separated by '/', and must not start with '/'.
///
/// The path itself isn't included unless it is b"" (meaning the root
/// directory.)
pub fn find_dirs<'a>(path: &'a [u8]) -> Ancestors<'a> {
let mut dirs = Ancestors { next: Some(path) };
if !path.is_empty() {
dirs.next(); // skip itself
}
dirs
}
#[cfg(test)]
mod tests {
#[test]
fn find_dirs_some() {
let mut dirs = super::find_dirs(b"foo/bar/baz");
assert_eq!(dirs.next(), Some(b"foo/bar".as_ref()));
assert_eq!(dirs.next(), Some(b"foo".as_ref()));
assert_eq!(dirs.next(), Some(b"".as_ref()));
assert_eq!(dirs.next(), None);
assert_eq!(dirs.next(), None);
}
#[test]
fn find_dirs_empty() {
// looks weird, but mercurial.util.finddirs(b"") yields b""
let mut dirs = super::find_dirs(b"");
assert_eq!(dirs.next(), Some(b"".as_ref()));
assert_eq!(dirs.next(), None);
assert_eq!(dirs.next(), None);
}
}