Mercurial > public > mercurial-scm > hg
annotate rust/hg-core/src/utils/hg_path.rs @ 47113:be579775c2d9
dirstate-tree: Add the new `status()` algorithm
With the dirstate organized in a tree that mirrors the structure of the
filesystem tree, we can traverse both trees at the same time in order to
compare them. This is hopefully more efficient that building multiple
big hashmaps for all of the repository?s contents.
Differential Revision: https://phab.mercurial-scm.org/D10547
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Fri, 16 Apr 2021 12:12:41 +0200 |
parents | 3da19db33cbc |
children | 1249eb9cc332 |
rev | line source |
---|---|
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
1 // hg_path.rs |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
2 // |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
3 // Copyright 2019 Raphaël Gomès <rgomes@octobus.net> |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
4 // |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
5 // This software may be used and distributed according to the terms of the |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
6 // GNU General Public License version 2 or any later version. |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
7 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
8 use std::borrow::Borrow; |
47113
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
9 use std::borrow::Cow; |
45538
2d5dfc8fed55
hg-core: impl TryFrom<PathBuff> for HgPathBuf
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44973
diff
changeset
|
10 use std::convert::TryFrom; |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
11 use std::ffi::{OsStr, OsString}; |
43827
c27e688fcdc3
rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
12 use std::fmt; |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
13 use std::ops::Deref; |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
14 use std::path::{Path, PathBuf}; |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
15 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
16 #[derive(Debug, Eq, PartialEq)] |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
17 pub enum HgPathError { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
18 /// Bytes from the invalid `HgPath` |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
19 LeadingSlash(Vec<u8>), |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
20 ConsecutiveSlashes { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
21 bytes: Vec<u8>, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
22 second_slash_index: usize, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
23 }, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
24 ContainsNullByte { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
25 bytes: Vec<u8>, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
26 null_byte_index: usize, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
27 }, |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
28 /// Bytes |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
29 DecodeError(Vec<u8>), |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
30 /// The rest come from audit errors |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
31 EndsWithSlash(HgPathBuf), |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
32 ContainsIllegalComponent(HgPathBuf), |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
33 /// Path is inside the `.hg` folder |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
34 InsideDotHg(HgPathBuf), |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
35 IsInsideNestedRepo { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
36 path: HgPathBuf, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
37 nested_repo: HgPathBuf, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
38 }, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
39 TraversesSymbolicLink { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
40 path: HgPathBuf, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
41 symlink: HgPathBuf, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
42 }, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
43 NotFsCompliant(HgPathBuf), |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
44 /// `path` is the smallest invalid path |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
45 NotUnderRoot { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
46 path: PathBuf, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
47 root: PathBuf, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
48 }, |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
49 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
50 |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
51 impl fmt::Display for HgPathError { |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
52 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
53 match self { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
54 HgPathError::LeadingSlash(bytes) => { |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
55 write!(f, "Invalid HgPath '{:?}': has a leading slash.", bytes) |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
56 } |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
57 HgPathError::ConsecutiveSlashes { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
58 bytes, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
59 second_slash_index: pos, |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
60 } => write!( |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
61 f, |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
62 "Invalid HgPath '{:?}': consecutive slashes at pos {}.", |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
63 bytes, pos |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
64 ), |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
65 HgPathError::ContainsNullByte { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
66 bytes, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
67 null_byte_index: pos, |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
68 } => write!( |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
69 f, |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
70 "Invalid HgPath '{:?}': contains null byte at pos {}.", |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
71 bytes, pos |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
72 ), |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
73 HgPathError::DecodeError(bytes) => write!( |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
74 f, |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
75 "Invalid HgPath '{:?}': could not be decoded.", |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
76 bytes |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
77 ), |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
78 HgPathError::EndsWithSlash(path) => { |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
79 write!(f, "Audit failed for '{}': ends with a slash.", path) |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
80 } |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
81 HgPathError::ContainsIllegalComponent(path) => write!( |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
82 f, |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
83 "Audit failed for '{}': contains an illegal component.", |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
84 path |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
85 ), |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
86 HgPathError::InsideDotHg(path) => write!( |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
87 f, |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
88 "Audit failed for '{}': is inside the '.hg' folder.", |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
89 path |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
90 ), |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
91 HgPathError::IsInsideNestedRepo { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
92 path, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
93 nested_repo: nested, |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
94 } => { |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
95 write!(f, |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
96 "Audit failed for '{}': is inside a nested repository '{}'.", |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
97 path, nested |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
98 ) |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
99 } |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
100 HgPathError::TraversesSymbolicLink { path, symlink } => write!( |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
101 f, |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
102 "Audit failed for '{}': traverses symbolic link '{}'.", |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
103 path, symlink |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
104 ), |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
105 HgPathError::NotFsCompliant(path) => write!( |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
106 f, |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
107 "Audit failed for '{}': cannot be turned into a \ |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
108 filesystem path.", |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
109 path |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
110 ), |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
111 HgPathError::NotUnderRoot { path, root } => write!( |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
112 f, |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
113 "Audit failed for '{}': not under root {}.", |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
114 path.display(), |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
115 root.display() |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
116 ), |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
117 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
118 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
119 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
120 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
121 impl From<HgPathError> for std::io::Error { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
122 fn from(e: HgPathError) -> Self { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
123 std::io::Error::new(std::io::ErrorKind::InvalidData, e.to_string()) |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
124 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
125 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
126 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
127 /// This is a repository-relative path (or canonical path): |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
128 /// - no null characters |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
129 /// - `/` separates directories |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
130 /// - no consecutive slashes |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
131 /// - no leading slash, |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
132 /// - no `.` nor `..` of special meaning |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
133 /// - stored in repository and shared across platforms |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
134 /// |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
135 /// Note: there is no guarantee of any `HgPath` being well-formed at any point |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
136 /// in its lifetime for performance reasons and to ease ergonomics. It is |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
137 /// however checked using the `check_state` method before any file-system |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
138 /// operation. |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
139 /// |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
140 /// This allows us to be encoding-transparent as much as possible, until really |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
141 /// needed; `HgPath` can be transformed into a platform-specific path (`OsStr` |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
142 /// or `Path`) whenever more complex operations are needed: |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
143 /// On Unix, it's just byte-to-byte conversion. On Windows, it has to be |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
144 /// decoded from MBCS to WTF-8. If WindowsUTF8Plan is implemented, the source |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
145 /// character encoding will be determined on a per-repository basis. |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
146 // |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
147 // FIXME: (adapted from a comment in the stdlib) |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
148 // `HgPath::new()` current implementation relies on `Slice` being |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
149 // layout-compatible with `[u8]`. |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
150 // When attribute privacy is implemented, `Slice` should be annotated as |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
151 // `#[repr(transparent)]`. |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
152 // Anyway, `Slice` representation and layout are considered implementation |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
153 // detail, are not documented and must not be relied upon. |
43908
4b3c8df189bc
rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents:
43833
diff
changeset
|
154 #[derive(Eq, Ord, PartialEq, PartialOrd, Hash)] |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
155 pub struct HgPath { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
156 inner: [u8], |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
157 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
158 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
159 impl HgPath { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
160 pub fn new<S: AsRef<[u8]> + ?Sized>(s: &S) -> &Self { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
161 unsafe { &*(s.as_ref() as *const [u8] as *const Self) } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
162 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
163 pub fn is_empty(&self) -> bool { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
164 self.inner.is_empty() |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
165 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
166 pub fn len(&self) -> usize { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
167 self.inner.len() |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
168 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
169 fn to_hg_path_buf(&self) -> HgPathBuf { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
170 HgPathBuf { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
171 inner: self.inner.to_owned(), |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
172 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
173 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
174 pub fn bytes(&self) -> std::slice::Iter<u8> { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
175 self.inner.iter() |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
176 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
177 pub fn to_ascii_uppercase(&self) -> HgPathBuf { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
178 HgPathBuf::from(self.inner.to_ascii_uppercase()) |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
179 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
180 pub fn to_ascii_lowercase(&self) -> HgPathBuf { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
181 HgPathBuf::from(self.inner.to_ascii_lowercase()) |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
182 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
183 pub fn as_bytes(&self) -> &[u8] { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
184 &self.inner |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
185 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
186 pub fn contains(&self, other: u8) -> bool { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
187 self.inner.contains(&other) |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
188 } |
44266
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
189 pub fn starts_with(&self, needle: impl AsRef<Self>) -> bool { |
43833
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
190 self.inner.starts_with(needle.as_ref().as_bytes()) |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
191 } |
44266
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
192 pub fn trim_trailing_slash(&self) -> &Self { |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
193 Self::new(if self.inner.last() == Some(&b'/') { |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
194 &self.inner[..self.inner.len() - 1] |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
195 } else { |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
196 &self.inner[..] |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
197 }) |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
198 } |
44267
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
199 /// Returns a tuple of slices `(base, filename)` resulting from the split |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
200 /// at the rightmost `/`, if any. |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
201 /// |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
202 /// # Examples: |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
203 /// |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
204 /// ``` |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
205 /// use hg::utils::hg_path::HgPath; |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
206 /// |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
207 /// let path = HgPath::new(b"cool/hg/path").split_filename(); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
208 /// assert_eq!(path, (HgPath::new(b"cool/hg"), HgPath::new(b"path"))); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
209 /// |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
210 /// let path = HgPath::new(b"pathwithoutsep").split_filename(); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
211 /// assert_eq!(path, (HgPath::new(b""), HgPath::new(b"pathwithoutsep"))); |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
212 /// ``` |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
213 pub fn split_filename(&self) -> (&Self, &Self) { |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
214 match &self.inner.iter().rposition(|c| *c == b'/') { |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
215 None => (HgPath::new(""), &self), |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
216 Some(size) => ( |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
217 HgPath::new(&self.inner[..*size]), |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
218 HgPath::new(&self.inner[*size + 1..]), |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
219 ), |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
220 } |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
221 } |
44266
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
222 pub fn join<T: ?Sized + AsRef<Self>>(&self, other: &T) -> HgPathBuf { |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
223 let mut inner = self.inner.to_owned(); |
44973
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
224 if !inner.is_empty() && inner.last() != Some(&b'/') { |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
225 inner.push(b'/'); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
226 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
227 inner.extend(other.as_ref().bytes()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
228 HgPathBuf::from_bytes(&inner) |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
229 } |
47099
3da19db33cbc
dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents:
46444
diff
changeset
|
230 |
3da19db33cbc
dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents:
46444
diff
changeset
|
231 pub fn components(&self) -> impl Iterator<Item = &HgPath> { |
3da19db33cbc
dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents:
46444
diff
changeset
|
232 self.inner.split(|&byte| byte == b'/').map(HgPath::new) |
3da19db33cbc
dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents:
46444
diff
changeset
|
233 } |
3da19db33cbc
dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents:
46444
diff
changeset
|
234 |
44266
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
235 pub fn parent(&self) -> &Self { |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
236 let inner = self.as_bytes(); |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
237 HgPath::new(match inner.iter().rposition(|b| *b == b'/') { |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
238 Some(pos) => &inner[..pos], |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
239 None => &[], |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
240 }) |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
241 } |
43833
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
242 /// Given a base directory, returns the slice of `self` relative to the |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
243 /// base directory. If `base` is not a directory (does not end with a |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
244 /// `b'/'`), returns `None`. |
44266
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
245 pub fn relative_to(&self, base: impl AsRef<Self>) -> Option<&Self> { |
43833
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
246 let base = base.as_ref(); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
247 if base.is_empty() { |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
248 return Some(self); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
249 } |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
250 let is_dir = base.as_bytes().ends_with(b"/"); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
251 if is_dir && self.starts_with(base) { |
44266
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
252 Some(Self::new(&self.inner[base.len()..])) |
43833
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
253 } else { |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
254 None |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
255 } |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
256 } |
44136
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
257 |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
258 #[cfg(windows)] |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
259 /// Copied from the Python stdlib's `os.path.splitdrive` implementation. |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
260 /// |
44191
732098027b34
rust: re-format with nightly rustfmt
Martin von Zweigbergk <martinvonz@google.com>
parents:
44136
diff
changeset
|
261 /// Split a pathname into drive/UNC sharepoint and relative path |
732098027b34
rust: re-format with nightly rustfmt
Martin von Zweigbergk <martinvonz@google.com>
parents:
44136
diff
changeset
|
262 /// specifiers. Returns a 2-tuple (drive_or_unc, path); either part may |
732098027b34
rust: re-format with nightly rustfmt
Martin von Zweigbergk <martinvonz@google.com>
parents:
44136
diff
changeset
|
263 /// be empty. |
44136
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
264 /// |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
265 /// If you assign |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
266 /// result = split_drive(p) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
267 /// It is always true that: |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
268 /// result[0] + result[1] == p |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
269 /// |
44191
732098027b34
rust: re-format with nightly rustfmt
Martin von Zweigbergk <martinvonz@google.com>
parents:
44136
diff
changeset
|
270 /// If the path contained a drive letter, drive_or_unc will contain |
732098027b34
rust: re-format with nightly rustfmt
Martin von Zweigbergk <martinvonz@google.com>
parents:
44136
diff
changeset
|
271 /// everything up to and including the colon. |
44136
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
272 /// e.g. split_drive("c:/dir") returns ("c:", "/dir") |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
273 /// |
44191
732098027b34
rust: re-format with nightly rustfmt
Martin von Zweigbergk <martinvonz@google.com>
parents:
44136
diff
changeset
|
274 /// If the path contained a UNC path, the drive_or_unc will contain the |
732098027b34
rust: re-format with nightly rustfmt
Martin von Zweigbergk <martinvonz@google.com>
parents:
44136
diff
changeset
|
275 /// host name and share up to but not including the fourth directory |
732098027b34
rust: re-format with nightly rustfmt
Martin von Zweigbergk <martinvonz@google.com>
parents:
44136
diff
changeset
|
276 /// separator character. |
732098027b34
rust: re-format with nightly rustfmt
Martin von Zweigbergk <martinvonz@google.com>
parents:
44136
diff
changeset
|
277 /// e.g. split_drive("//host/computer/dir") returns ("//host/computer", |
732098027b34
rust: re-format with nightly rustfmt
Martin von Zweigbergk <martinvonz@google.com>
parents:
44136
diff
changeset
|
278 /// "/dir") |
44136
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
279 /// |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
280 /// Paths cannot contain both a drive letter and a UNC path. |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
281 pub fn split_drive<'a>(&self) -> (&HgPath, &HgPath) { |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
282 let bytes = self.as_bytes(); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
283 let is_sep = |b| std::path::is_separator(b as char); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
284 |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
285 if self.len() < 2 { |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
286 (HgPath::new(b""), &self) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
287 } else if is_sep(bytes[0]) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
288 && is_sep(bytes[1]) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
289 && (self.len() == 2 || !is_sep(bytes[2])) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
290 { |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
291 // Is a UNC path: |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
292 // vvvvvvvvvvvvvvvvvvvv drive letter or UNC path |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
293 // \\machine\mountpoint\directory\etc\... |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
294 // directory ^^^^^^^^^^^^^^^ |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
295 |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
296 let machine_end_index = bytes[2..].iter().position(|b| is_sep(*b)); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
297 let mountpoint_start_index = if let Some(i) = machine_end_index { |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
298 i + 2 |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
299 } else { |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
300 return (HgPath::new(b""), &self); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
301 }; |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
302 |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
303 match bytes[mountpoint_start_index + 1..] |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
304 .iter() |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
305 .position(|b| is_sep(*b)) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
306 { |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
307 // A UNC path can't have two slashes in a row |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
308 // (after the initial two) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
309 Some(0) => (HgPath::new(b""), &self), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
310 Some(i) => { |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
311 let (a, b) = |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
312 bytes.split_at(mountpoint_start_index + 1 + i); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
313 (HgPath::new(a), HgPath::new(b)) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
314 } |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
315 None => (&self, HgPath::new(b"")), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
316 } |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
317 } else if bytes[1] == b':' { |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
318 // Drive path c:\directory |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
319 let (a, b) = bytes.split_at(2); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
320 (HgPath::new(a), HgPath::new(b)) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
321 } else { |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
322 (HgPath::new(b""), &self) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
323 } |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
324 } |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
325 |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
326 #[cfg(unix)] |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
327 /// Split a pathname into drive and path. On Posix, drive is always empty. |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
328 pub fn split_drive(&self) -> (&HgPath, &HgPath) { |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
329 (HgPath::new(b""), &self) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
330 } |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
331 |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
332 /// Checks for errors in the path, short-circuiting at the first one. |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
333 /// This generates fine-grained errors useful for debugging. |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
334 /// To simply check if the path is valid during tests, use `is_valid`. |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
335 pub fn check_state(&self) -> Result<(), HgPathError> { |
44973
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
336 if self.is_empty() { |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
337 return Ok(()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
338 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
339 let bytes = self.as_bytes(); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
340 let mut previous_byte = None; |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
341 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
342 if bytes[0] == b'/' { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
343 return Err(HgPathError::LeadingSlash(bytes.to_vec())); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
344 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
345 for (index, byte) in bytes.iter().enumerate() { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
346 match byte { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
347 0 => { |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
348 return Err(HgPathError::ContainsNullByte { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
349 bytes: bytes.to_vec(), |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
350 null_byte_index: index, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
351 }) |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
352 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
353 b'/' => { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
354 if previous_byte.is_some() && previous_byte == Some(b'/') { |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
355 return Err(HgPathError::ConsecutiveSlashes { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
356 bytes: bytes.to_vec(), |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
357 second_slash_index: index, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
358 }); |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
359 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
360 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
361 _ => (), |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
362 }; |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
363 previous_byte = Some(*byte); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
364 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
365 Ok(()) |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
366 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
367 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
368 #[cfg(test)] |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
369 /// Only usable during tests to force developers to handle invalid states |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
370 fn is_valid(&self) -> bool { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
371 self.check_state().is_ok() |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
372 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
373 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
374 |
43908
4b3c8df189bc
rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents:
43833
diff
changeset
|
375 impl fmt::Debug for HgPath { |
4b3c8df189bc
rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents:
43833
diff
changeset
|
376 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
4b3c8df189bc
rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents:
43833
diff
changeset
|
377 write!(f, "HgPath({:?})", String::from_utf8_lossy(&self.inner)) |
4b3c8df189bc
rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents:
43833
diff
changeset
|
378 } |
4b3c8df189bc
rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents:
43833
diff
changeset
|
379 } |
4b3c8df189bc
rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents:
43833
diff
changeset
|
380 |
43827
c27e688fcdc3
rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
381 impl fmt::Display for HgPath { |
c27e688fcdc3
rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
382 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
c27e688fcdc3
rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
383 write!(f, "{}", String::from_utf8_lossy(&self.inner)) |
c27e688fcdc3
rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
384 } |
c27e688fcdc3
rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
385 } |
c27e688fcdc3
rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
386 |
46435
2e2033081274
rust: replace trivial `impl From ?` with `#[derive(derive_more::From)]`
Simon Sapin <simon.sapin@octobus.net>
parents:
45538
diff
changeset
|
387 #[derive( |
2e2033081274
rust: replace trivial `impl From ?` with `#[derive(derive_more::From)]`
Simon Sapin <simon.sapin@octobus.net>
parents:
45538
diff
changeset
|
388 Default, Eq, Ord, Clone, PartialEq, PartialOrd, Hash, derive_more::From, |
2e2033081274
rust: replace trivial `impl From ?` with `#[derive(derive_more::From)]`
Simon Sapin <simon.sapin@octobus.net>
parents:
45538
diff
changeset
|
389 )] |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
390 pub struct HgPathBuf { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
391 inner: Vec<u8>, |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
392 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
393 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
394 impl HgPathBuf { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
395 pub fn new() -> Self { |
44973
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
396 Default::default() |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
397 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
398 pub fn push(&mut self, byte: u8) { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
399 self.inner.push(byte); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
400 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
401 pub fn from_bytes(s: &[u8]) -> HgPathBuf { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
402 HgPath::new(s).to_owned() |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
403 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
404 pub fn into_vec(self) -> Vec<u8> { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
405 self.inner |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
406 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
407 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
408 |
43908
4b3c8df189bc
rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents:
43833
diff
changeset
|
409 impl fmt::Debug for HgPathBuf { |
4b3c8df189bc
rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents:
43833
diff
changeset
|
410 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
4b3c8df189bc
rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents:
43833
diff
changeset
|
411 write!(f, "HgPathBuf({:?})", String::from_utf8_lossy(&self.inner)) |
4b3c8df189bc
rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents:
43833
diff
changeset
|
412 } |
4b3c8df189bc
rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents:
43833
diff
changeset
|
413 } |
4b3c8df189bc
rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents:
43833
diff
changeset
|
414 |
43827
c27e688fcdc3
rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
415 impl fmt::Display for HgPathBuf { |
c27e688fcdc3
rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
416 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
c27e688fcdc3
rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
417 write!(f, "{}", String::from_utf8_lossy(&self.inner)) |
c27e688fcdc3
rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
418 } |
c27e688fcdc3
rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
419 } |
c27e688fcdc3
rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
420 |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
421 impl Deref for HgPathBuf { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
422 type Target = HgPath; |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
423 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
424 #[inline] |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
425 fn deref(&self) -> &HgPath { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
426 &HgPath::new(&self.inner) |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
427 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
428 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
429 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
430 impl<T: ?Sized + AsRef<HgPath>> From<&T> for HgPathBuf { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
431 fn from(s: &T) -> HgPathBuf { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
432 s.as_ref().to_owned() |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
433 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
434 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
435 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
436 impl Into<Vec<u8>> for HgPathBuf { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
437 fn into(self) -> Vec<u8> { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
438 self.inner |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
439 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
440 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
441 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
442 impl Borrow<HgPath> for HgPathBuf { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
443 fn borrow(&self) -> &HgPath { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
444 &HgPath::new(self.as_bytes()) |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
445 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
446 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
447 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
448 impl ToOwned for HgPath { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
449 type Owned = HgPathBuf; |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
450 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
451 fn to_owned(&self) -> HgPathBuf { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
452 self.to_hg_path_buf() |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
453 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
454 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
455 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
456 impl AsRef<HgPath> for HgPath { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
457 fn as_ref(&self) -> &HgPath { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
458 self |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
459 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
460 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
461 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
462 impl AsRef<HgPath> for HgPathBuf { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
463 fn as_ref(&self) -> &HgPath { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
464 self |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
465 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
466 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
467 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
468 impl Extend<u8> for HgPathBuf { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
469 fn extend<T: IntoIterator<Item = u8>>(&mut self, iter: T) { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
470 self.inner.extend(iter); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
471 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
472 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
473 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
474 /// TODO: Once https://www.mercurial-scm.org/wiki/WindowsUTF8Plan is |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
475 /// implemented, these conversion utils will have to work differently depending |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
476 /// on the repository encoding: either `UTF-8` or `MBCS`. |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
477 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
478 pub fn hg_path_to_os_string<P: AsRef<HgPath>>( |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
479 hg_path: P, |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
480 ) -> Result<OsString, HgPathError> { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
481 hg_path.as_ref().check_state()?; |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
482 let os_str; |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
483 #[cfg(unix)] |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
484 { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
485 use std::os::unix::ffi::OsStrExt; |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
486 os_str = std::ffi::OsStr::from_bytes(&hg_path.as_ref().as_bytes()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
487 } |
43250
98d996a138de
rust-cross-platform: remove `unimplemented!` to get compile-time errors
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42956
diff
changeset
|
488 // TODO Handle other platforms |
98d996a138de
rust-cross-platform: remove `unimplemented!` to get compile-time errors
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42956
diff
changeset
|
489 // TODO: convert from WTF8 to Windows MBCS (ANSI encoding). |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
490 Ok(os_str.to_os_string()) |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
491 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
492 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
493 pub fn hg_path_to_path_buf<P: AsRef<HgPath>>( |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
494 hg_path: P, |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
495 ) -> Result<PathBuf, HgPathError> { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
496 Ok(Path::new(&hg_path_to_os_string(hg_path)?).to_path_buf()) |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
497 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
498 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
499 pub fn os_string_to_hg_path_buf<S: AsRef<OsStr>>( |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
500 os_string: S, |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
501 ) -> Result<HgPathBuf, HgPathError> { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
502 let buf; |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
503 #[cfg(unix)] |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
504 { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
505 use std::os::unix::ffi::OsStrExt; |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
506 buf = HgPathBuf::from_bytes(&os_string.as_ref().as_bytes()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
507 } |
43250
98d996a138de
rust-cross-platform: remove `unimplemented!` to get compile-time errors
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42956
diff
changeset
|
508 // TODO Handle other platforms |
98d996a138de
rust-cross-platform: remove `unimplemented!` to get compile-time errors
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42956
diff
changeset
|
509 // 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:
42956
diff
changeset
|
510 |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
511 buf.check_state()?; |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
512 Ok(buf) |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
513 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
514 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
515 pub fn path_to_hg_path_buf<P: AsRef<Path>>( |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
516 path: P, |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
517 ) -> Result<HgPathBuf, HgPathError> { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
518 let buf; |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
519 let os_str = path.as_ref().as_os_str(); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
520 #[cfg(unix)] |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
521 { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
522 use std::os::unix::ffi::OsStrExt; |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
523 buf = HgPathBuf::from_bytes(&os_str.as_bytes()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
524 } |
43250
98d996a138de
rust-cross-platform: remove `unimplemented!` to get compile-time errors
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42956
diff
changeset
|
525 // TODO Handle other platforms |
98d996a138de
rust-cross-platform: remove `unimplemented!` to get compile-time errors
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42956
diff
changeset
|
526 // 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:
42956
diff
changeset
|
527 |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
528 buf.check_state()?; |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
529 Ok(buf) |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
530 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
531 |
45538
2d5dfc8fed55
hg-core: impl TryFrom<PathBuff> for HgPathBuf
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44973
diff
changeset
|
532 impl TryFrom<PathBuf> for HgPathBuf { |
2d5dfc8fed55
hg-core: impl TryFrom<PathBuff> for HgPathBuf
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44973
diff
changeset
|
533 type Error = HgPathError; |
2d5dfc8fed55
hg-core: impl TryFrom<PathBuff> for HgPathBuf
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44973
diff
changeset
|
534 fn try_from(path: PathBuf) -> Result<Self, Self::Error> { |
2d5dfc8fed55
hg-core: impl TryFrom<PathBuff> for HgPathBuf
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44973
diff
changeset
|
535 path_to_hg_path_buf(path) |
2d5dfc8fed55
hg-core: impl TryFrom<PathBuff> for HgPathBuf
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44973
diff
changeset
|
536 } |
2d5dfc8fed55
hg-core: impl TryFrom<PathBuff> for HgPathBuf
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44973
diff
changeset
|
537 } |
2d5dfc8fed55
hg-core: impl TryFrom<PathBuff> for HgPathBuf
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44973
diff
changeset
|
538 |
47113
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
539 impl From<HgPathBuf> for Cow<'_, HgPath> { |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
540 fn from(path: HgPathBuf) -> Self { |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
541 Cow::Owned(path) |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
542 } |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
543 } |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
544 |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
545 impl<'a> From<&'a HgPath> for Cow<'a, HgPath> { |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
546 fn from(path: &'a HgPath) -> Self { |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
547 Cow::Borrowed(path) |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
548 } |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
549 } |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
550 |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
551 impl<'a> From<&'a HgPathBuf> for Cow<'a, HgPath> { |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
552 fn from(path: &'a HgPathBuf) -> Self { |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
553 Cow::Borrowed(&**path) |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
554 } |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
555 } |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
556 |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
557 #[cfg(test)] |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
558 mod tests { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
559 use super::*; |
44266
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
560 use pretty_assertions::assert_eq; |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
561 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
562 #[test] |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
563 fn test_path_states() { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
564 assert_eq!( |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
565 Err(HgPathError::LeadingSlash(b"/".to_vec())), |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
566 HgPath::new(b"/").check_state() |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
567 ); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
568 assert_eq!( |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
569 Err(HgPathError::ConsecutiveSlashes { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
570 bytes: b"a/b//c".to_vec(), |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
571 second_slash_index: 4 |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
572 }), |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
573 HgPath::new(b"a/b//c").check_state() |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
574 ); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
575 assert_eq!( |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
576 Err(HgPathError::ContainsNullByte { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
577 bytes: b"a/b/\0c".to_vec(), |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
578 null_byte_index: 4 |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
579 }), |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
580 HgPath::new(b"a/b/\0c").check_state() |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
581 ); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
582 // TODO test HgPathError::DecodeError for the Windows implementation. |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
583 assert_eq!(true, HgPath::new(b"").is_valid()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
584 assert_eq!(true, HgPath::new(b"a/b/c").is_valid()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
585 // Backslashes in paths are not significant, but allowed |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
586 assert_eq!(true, HgPath::new(br"a\b/c").is_valid()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
587 // Dots in paths are not significant, but allowed |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
588 assert_eq!(true, HgPath::new(b"a/b/../c/").is_valid()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
589 assert_eq!(true, HgPath::new(b"./a/b/../c/").is_valid()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
590 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
591 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
592 #[test] |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
593 fn test_iter() { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
594 let path = HgPath::new(b"a"); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
595 let mut iter = path.bytes(); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
596 assert_eq!(Some(&b'a'), iter.next()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
597 assert_eq!(None, iter.next_back()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
598 assert_eq!(None, iter.next()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
599 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
600 let path = HgPath::new(b"a"); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
601 let mut iter = path.bytes(); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
602 assert_eq!(Some(&b'a'), iter.next_back()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
603 assert_eq!(None, iter.next_back()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
604 assert_eq!(None, iter.next()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
605 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
606 let path = HgPath::new(b"abc"); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
607 let mut iter = path.bytes(); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
608 assert_eq!(Some(&b'a'), iter.next()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
609 assert_eq!(Some(&b'c'), iter.next_back()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
610 assert_eq!(Some(&b'b'), iter.next_back()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
611 assert_eq!(None, iter.next_back()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
612 assert_eq!(None, iter.next()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
613 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
614 let path = HgPath::new(b"abc"); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
615 let mut iter = path.bytes(); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
616 assert_eq!(Some(&b'a'), iter.next()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
617 assert_eq!(Some(&b'b'), iter.next()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
618 assert_eq!(Some(&b'c'), iter.next()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
619 assert_eq!(None, iter.next_back()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
620 assert_eq!(None, iter.next()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
621 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
622 let path = HgPath::new(b"abc"); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
623 let iter = path.bytes(); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
624 let mut vec = Vec::new(); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
625 vec.extend(iter); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
626 assert_eq!(vec![b'a', b'b', b'c'], vec); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
627 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
628 let path = HgPath::new(b"abc"); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
629 let mut iter = path.bytes(); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
630 assert_eq!(Some(2), iter.rposition(|c| *c == b'c')); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
631 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
632 let path = HgPath::new(b"abc"); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
633 let mut iter = path.bytes(); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
634 assert_eq!(None, iter.rposition(|c| *c == b'd')); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
635 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
636 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
637 #[test] |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
638 fn test_join() { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
639 let path = HgPathBuf::from_bytes(b"a").join(HgPath::new(b"b")); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
640 assert_eq!(b"a/b", path.as_bytes()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
641 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
642 let path = HgPathBuf::from_bytes(b"a/").join(HgPath::new(b"b/c")); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
643 assert_eq!(b"a/b/c", path.as_bytes()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
644 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
645 // No leading slash if empty before join |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
646 let path = HgPathBuf::new().join(HgPath::new(b"b/c")); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
647 assert_eq!(b"b/c", path.as_bytes()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
648 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
649 // The leading slash is an invalid representation of an `HgPath`, but |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
650 // it can happen. This creates another invalid representation of |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
651 // consecutive bytes. |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
652 // TODO What should be done in this case? Should we silently remove |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
653 // the extra slash? Should we change the signature to a problematic |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
654 // `Result<HgPathBuf, HgPathError>`, or should we just keep it so and |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
655 // let the error happen upon filesystem interaction? |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
656 let path = HgPathBuf::from_bytes(b"a/").join(HgPath::new(b"/b")); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
657 assert_eq!(b"a//b", path.as_bytes()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
658 let path = HgPathBuf::from_bytes(b"a").join(HgPath::new(b"/b")); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
659 assert_eq!(b"a//b", path.as_bytes()); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
660 } |
43833
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
661 |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
662 #[test] |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
663 fn test_relative_to() { |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
664 let path = HgPath::new(b""); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
665 let base = HgPath::new(b""); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
666 assert_eq!(Some(path), path.relative_to(base)); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
667 |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
668 let path = HgPath::new(b"path"); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
669 let base = HgPath::new(b""); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
670 assert_eq!(Some(path), path.relative_to(base)); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
671 |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
672 let path = HgPath::new(b"a"); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
673 let base = HgPath::new(b"b"); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
674 assert_eq!(None, path.relative_to(base)); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
675 |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
676 let path = HgPath::new(b"a/b"); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
677 let base = HgPath::new(b"a"); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
678 assert_eq!(None, path.relative_to(base)); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
679 |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
680 let path = HgPath::new(b"a/b"); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
681 let base = HgPath::new(b"a/"); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
682 assert_eq!(Some(HgPath::new(b"b")), path.relative_to(base)); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
683 |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
684 let path = HgPath::new(b"nested/path/to/b"); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
685 let base = HgPath::new(b"nested/path/"); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
686 assert_eq!(Some(HgPath::new(b"to/b")), path.relative_to(base)); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
687 |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
688 let path = HgPath::new(b"ends/with/dir/"); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
689 let base = HgPath::new(b"ends/"); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
690 assert_eq!(Some(HgPath::new(b"with/dir/")), path.relative_to(base)); |
4f1543a2f5c3
rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43827
diff
changeset
|
691 } |
44136
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
692 |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
693 #[test] |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
694 #[cfg(unix)] |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
695 fn test_split_drive() { |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
696 // Taken from the Python stdlib's tests |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
697 assert_eq!( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
698 HgPath::new(br"/foo/bar").split_drive(), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
699 (HgPath::new(b""), HgPath::new(br"/foo/bar")) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
700 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
701 assert_eq!( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
702 HgPath::new(br"foo:bar").split_drive(), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
703 (HgPath::new(b""), HgPath::new(br"foo:bar")) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
704 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
705 assert_eq!( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
706 HgPath::new(br":foo:bar").split_drive(), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
707 (HgPath::new(b""), HgPath::new(br":foo:bar")) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
708 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
709 // Also try NT paths; should not split them |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
710 assert_eq!( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
711 HgPath::new(br"c:\foo\bar").split_drive(), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
712 (HgPath::new(b""), HgPath::new(br"c:\foo\bar")) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
713 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
714 assert_eq!( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
715 HgPath::new(b"c:/foo/bar").split_drive(), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
716 (HgPath::new(b""), HgPath::new(br"c:/foo/bar")) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
717 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
718 assert_eq!( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
719 HgPath::new(br"\\conky\mountpoint\foo\bar").split_drive(), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
720 ( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
721 HgPath::new(b""), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
722 HgPath::new(br"\\conky\mountpoint\foo\bar") |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
723 ) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
724 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
725 } |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
726 |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
727 #[test] |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
728 #[cfg(windows)] |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
729 fn test_split_drive() { |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
730 assert_eq!( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
731 HgPath::new(br"c:\foo\bar").split_drive(), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
732 (HgPath::new(br"c:"), HgPath::new(br"\foo\bar")) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
733 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
734 assert_eq!( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
735 HgPath::new(b"c:/foo/bar").split_drive(), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
736 (HgPath::new(br"c:"), HgPath::new(br"/foo/bar")) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
737 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
738 assert_eq!( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
739 HgPath::new(br"\\conky\mountpoint\foo\bar").split_drive(), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
740 ( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
741 HgPath::new(br"\\conky\mountpoint"), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
742 HgPath::new(br"\foo\bar") |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
743 ) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
744 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
745 assert_eq!( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
746 HgPath::new(br"//conky/mountpoint/foo/bar").split_drive(), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
747 ( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
748 HgPath::new(br"//conky/mountpoint"), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
749 HgPath::new(br"/foo/bar") |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
750 ) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
751 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
752 assert_eq!( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
753 HgPath::new(br"\\\conky\mountpoint\foo\bar").split_drive(), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
754 ( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
755 HgPath::new(br""), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
756 HgPath::new(br"\\\conky\mountpoint\foo\bar") |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
757 ) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
758 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
759 assert_eq!( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
760 HgPath::new(br"///conky/mountpoint/foo/bar").split_drive(), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
761 ( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
762 HgPath::new(br""), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
763 HgPath::new(br"///conky/mountpoint/foo/bar") |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
764 ) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
765 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
766 assert_eq!( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
767 HgPath::new(br"\\conky\\mountpoint\foo\bar").split_drive(), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
768 ( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
769 HgPath::new(br""), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
770 HgPath::new(br"\\conky\\mountpoint\foo\bar") |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
771 ) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
772 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
773 assert_eq!( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
774 HgPath::new(br"//conky//mountpoint/foo/bar").split_drive(), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
775 ( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
776 HgPath::new(br""), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
777 HgPath::new(br"//conky//mountpoint/foo/bar") |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
778 ) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
779 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
780 // UNC part containing U+0130 |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
781 assert_eq!( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
782 HgPath::new(b"//conky/MOUNTPO\xc4\xb0NT/foo/bar").split_drive(), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
783 ( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
784 HgPath::new(b"//conky/MOUNTPO\xc4\xb0NT"), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
785 HgPath::new(br"/foo/bar") |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
786 ) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
787 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
788 } |
44266
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
789 |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
790 #[test] |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
791 fn test_parent() { |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
792 let path = HgPath::new(b""); |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
793 assert_eq!(path.parent(), path); |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
794 |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
795 let path = HgPath::new(b"a"); |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
796 assert_eq!(path.parent(), HgPath::new(b"")); |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
797 |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
798 let path = HgPath::new(b"a/b"); |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
799 assert_eq!(path.parent(), HgPath::new(b"a")); |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
800 |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
801 let path = HgPath::new(b"a/other/b"); |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
802 assert_eq!(path.parent(), HgPath::new(b"a/other")); |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
803 } |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
804 } |