annotate rust/hg-core/src/utils/files.rs @ 43490:a77d4fe347a4

rust-matchers: add `Matcher` trait and implement `AlwaysMatcher` In our quest of a faster Mercurial, we have arrived at the point where we need to implement the matchers in Rust. This RFC mainly for the `Matcher` trait to see if the changes proposed feel fine to people with more experience on the matter. While the `AlwaysMatcher` implementation is here as a trivial example, it should be the first step towards matchers use in Rust as it is currently the only supported one. Notable changes: - `exact` is renamed to `exact_match` - enums for `visit*` methods with `Recursive` instead of `'all'`, etc. - a new `roots`, separate from `file_set` - no `bad`, `explicitdir` or `traversedir` functions as they can be passed to the high functions instead of the matchers Thanks to Martin for suggesting the last two (most important) changes and for reaching out to help a few weeks ago. Differential Revision: https://phab.mercurial-scm.org/D7178
author Rapha?l Gom?s <rgomes@octobus.net>
date Tue, 29 Oct 2019 17:16:28 +0100
parents 99394e6c5d12
children b06cf2809ec3 0b7733719d21
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
42767
4b3b27d567d5 rust-docstrings: add missing module docstrings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42586
diff changeset
1 // files.rs
4b3b27d567d5 rust-docstrings: add missing module docstrings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42586
diff changeset
2 //
4b3b27d567d5 rust-docstrings: add missing module docstrings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42586
diff changeset
3 // Copyright 2019
4b3b27d567d5 rust-docstrings: add missing module docstrings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42586
diff changeset
4 // Raphaël Gomès <rgomes@octobus.net>,
4b3b27d567d5 rust-docstrings: add missing module docstrings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42586
diff changeset
5 // Yuya Nishihara <yuya@tcha.org>
4b3b27d567d5 rust-docstrings: add missing module docstrings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42586
diff changeset
6 //
4b3b27d567d5 rust-docstrings: add missing module docstrings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42586
diff changeset
7 // This software may be used and distributed according to the terms of the
4b3b27d567d5 rust-docstrings: add missing module docstrings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42586
diff changeset
8 // GNU General Public License version 2 or any later version.
4b3b27d567d5 rust-docstrings: add missing module docstrings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42586
diff changeset
9
4b3b27d567d5 rust-docstrings: add missing module docstrings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42586
diff changeset
10 //! Functions for fiddling with files.
4b3b27d567d5 rust-docstrings: add missing module docstrings
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42586
diff changeset
11
42960
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42850
diff changeset
12 use crate::utils::hg_path::{HgPath, HgPathBuf};
42586
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
13 use std::iter::FusedIterator;
42960
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42850
diff changeset
14
43271
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
15 use std::fs::Metadata;
42453
9609430d3625 rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
16 use std::path::Path;
9609430d3625 rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
17
9609430d3625 rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
18 pub fn get_path_from_bytes(bytes: &[u8]) -> &Path {
9609430d3625 rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
19 let os_str;
9609430d3625 rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
20 #[cfg(unix)]
9609430d3625 rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
21 {
9609430d3625 rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
22 use std::os::unix::ffi::OsStrExt;
9609430d3625 rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
23 os_str = std::ffi::OsStr::from_bytes(bytes);
9609430d3625 rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
24 }
43250
98d996a138de rust-cross-platform: remove `unimplemented!` to get compile-time errors
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42960
diff changeset
25 // TODO Handle other platforms
98d996a138de rust-cross-platform: remove `unimplemented!` to get compile-time errors
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42960
diff changeset
26 // TODO: convert from WTF8 to Windows MBCS (ANSI encoding).
98d996a138de rust-cross-platform: remove `unimplemented!` to get compile-time errors
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42960
diff changeset
27 // Perhaps, the return type would have to be Result<PathBuf>.
42453
9609430d3625 rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
28
9609430d3625 rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
29 Path::new(os_str)
9609430d3625 rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
30 }
42586
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
31
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
32 /// An iterator over repository path yielding itself and its ancestors.
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
33 #[derive(Copy, Clone, Debug)]
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
34 pub struct Ancestors<'a> {
42960
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42850
diff changeset
35 next: Option<&'a HgPath>,
42586
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
36 }
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
37
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
38 impl<'a> Iterator for Ancestors<'a> {
42960
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42850
diff changeset
39 type Item = &'a HgPath;
42586
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
40
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
41 fn next(&mut self) -> Option<Self::Item> {
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
42 let next = self.next;
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
43 self.next = match self.next {
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
44 Some(s) if s.is_empty() => None,
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
45 Some(s) => {
42960
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42850
diff changeset
46 let p = s.bytes().rposition(|c| *c == b'/').unwrap_or(0);
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42850
diff changeset
47 Some(HgPath::new(&s.as_bytes()[..p]))
42586
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
48 }
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
49 None => None,
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
50 };
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
51 next
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
52 }
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
53 }
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
54
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
55 impl<'a> FusedIterator for Ancestors<'a> {}
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
56
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
57 /// Returns an iterator yielding ancestor directories of the given repository
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
58 /// path.
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
59 ///
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
60 /// The path is separated by '/', and must not start with '/'.
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
61 ///
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
62 /// The path itself isn't included unless it is b"" (meaning the root
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
63 /// directory.)
42960
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42850
diff changeset
64 pub fn find_dirs<'a>(path: &'a HgPath) -> Ancestors<'a> {
42586
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
65 let mut dirs = Ancestors { next: Some(path) };
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
66 if !path.is_empty() {
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
67 dirs.next(); // skip itself
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
68 }
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
69 dirs
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
70 }
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
71
42960
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42850
diff changeset
72 /// TODO more than ASCII?
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42850
diff changeset
73 pub fn normalize_case(path: &HgPath) -> HgPathBuf {
42850
b1b984f9c01d rust-utils: add normalize_case util to mirror Python one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42767
diff changeset
74 #[cfg(windows)] // NTFS compares via upper()
42960
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42850
diff changeset
75 return path.to_ascii_uppercase();
42850
b1b984f9c01d rust-utils: add normalize_case util to mirror Python one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42767
diff changeset
76 #[cfg(unix)]
42960
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42850
diff changeset
77 path.to_ascii_lowercase()
42850
b1b984f9c01d rust-utils: add normalize_case util to mirror Python one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42767
diff changeset
78 }
b1b984f9c01d rust-utils: add normalize_case util to mirror Python one
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42767
diff changeset
79
43271
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
80 #[derive(Eq, PartialEq, Ord, PartialOrd, Copy, Clone)]
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
81 pub struct HgMetadata {
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
82 pub st_dev: u64,
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
83 pub st_mode: u32,
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
84 pub st_nlink: u64,
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
85 pub st_size: u64,
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
86 pub st_mtime: i64,
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
87 pub st_ctime: i64,
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
88 }
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
89
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
90 // TODO support other plaforms
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
91 #[cfg(unix)]
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
92 impl HgMetadata {
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
93 pub fn from_metadata(metadata: Metadata) -> Self {
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
94 use std::os::unix::fs::MetadataExt;
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
95 Self {
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
96 st_dev: metadata.dev(),
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
97 st_mode: metadata.mode(),
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
98 st_nlink: metadata.nlink(),
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
99 st_size: metadata.size(),
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
100 st_mtime: metadata.mtime(),
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
101 st_ctime: metadata.ctime(),
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
102 }
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
103 }
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
104 }
99394e6c5d12 rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
105
42586
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
106 #[cfg(test)]
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
107 mod tests {
42960
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42850
diff changeset
108 use super::*;
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42850
diff changeset
109
42586
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
110 #[test]
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
111 fn find_dirs_some() {
42960
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42850
diff changeset
112 let mut dirs = super::find_dirs(HgPath::new(b"foo/bar/baz"));
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42850
diff changeset
113 assert_eq!(dirs.next(), Some(HgPath::new(b"foo/bar")));
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42850
diff changeset
114 assert_eq!(dirs.next(), Some(HgPath::new(b"foo")));
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42850
diff changeset
115 assert_eq!(dirs.next(), Some(HgPath::new(b"")));
42586
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
116 assert_eq!(dirs.next(), None);
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
117 assert_eq!(dirs.next(), None);
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
118 }
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
119
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
120 #[test]
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
121 fn find_dirs_empty() {
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
122 // looks weird, but mercurial.util.finddirs(b"") yields b""
42960
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42850
diff changeset
123 let mut dirs = super::find_dirs(HgPath::new(b""));
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42850
diff changeset
124 assert_eq!(dirs.next(), Some(HgPath::new(b"")));
42586
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
125 assert_eq!(dirs.next(), None);
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
126 assert_eq!(dirs.next(), None);
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
127 }
cad3dde7a573 rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents: 42499
diff changeset
128 }