Mercurial > public > mercurial-scm > hg
annotate rust/hg-core/src/utils/files.rs @ 52043:e1fe336c007a
rust-repo: don't use on-disk dirstate parents in v1
This mistake was not causing any problems yet since we were never updating
parents from Rust code. This is about to change, so let's fix it.
author | Rapha?l Gom?s <rgomes@octobus.net> |
---|---|
date | Wed, 02 Oct 2024 13:36:51 +0200 |
parents | b55f653a0b34 |
children | 66e34bc44280 |
rev | line source |
---|---|
42751
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 |
44301
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
12 use crate::utils::{ |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
13 hg_path::{path_to_hg_path_buf, HgPath, HgPathBuf, HgPathError}, |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
14 path_auditor::PathAuditor, |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
15 replace_slice, |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
16 }; |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
17 use lazy_static::lazy_static; |
44301
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
18 use same_file::is_same_file; |
47113
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
46775
diff
changeset
|
19 use std::ffi::{OsStr, OsString}; |
44267
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
20 use std::iter::FusedIterator; |
44301
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
21 use std::ops::Deref; |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
22 use std::path::{Path, PathBuf}; |
52030
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
23 use std::{ |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
24 borrow::{Cow, ToOwned}, |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
25 io, |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
26 time::SystemTime, |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
27 }; |
42437
9609430d3625
rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
28 |
46742
91ab5190a3de
rhg: Add support for environment variables in config include paths
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
29 pub fn get_os_str_from_bytes(bytes: &[u8]) -> &OsStr { |
42437
9609430d3625
rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
30 let os_str; |
9609430d3625
rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
31 #[cfg(unix)] |
9609430d3625
rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
32 { |
9609430d3625
rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
33 use std::os::unix::ffi::OsStrExt; |
9609430d3625
rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
34 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
|
35 } |
43250
98d996a138de
rust-cross-platform: remove `unimplemented!` to get compile-time errors
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42957
diff
changeset
|
36 // TODO Handle other platforms |
98d996a138de
rust-cross-platform: remove `unimplemented!` to get compile-time errors
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42957
diff
changeset
|
37 // 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:
42957
diff
changeset
|
38 // Perhaps, the return type would have to be Result<PathBuf>. |
46742
91ab5190a3de
rhg: Add support for environment variables in config include paths
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
39 os_str |
91ab5190a3de
rhg: Add support for environment variables in config include paths
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
40 } |
42437
9609430d3625
rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
41 |
46742
91ab5190a3de
rhg: Add support for environment variables in config include paths
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
42 pub fn get_path_from_bytes(bytes: &[u8]) -> &Path { |
91ab5190a3de
rhg: Add support for environment variables in config include paths
Simon Sapin <simon.sapin@octobus.net>
parents:
46596
diff
changeset
|
43 Path::new(get_os_str_from_bytes(bytes)) |
42437
9609430d3625
rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
44 } |
42586
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
45 |
43868
b06cf2809ec3
rust-cpython: do not convert warning pattern to utf-8 bytes
Yuya Nishihara <yuya@tcha.org>
parents:
43271
diff
changeset
|
46 // TODO: need to convert from WTF8 to MBCS bytes on Windows. |
b06cf2809ec3
rust-cpython: do not convert warning pattern to utf-8 bytes
Yuya Nishihara <yuya@tcha.org>
parents:
43271
diff
changeset
|
47 // that's why Vec<u8> is returned. |
b06cf2809ec3
rust-cpython: do not convert warning pattern to utf-8 bytes
Yuya Nishihara <yuya@tcha.org>
parents:
43271
diff
changeset
|
48 #[cfg(unix)] |
b06cf2809ec3
rust-cpython: do not convert warning pattern to utf-8 bytes
Yuya Nishihara <yuya@tcha.org>
parents:
43271
diff
changeset
|
49 pub fn get_bytes_from_path(path: impl AsRef<Path>) -> Vec<u8> { |
46596
d2e61f00ee9d
rust: Introduce a get_bytes_from_os_str utility function
Simon Sapin <simon.sapin@octobus.net>
parents:
46481
diff
changeset
|
50 get_bytes_from_os_str(path.as_ref()) |
d2e61f00ee9d
rust: Introduce a get_bytes_from_os_str utility function
Simon Sapin <simon.sapin@octobus.net>
parents:
46481
diff
changeset
|
51 } |
d2e61f00ee9d
rust: Introduce a get_bytes_from_os_str utility function
Simon Sapin <simon.sapin@octobus.net>
parents:
46481
diff
changeset
|
52 |
d2e61f00ee9d
rust: Introduce a get_bytes_from_os_str utility function
Simon Sapin <simon.sapin@octobus.net>
parents:
46481
diff
changeset
|
53 #[cfg(unix)] |
d2e61f00ee9d
rust: Introduce a get_bytes_from_os_str utility function
Simon Sapin <simon.sapin@octobus.net>
parents:
46481
diff
changeset
|
54 pub fn get_bytes_from_os_str(str: impl AsRef<OsStr>) -> Vec<u8> { |
43868
b06cf2809ec3
rust-cpython: do not convert warning pattern to utf-8 bytes
Yuya Nishihara <yuya@tcha.org>
parents:
43271
diff
changeset
|
55 use std::os::unix::ffi::OsStrExt; |
46596
d2e61f00ee9d
rust: Introduce a get_bytes_from_os_str utility function
Simon Sapin <simon.sapin@octobus.net>
parents:
46481
diff
changeset
|
56 str.as_ref().as_bytes().to_vec() |
43868
b06cf2809ec3
rust-cpython: do not convert warning pattern to utf-8 bytes
Yuya Nishihara <yuya@tcha.org>
parents:
43271
diff
changeset
|
57 } |
b06cf2809ec3
rust-cpython: do not convert warning pattern to utf-8 bytes
Yuya Nishihara <yuya@tcha.org>
parents:
43271
diff
changeset
|
58 |
47113
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
46775
diff
changeset
|
59 #[cfg(unix)] |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
46775
diff
changeset
|
60 pub fn get_bytes_from_os_string(str: OsString) -> Vec<u8> { |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
46775
diff
changeset
|
61 use std::os::unix::ffi::OsStringExt; |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
46775
diff
changeset
|
62 str.into_vec() |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
46775
diff
changeset
|
63 } |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
46775
diff
changeset
|
64 |
42586
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
65 /// 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:
42484
diff
changeset
|
66 #[derive(Copy, Clone, Debug)] |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
67 pub struct Ancestors<'a> { |
42957
7a01778bc7b7
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42840
diff
changeset
|
68 next: Option<&'a HgPath>, |
42586
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
69 } |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
70 |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
71 impl<'a> Iterator for Ancestors<'a> { |
42957
7a01778bc7b7
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42840
diff
changeset
|
72 type Item = &'a HgPath; |
42586
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
73 |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
74 fn next(&mut self) -> Option<Self::Item> { |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
75 let next = self.next; |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
76 self.next = match self.next { |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
77 Some(s) if s.is_empty() => None, |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
78 Some(s) => { |
42957
7a01778bc7b7
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42840
diff
changeset
|
79 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:
42840
diff
changeset
|
80 Some(HgPath::new(&s.as_bytes()[..p])) |
42586
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
81 } |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
82 None => None, |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
83 }; |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
84 next |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
85 } |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
86 } |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
87 |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
88 impl<'a> FusedIterator for Ancestors<'a> {} |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
89 |
44267
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
90 /// An iterator over repository path yielding itself and its ancestors. |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
91 #[derive(Copy, Clone, Debug)] |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
92 pub(crate) struct AncestorsWithBase<'a> { |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
93 next: Option<(&'a HgPath, &'a HgPath)>, |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
94 } |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
95 |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
96 impl<'a> Iterator for AncestorsWithBase<'a> { |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
97 type Item = (&'a HgPath, &'a HgPath); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
98 |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
99 fn next(&mut self) -> Option<Self::Item> { |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
100 let next = self.next; |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
101 self.next = match self.next { |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
102 Some((s, _)) if s.is_empty() => None, |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
103 Some((s, _)) => Some(s.split_filename()), |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
104 None => None, |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
105 }; |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
106 next |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
107 } |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
108 } |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
109 |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
110 impl<'a> FusedIterator for AncestorsWithBase<'a> {} |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
111 |
42586
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
112 /// 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:
42484
diff
changeset
|
113 /// path. |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
114 /// |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
115 /// 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:
42484
diff
changeset
|
116 /// |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
117 /// 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:
42484
diff
changeset
|
118 /// directory.) |
44973
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44535
diff
changeset
|
119 pub fn find_dirs(path: &HgPath) -> Ancestors { |
42586
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
120 let mut dirs = Ancestors { next: Some(path) }; |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
121 if !path.is_empty() { |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
122 dirs.next(); // skip itself |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
123 } |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
124 dirs |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
125 } |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
126 |
51563
529a655874fb
matchers: fix the bug in rust PatternMatcher that made it cut off early
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51117
diff
changeset
|
127 pub fn dir_ancestors(path: &HgPath) -> Ancestors { |
529a655874fb
matchers: fix the bug in rust PatternMatcher that made it cut off early
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51117
diff
changeset
|
128 Ancestors { next: Some(path) } |
529a655874fb
matchers: fix the bug in rust PatternMatcher that made it cut off early
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51117
diff
changeset
|
129 } |
529a655874fb
matchers: fix the bug in rust PatternMatcher that made it cut off early
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51117
diff
changeset
|
130 |
44267
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
131 /// Returns an iterator yielding ancestor directories of the given repository |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
132 /// path. |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
133 /// |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
134 /// The path is separated by '/', and must not start with '/'. |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
135 /// |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
136 /// The path itself isn't included unless it is b"" (meaning the root |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
137 /// directory.) |
44973
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44535
diff
changeset
|
138 pub(crate) fn find_dirs_with_base(path: &HgPath) -> AncestorsWithBase { |
44267
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
139 let mut dirs = AncestorsWithBase { |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
140 next: Some((path, HgPath::new(b""))), |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
141 }; |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
142 if !path.is_empty() { |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
143 dirs.next(); // skip itself |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
144 } |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
145 dirs |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
146 } |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
147 |
42957
7a01778bc7b7
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42840
diff
changeset
|
148 /// TODO more than ASCII? |
7a01778bc7b7
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42840
diff
changeset
|
149 pub fn normalize_case(path: &HgPath) -> HgPathBuf { |
42840
b1b984f9c01d
rust-utils: add normalize_case util to mirror Python one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42751
diff
changeset
|
150 #[cfg(windows)] // NTFS compares via upper() |
42957
7a01778bc7b7
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42840
diff
changeset
|
151 return path.to_ascii_uppercase(); |
42840
b1b984f9c01d
rust-utils: add normalize_case util to mirror Python one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42751
diff
changeset
|
152 #[cfg(unix)] |
42957
7a01778bc7b7
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42840
diff
changeset
|
153 path.to_ascii_lowercase() |
42840
b1b984f9c01d
rust-utils: add normalize_case util to mirror Python one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42751
diff
changeset
|
154 } |
b1b984f9c01d
rust-utils: add normalize_case util to mirror Python one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42751
diff
changeset
|
155 |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
156 lazy_static! { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
157 static ref IGNORED_CHARS: Vec<Vec<u8>> = { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
158 [ |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
159 0x200c, 0x200d, 0x200e, 0x200f, 0x202a, 0x202b, 0x202c, 0x202d, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
160 0x202e, 0x206a, 0x206b, 0x206c, 0x206d, 0x206e, 0x206f, 0xfeff, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
161 ] |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
162 .iter() |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
163 .map(|code| { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
164 std::char::from_u32(*code) |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
165 .unwrap() |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
166 .encode_utf8(&mut [0; 3]) |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
167 .bytes() |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
168 .collect() |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
169 }) |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
170 .collect() |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
171 }; |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
172 } |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
173 |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
174 fn hfs_ignore_clean(bytes: &[u8]) -> Vec<u8> { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
175 let mut buf = bytes.to_owned(); |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
176 let needs_escaping = bytes.iter().any(|b| *b == b'\xe2' || *b == b'\xef'); |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
177 if needs_escaping { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
178 for forbidden in IGNORED_CHARS.iter() { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
179 replace_slice(&mut buf, forbidden, &[]) |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
180 } |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
181 buf |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
182 } else { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
183 buf |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
184 } |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
185 } |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
186 |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
187 pub fn lower_clean(bytes: &[u8]) -> Vec<u8> { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
188 hfs_ignore_clean(&bytes.to_ascii_lowercase()) |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
189 } |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43869
diff
changeset
|
190 |
44301
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
191 /// Returns the canonical path of `name`, given `cwd` and `root` |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
192 pub fn canonical_path( |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
193 root: impl AsRef<Path>, |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
194 cwd: impl AsRef<Path>, |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
195 name: impl AsRef<Path>, |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
196 ) -> Result<PathBuf, HgPathError> { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
197 // TODO add missing normalization for other platforms |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
198 let root = root.as_ref(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
199 let cwd = cwd.as_ref(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
200 let name = name.as_ref(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
201 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
202 let name = if !name.is_absolute() { |
51117
532e74ad3ff6
rust: run a clippy pass with the latest stable version
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49930
diff
changeset
|
203 root.join(cwd).join(name) |
44301
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
204 } else { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
205 name.to_owned() |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
206 }; |
51117
532e74ad3ff6
rust: run a clippy pass with the latest stable version
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49930
diff
changeset
|
207 let auditor = PathAuditor::new(root); |
532e74ad3ff6
rust: run a clippy pass with the latest stable version
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49930
diff
changeset
|
208 if name != root && name.starts_with(root) { |
532e74ad3ff6
rust: run a clippy pass with the latest stable version
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49930
diff
changeset
|
209 let name = name.strip_prefix(root).unwrap(); |
44301
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
210 auditor.audit_path(path_to_hg_path_buf(name)?)?; |
44973
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44535
diff
changeset
|
211 Ok(name.to_owned()) |
44301
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
212 } else if name == root { |
44973
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44535
diff
changeset
|
213 Ok("".into()) |
44301
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
214 } else { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
215 // Determine whether `name' is in the hierarchy at or beneath `root', |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
216 // by iterating name=name.parent() until it returns `None` (can't |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
217 // check name == '/', because that doesn't work on windows). |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
218 let mut name = name.deref(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
219 let original_name = name.to_owned(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
220 loop { |
51117
532e74ad3ff6
rust: run a clippy pass with the latest stable version
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49930
diff
changeset
|
221 let same = is_same_file(name, root).unwrap_or(false); |
44301
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
222 if same { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
223 if name == original_name { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
224 // `name` was actually the same as root (maybe a symlink) |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
225 return Ok("".into()); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
226 } |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
227 // `name` is a symlink to root, so `original_name` is under |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
228 // root |
51117
532e74ad3ff6
rust: run a clippy pass with the latest stable version
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49930
diff
changeset
|
229 let rel_path = original_name.strip_prefix(name).unwrap(); |
532e74ad3ff6
rust: run a clippy pass with the latest stable version
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49930
diff
changeset
|
230 auditor.audit_path(path_to_hg_path_buf(rel_path)?)?; |
44301
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
231 return Ok(rel_path.to_owned()); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
232 } |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
233 name = match name.parent() { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
234 None => break, |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
235 Some(p) => p, |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
236 }; |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
237 } |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
238 // TODO hint to the user about using --cwd |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
239 // Bubble up the responsibility to Python for now |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
240 Err(HgPathError::NotUnderRoot { |
49930
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48082
diff
changeset
|
241 path: original_name, |
44301
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
242 root: root.to_owned(), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
243 }) |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
244 } |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
245 } |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
246 |
45436
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
247 /// Returns the representation of the path relative to the current working |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
248 /// directory for display purposes. |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
249 /// |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
250 /// `cwd` is a `HgPath`, so it is considered relative to the root directory |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
251 /// of the repository. |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
252 /// |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
253 /// # Examples |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
254 /// |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
255 /// ``` |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
256 /// use hg::utils::hg_path::HgPath; |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
257 /// use hg::utils::files::relativize_path; |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
258 /// use std::borrow::Cow; |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
259 /// |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
260 /// let file = HgPath::new(b"nested/file"); |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
261 /// let cwd = HgPath::new(b""); |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
262 /// assert_eq!(relativize_path(file, cwd), Cow::Borrowed(b"nested/file")); |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
263 /// |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
264 /// let cwd = HgPath::new(b"nested"); |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
265 /// assert_eq!(relativize_path(file, cwd), Cow::Borrowed(b"file")); |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
266 /// |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
267 /// let cwd = HgPath::new(b"other"); |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
268 /// assert_eq!(relativize_path(file, cwd), Cow::Borrowed(b"../nested/file")); |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
269 /// ``` |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
270 pub fn relativize_path(path: &HgPath, cwd: impl AsRef<HgPath>) -> Cow<[u8]> { |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
271 if cwd.as_ref().is_empty() { |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
272 Cow::Borrowed(path.as_bytes()) |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
273 } else { |
46775
c94fa884240b
rust: Preallocate the returned `Vec` in `utils::files::relativize_path`
Simon Sapin <simon.sapin@octobus.net>
parents:
46757
diff
changeset
|
274 // This is not all accurate as to how large `res` will actually be, but |
c94fa884240b
rust: Preallocate the returned `Vec` in `utils::files::relativize_path`
Simon Sapin <simon.sapin@octobus.net>
parents:
46757
diff
changeset
|
275 // profiling `rhg files` on a large-ish repo shows it’s better than |
c94fa884240b
rust: Preallocate the returned `Vec` in `utils::files::relativize_path`
Simon Sapin <simon.sapin@octobus.net>
parents:
46757
diff
changeset
|
276 // starting from a zero-capacity `Vec` and letting `extend` reallocate |
c94fa884240b
rust: Preallocate the returned `Vec` in `utils::files::relativize_path`
Simon Sapin <simon.sapin@octobus.net>
parents:
46757
diff
changeset
|
277 // repeatedly. |
c94fa884240b
rust: Preallocate the returned `Vec` in `utils::files::relativize_path`
Simon Sapin <simon.sapin@octobus.net>
parents:
46757
diff
changeset
|
278 let guesstimate = path.as_bytes().len(); |
c94fa884240b
rust: Preallocate the returned `Vec` in `utils::files::relativize_path`
Simon Sapin <simon.sapin@octobus.net>
parents:
46757
diff
changeset
|
279 |
c94fa884240b
rust: Preallocate the returned `Vec` in `utils::files::relativize_path`
Simon Sapin <simon.sapin@octobus.net>
parents:
46757
diff
changeset
|
280 let mut res: Vec<u8> = Vec::with_capacity(guesstimate); |
45436
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
281 let mut path_iter = path.as_bytes().split(|b| *b == b'/').peekable(); |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
282 let mut cwd_iter = |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
283 cwd.as_ref().as_bytes().split(|b| *b == b'/').peekable(); |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
284 loop { |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
285 match (path_iter.peek(), cwd_iter.peek()) { |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
286 (Some(a), Some(b)) if a == b => (), |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
287 _ => break, |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
288 } |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
289 path_iter.next(); |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
290 cwd_iter.next(); |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
291 } |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
292 let mut need_sep = false; |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
293 for _ in cwd_iter { |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
294 if need_sep { |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
295 res.extend(b"/") |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
296 } else { |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
297 need_sep = true |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
298 }; |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
299 res.extend(b".."); |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
300 } |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
301 for c in path_iter { |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
302 if need_sep { |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
303 res.extend(b"/") |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
304 } else { |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
305 need_sep = true |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
306 }; |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
307 res.extend(c); |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
308 } |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
309 Cow::Owned(res) |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
310 } |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
311 } |
1b3197047f5c
rhg: make output of `files` relative to the current directory and the root
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44973
diff
changeset
|
312 |
52030
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
313 /// Return the `mtime` of a temporary file newly-created in the `.hg` directory |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
314 /// of the give repository. |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
315 /// |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
316 /// This is similar to `SystemTime::now()`, with the result truncated to the |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
317 /// same time resolution as other files’ modification times. Using `.hg` |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
318 /// instead of the system’s default temporary directory (such as `/tmp`) makes |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
319 /// it more likely the temporary file is in the same disk partition as contents |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
320 /// of the working directory, which can matter since different filesystems may |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
321 /// store timestamps with different resolutions. |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
322 /// |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
323 /// This may fail, typically if we lack write permissions. In that case we |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
324 /// should continue the `status()` algoritm anyway and consider the current |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
325 /// date/time to be unknown. |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
326 pub fn filesystem_now(repo_root: &Path) -> Result<SystemTime, io::Error> { |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
327 tempfile::tempfile_in(repo_root.join(".hg"))? |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
328 .metadata()? |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
329 .modified() |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
330 } |
b55f653a0b34
rust-utils: move the `filesystem_now` function to a util
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51563
diff
changeset
|
331 |
42586
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
332 #[cfg(test)] |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
333 mod tests { |
42957
7a01778bc7b7
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42840
diff
changeset
|
334 use super::*; |
44301
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
335 use pretty_assertions::assert_eq; |
42957
7a01778bc7b7
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42840
diff
changeset
|
336 |
42586
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
337 #[test] |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
338 fn find_dirs_some() { |
42957
7a01778bc7b7
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42840
diff
changeset
|
339 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:
42840
diff
changeset
|
340 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:
42840
diff
changeset
|
341 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:
42840
diff
changeset
|
342 assert_eq!(dirs.next(), Some(HgPath::new(b""))); |
42586
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
343 assert_eq!(dirs.next(), None); |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
344 assert_eq!(dirs.next(), None); |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
345 } |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
346 |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
347 #[test] |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
348 fn find_dirs_empty() { |
43633
0b7733719d21
utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents:
43271
diff
changeset
|
349 // looks weird, but mercurial.pathutil.finddirs(b"") yields b"" |
42957
7a01778bc7b7
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42840
diff
changeset
|
350 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:
42840
diff
changeset
|
351 assert_eq!(dirs.next(), Some(HgPath::new(b""))); |
42586
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
352 assert_eq!(dirs.next(), None); |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
353 assert_eq!(dirs.next(), None); |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
354 } |
44267
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
355 |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
356 #[test] |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
357 fn test_find_dirs_with_base_some() { |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
358 let mut dirs = super::find_dirs_with_base(HgPath::new(b"foo/bar/baz")); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
359 assert_eq!( |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
360 dirs.next(), |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
361 Some((HgPath::new(b"foo/bar"), HgPath::new(b"baz"))) |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
362 ); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
363 assert_eq!( |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
364 dirs.next(), |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
365 Some((HgPath::new(b"foo"), HgPath::new(b"bar"))) |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
366 ); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
367 assert_eq!(dirs.next(), Some((HgPath::new(b""), HgPath::new(b"foo")))); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
368 assert_eq!(dirs.next(), None); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
369 assert_eq!(dirs.next(), None); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
370 } |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
371 |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
372 #[test] |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
373 fn test_find_dirs_with_base_empty() { |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
374 let mut dirs = super::find_dirs_with_base(HgPath::new(b"")); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
375 assert_eq!(dirs.next(), Some((HgPath::new(b""), HgPath::new(b"")))); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
376 assert_eq!(dirs.next(), None); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
377 assert_eq!(dirs.next(), None); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
378 } |
44301
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
379 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
380 #[test] |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
381 fn test_canonical_path() { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
382 let root = Path::new("/repo"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
383 let cwd = Path::new("/dir"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
384 let name = Path::new("filename"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
385 assert_eq!( |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
386 canonical_path(root, cwd, name), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
387 Err(HgPathError::NotUnderRoot { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
388 path: PathBuf::from("/dir/filename"), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
389 root: root.to_path_buf() |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
390 }) |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
391 ); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
392 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
393 let root = Path::new("/repo"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
394 let cwd = Path::new("/"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
395 let name = Path::new("filename"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
396 assert_eq!( |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
397 canonical_path(root, cwd, name), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
398 Err(HgPathError::NotUnderRoot { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
399 path: PathBuf::from("/filename"), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
400 root: root.to_path_buf() |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
401 }) |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
402 ); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
403 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
404 let root = Path::new("/repo"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
405 let cwd = Path::new("/"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
406 let name = Path::new("repo/filename"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
407 assert_eq!( |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
408 canonical_path(root, cwd, name), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
409 Ok(PathBuf::from("filename")) |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
410 ); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
411 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
412 let root = Path::new("/repo"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
413 let cwd = Path::new("/repo"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
414 let name = Path::new("filename"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
415 assert_eq!( |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
416 canonical_path(root, cwd, name), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
417 Ok(PathBuf::from("filename")) |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
418 ); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
419 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
420 let root = Path::new("/repo"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
421 let cwd = Path::new("/repo/subdir"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
422 let name = Path::new("filename"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
423 assert_eq!( |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
424 canonical_path(root, cwd, name), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
425 Ok(PathBuf::from("subdir/filename")) |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
426 ); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
427 } |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
428 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
429 #[test] |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
430 fn test_canonical_path_not_rooted() { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
431 use std::fs::create_dir; |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
432 use tempfile::tempdir; |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
433 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
434 let base_dir = tempdir().unwrap(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
435 let base_dir_path = base_dir.path(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
436 let beneath_repo = base_dir_path.join("a"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
437 let root = base_dir_path.join("a/b"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
438 let out_of_repo = base_dir_path.join("c"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
439 let under_repo_symlink = out_of_repo.join("d"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
440 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
441 create_dir(&beneath_repo).unwrap(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
442 create_dir(&root).unwrap(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
443 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
444 // TODO make portable |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
445 std::os::unix::fs::symlink(&root, &out_of_repo).unwrap(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
446 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
447 assert_eq!( |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
448 canonical_path(&root, Path::new(""), out_of_repo), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
449 Ok(PathBuf::from("")) |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
450 ); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
451 assert_eq!( |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
452 canonical_path(&root, Path::new(""), &beneath_repo), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
453 Err(HgPathError::NotUnderRoot { |
49930
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48082
diff
changeset
|
454 path: beneath_repo, |
44301
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
455 root: root.to_owned() |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
456 }) |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
457 ); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
458 assert_eq!( |
51117
532e74ad3ff6
rust: run a clippy pass with the latest stable version
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49930
diff
changeset
|
459 canonical_path(&root, Path::new(""), under_repo_symlink), |
44301
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
460 Ok(PathBuf::from("d")) |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
461 ); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
462 } |
42586
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42484
diff
changeset
|
463 } |