Mercurial > public > mercurial-scm > hg-stable
annotate rust/hg-core/src/utils/files.rs @ 44420:6329ce04c69f
rust-nodemap: accounting for dead blocks
By the very append-only nature of the `NodeTree`, inserting
new blocks has the effect of making some of the older ones
useless as they become unreachable.
Therefore some automatic housekeeping will need to be provided.
This is standard procedure in the word of databases, under names
such as "repack" or "vacuum".
The new `masked_readonly_blocks()` will provide callers with
useful information to decide if the nodetree is ripe for
repacking, but all the `NodeTree` can provide is how many
blocks have been masked in the currently mutable part. Analysing
the readonly part would be way too long to do it for each
transaction and defeat the whole purpose of nodemap persistence.
Serializing callers (from the Python layer) will get this figure
before each extraction and maintain an aggregate counter of
unreachable blocks separately.
Note: at this point, the most efficient repacking is just to restart
afresh with a full rescan.
Differential Revision: https://phab.mercurial-scm.org/D8097
author | Georges Racinet <georges.racinet@octobus.net> |
---|---|
date | Tue, 18 Feb 2020 19:11:17 +0100 |
parents | 4caac36c66bc |
children | 07d9fd6097e6 |
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 |
44345
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
12 use crate::utils::{ |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
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:
44314
diff
changeset
|
14 path_auditor::PathAuditor, |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
15 replace_slice, |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
16 }; |
44312
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
17 use lazy_static::lazy_static; |
44345
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
18 use same_file::is_same_file; |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
19 use std::borrow::ToOwned; |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
20 use std::fs::Metadata; |
44314
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
21 use std::iter::FusedIterator; |
44345
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
22 use std::ops::Deref; |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
23 use std::path::{Path, PathBuf}; |
42453
9609430d3625
rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
24 |
9609430d3625
rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
25 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
|
26 let os_str; |
9609430d3625
rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
27 #[cfg(unix)] |
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 use std::os::unix::ffi::OsStrExt; |
9609430d3625
rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
30 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
|
31 } |
43250
98d996a138de
rust-cross-platform: remove `unimplemented!` to get compile-time errors
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42960
diff
changeset
|
32 // 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
|
33 // 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
|
34 // 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
|
35 |
9609430d3625
rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
36 Path::new(os_str) |
9609430d3625
rust-filepatterns: use bytes instead of String
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
37 } |
42586
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
38 |
43467
b06cf2809ec3
rust-cpython: do not convert warning pattern to utf-8 bytes
Yuya Nishihara <yuya@tcha.org>
parents:
43271
diff
changeset
|
39 // 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
|
40 // 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
|
41 #[cfg(unix)] |
b06cf2809ec3
rust-cpython: do not convert warning pattern to utf-8 bytes
Yuya Nishihara <yuya@tcha.org>
parents:
43271
diff
changeset
|
42 pub fn get_bytes_from_path(path: impl AsRef<Path>) -> Vec<u8> { |
b06cf2809ec3
rust-cpython: do not convert warning pattern to utf-8 bytes
Yuya Nishihara <yuya@tcha.org>
parents:
43271
diff
changeset
|
43 use std::os::unix::ffi::OsStrExt; |
b06cf2809ec3
rust-cpython: do not convert warning pattern to utf-8 bytes
Yuya Nishihara <yuya@tcha.org>
parents:
43271
diff
changeset
|
44 path.as_ref().as_os_str().as_bytes().to_vec() |
b06cf2809ec3
rust-cpython: do not convert warning pattern to utf-8 bytes
Yuya Nishihara <yuya@tcha.org>
parents:
43271
diff
changeset
|
45 } |
b06cf2809ec3
rust-cpython: do not convert warning pattern to utf-8 bytes
Yuya Nishihara <yuya@tcha.org>
parents:
43271
diff
changeset
|
46 |
42586
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
47 /// 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
|
48 #[derive(Copy, Clone, Debug)] |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
49 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
|
50 next: Option<&'a HgPath>, |
42586
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
51 } |
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 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
|
54 type Item = &'a HgPath; |
42586
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
55 |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
56 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
|
57 let next = self.next; |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
58 self.next = match self.next { |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
59 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
|
60 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
|
61 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
|
62 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
|
63 } |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
64 None => None, |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
65 }; |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
66 next |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
67 } |
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 |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
70 impl<'a> FusedIterator for Ancestors<'a> {} |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
71 |
44314
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
72 /// An iterator over repository path yielding itself and its ancestors. |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
73 #[derive(Copy, Clone, Debug)] |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
74 pub(crate) struct AncestorsWithBase<'a> { |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
75 next: Option<(&'a HgPath, &'a HgPath)>, |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
76 } |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
77 |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
78 impl<'a> Iterator for AncestorsWithBase<'a> { |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
79 type Item = (&'a HgPath, &'a HgPath); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
80 |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
81 fn next(&mut self) -> Option<Self::Item> { |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
82 let next = self.next; |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
83 self.next = match self.next { |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
84 Some((s, _)) if s.is_empty() => None, |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
85 Some((s, _)) => Some(s.split_filename()), |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
86 None => None, |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
87 }; |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
88 next |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
89 } |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
90 } |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
91 |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
92 impl<'a> FusedIterator for AncestorsWithBase<'a> {} |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
93 |
42586
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
94 /// 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
|
95 /// path. |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
96 /// |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
97 /// 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
|
98 /// |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
99 /// 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
|
100 /// directory.) |
42960
7a01778bc7b7
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42850
diff
changeset
|
101 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
|
102 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
|
103 if !path.is_empty() { |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
104 dirs.next(); // skip itself |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
105 } |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
106 dirs |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
107 } |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
108 |
44314
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
109 /// Returns an iterator yielding ancestor directories of the given repository |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
110 /// path. |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
111 /// |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
112 /// The path is separated by '/', and must not start with '/'. |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
113 /// |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
114 /// 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:
44312
diff
changeset
|
115 /// directory.) |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
116 pub(crate) fn find_dirs_with_base<'a>( |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
117 path: &'a HgPath, |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
118 ) -> AncestorsWithBase<'a> { |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
119 let mut dirs = AncestorsWithBase { |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
120 next: Some((path, HgPath::new(b""))), |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
121 }; |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
122 if !path.is_empty() { |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
123 dirs.next(); // skip itself |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
124 } |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
125 dirs |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
126 } |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
127 |
42960
7a01778bc7b7
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42850
diff
changeset
|
128 /// 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
|
129 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
|
130 #[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
|
131 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
|
132 #[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
|
133 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
|
134 } |
b1b984f9c01d
rust-utils: add normalize_case util to mirror Python one
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42767
diff
changeset
|
135 |
44312
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
136 lazy_static! { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
137 static ref IGNORED_CHARS: Vec<Vec<u8>> = { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
138 [ |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
139 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:
43875
diff
changeset
|
140 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:
43875
diff
changeset
|
141 ] |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
142 .iter() |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
143 .map(|code| { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
144 std::char::from_u32(*code) |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
145 .unwrap() |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
146 .encode_utf8(&mut [0; 3]) |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
147 .bytes() |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
148 .collect() |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
149 }) |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
150 .collect() |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
151 }; |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
152 } |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
153 |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
154 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:
43875
diff
changeset
|
155 let mut buf = bytes.to_owned(); |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
156 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:
43875
diff
changeset
|
157 if needs_escaping { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
158 for forbidden in IGNORED_CHARS.iter() { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
159 replace_slice(&mut buf, forbidden, &[]) |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
160 } |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
161 buf |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
162 } else { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
163 buf |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
164 } |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
165 } |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
166 |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
167 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:
43875
diff
changeset
|
168 hfs_ignore_clean(&bytes.to_ascii_lowercase()) |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
169 } |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43875
diff
changeset
|
170 |
43271
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
171 #[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
|
172 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
|
173 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
|
174 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
|
175 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
|
176 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
|
177 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
|
178 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
|
179 } |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
180 |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
181 // 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
|
182 #[cfg(unix)] |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
183 impl HgMetadata { |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
184 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
|
185 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
|
186 Self { |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
187 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
|
188 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
|
189 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
|
190 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
|
191 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
|
192 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
|
193 } |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
194 } |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
195 } |
99394e6c5d12
rust-dirstate-status: add first Rust implementation of `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
196 |
44345
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
197 /// 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:
44314
diff
changeset
|
198 pub fn canonical_path( |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
199 root: impl AsRef<Path>, |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
200 cwd: impl AsRef<Path>, |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
201 name: impl AsRef<Path>, |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
202 ) -> Result<PathBuf, HgPathError> { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
203 // TODO add missing normalization for other platforms |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
204 let root = root.as_ref(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
205 let cwd = cwd.as_ref(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
206 let name = name.as_ref(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
207 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
208 let name = if !name.is_absolute() { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
209 root.join(&cwd).join(&name) |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
210 } else { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
211 name.to_owned() |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
212 }; |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
213 let mut auditor = PathAuditor::new(&root); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
214 if name != root && name.starts_with(&root) { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
215 let name = name.strip_prefix(&root).unwrap(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
216 auditor.audit_path(path_to_hg_path_buf(name)?)?; |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
217 return Ok(name.to_owned()); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
218 } else if name == root { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
219 return Ok("".into()); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
220 } else { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
221 // 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:
44314
diff
changeset
|
222 // 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:
44314
diff
changeset
|
223 // 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:
44314
diff
changeset
|
224 let mut name = name.deref(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
225 let original_name = name.to_owned(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
226 loop { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
227 let same = is_same_file(&name, &root).unwrap_or(false); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
228 if same { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
229 if name == original_name { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
230 // `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:
44314
diff
changeset
|
231 return Ok("".into()); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
232 } |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
233 // `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:
44314
diff
changeset
|
234 // root |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
235 let rel_path = original_name.strip_prefix(&name).unwrap(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
236 auditor.audit_path(path_to_hg_path_buf(&rel_path)?)?; |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
237 return Ok(rel_path.to_owned()); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
238 } |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
239 name = match name.parent() { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
240 None => break, |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
241 Some(p) => p, |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
242 }; |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
243 } |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
244 // TODO hint to the user about using --cwd |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
245 // Bubble up the responsibility to Python for now |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
246 Err(HgPathError::NotUnderRoot { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
247 path: original_name.to_owned(), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
248 root: root.to_owned(), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
249 }) |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
250 } |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
251 } |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
252 |
42586
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
253 #[cfg(test)] |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
254 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
|
255 use super::*; |
44345
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
256 use pretty_assertions::assert_eq; |
42960
7a01778bc7b7
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42850
diff
changeset
|
257 |
42586
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
258 #[test] |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
259 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
|
260 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
|
261 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
|
262 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
|
263 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
|
264 assert_eq!(dirs.next(), None); |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
265 assert_eq!(dirs.next(), None); |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
266 } |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
267 |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
268 #[test] |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
269 fn find_dirs_empty() { |
43677
0b7733719d21
utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents:
43271
diff
changeset
|
270 // looks weird, but mercurial.pathutil.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
|
271 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
|
272 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
|
273 assert_eq!(dirs.next(), None); |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
274 assert_eq!(dirs.next(), None); |
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
275 } |
44314
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
276 |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
277 #[test] |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
278 fn test_find_dirs_with_base_some() { |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
279 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:
44312
diff
changeset
|
280 assert_eq!( |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
281 dirs.next(), |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
282 Some((HgPath::new(b"foo/bar"), HgPath::new(b"baz"))) |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
283 ); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
284 assert_eq!( |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
285 dirs.next(), |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
286 Some((HgPath::new(b"foo"), HgPath::new(b"bar"))) |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
287 ); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
288 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:
44312
diff
changeset
|
289 assert_eq!(dirs.next(), None); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
290 assert_eq!(dirs.next(), None); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
291 } |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
292 |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
293 #[test] |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
294 fn test_find_dirs_with_base_empty() { |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
295 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:
44312
diff
changeset
|
296 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:
44312
diff
changeset
|
297 assert_eq!(dirs.next(), None); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
298 assert_eq!(dirs.next(), None); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44312
diff
changeset
|
299 } |
44345
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
300 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
301 #[test] |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
302 fn test_canonical_path() { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
303 let root = Path::new("/repo"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
304 let cwd = Path::new("/dir"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
305 let name = Path::new("filename"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
306 assert_eq!( |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
307 canonical_path(root, cwd, name), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
308 Err(HgPathError::NotUnderRoot { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
309 path: PathBuf::from("/dir/filename"), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
310 root: root.to_path_buf() |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
311 }) |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
312 ); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
313 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
314 let root = Path::new("/repo"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
315 let cwd = Path::new("/"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
316 let name = Path::new("filename"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
317 assert_eq!( |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
318 canonical_path(root, cwd, name), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
319 Err(HgPathError::NotUnderRoot { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
320 path: PathBuf::from("/filename"), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
321 root: root.to_path_buf() |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
322 }) |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
323 ); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
324 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
325 let root = Path::new("/repo"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
326 let cwd = Path::new("/"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
327 let name = Path::new("repo/filename"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
328 assert_eq!( |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
329 canonical_path(root, cwd, name), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
330 Ok(PathBuf::from("filename")) |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
331 ); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
332 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
333 let root = Path::new("/repo"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
334 let cwd = Path::new("/repo"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
335 let name = Path::new("filename"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
336 assert_eq!( |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
337 canonical_path(root, cwd, name), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
338 Ok(PathBuf::from("filename")) |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
339 ); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
340 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
341 let root = Path::new("/repo"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
342 let cwd = Path::new("/repo/subdir"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
343 let name = Path::new("filename"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
344 assert_eq!( |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
345 canonical_path(root, cwd, name), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
346 Ok(PathBuf::from("subdir/filename")) |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
347 ); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
348 } |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
349 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
350 #[test] |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
351 fn test_canonical_path_not_rooted() { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
352 use std::fs::create_dir; |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
353 use tempfile::tempdir; |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
354 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
355 let base_dir = tempdir().unwrap(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
356 let base_dir_path = base_dir.path(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
357 let beneath_repo = base_dir_path.join("a"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
358 let root = base_dir_path.join("a/b"); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
359 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:
44314
diff
changeset
|
360 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:
44314
diff
changeset
|
361 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
362 create_dir(&beneath_repo).unwrap(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
363 create_dir(&root).unwrap(); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
364 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
365 // TODO make portable |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
366 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:
44314
diff
changeset
|
367 |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
368 assert_eq!( |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
369 canonical_path(&root, Path::new(""), out_of_repo), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
370 Ok(PathBuf::from("")) |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
371 ); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
372 assert_eq!( |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
373 canonical_path(&root, Path::new(""), &beneath_repo), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
374 Err(HgPathError::NotUnderRoot { |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
375 path: beneath_repo.to_owned(), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
376 root: root.to_owned() |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
377 }) |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
378 ); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
379 assert_eq!( |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
380 canonical_path(&root, Path::new(""), &under_repo_symlink), |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
381 Ok(PathBuf::from("d")) |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
382 ); |
4caac36c66bc
rust-utils: add util for canonical path
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44314
diff
changeset
|
383 } |
42586
cad3dde7a573
rust-dirstate: add helper to iterate ancestor paths
Yuya Nishihara <yuya@tcha.org>
parents:
42499
diff
changeset
|
384 } |