Mercurial > public > mercurial-scm > hg
annotate rust/hg-core/src/utils/hg_path.rs @ 49558:363923bd51cd stable
dirstate-v2: hash the source of the ignore patterns as well
Fixes the test introduced in the last changeset. This caused the hash
to change, which means that the check in the test had to be adapted.
Since this hash is only done as a caching mechanism, invalidation does
not pose any backwards compatibility issues.
author | Rapha?l Gom?s <rgomes@octobus.net> |
---|---|
date | Wed, 02 Nov 2022 12:05:34 +0100 |
parents | 9dcfd1d05e6e |
children | c7fb9b74e753 |
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 |
47192
1249eb9cc332
dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents:
47113
diff
changeset
|
8 use crate::utils::SliceExt; |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
9 use std::borrow::Borrow; |
47113
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
10 use std::borrow::Cow; |
45538
2d5dfc8fed55
hg-core: impl TryFrom<PathBuff> for HgPathBuf
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44973
diff
changeset
|
11 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
|
12 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
|
13 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
|
14 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
|
15 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
|
16 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
17 #[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
|
18 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
|
19 /// 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
|
20 LeadingSlash(Vec<u8>), |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
21 ConsecutiveSlashes { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
22 bytes: Vec<u8>, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
23 second_slash_index: usize, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
24 }, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
25 ContainsNullByte { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
26 bytes: Vec<u8>, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
27 null_byte_index: usize, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
28 }, |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
29 /// Bytes |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
30 DecodeError(Vec<u8>), |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
31 /// 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
|
32 EndsWithSlash(HgPathBuf), |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
33 ContainsIllegalComponent(HgPathBuf), |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
34 /// 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
|
35 InsideDotHg(HgPathBuf), |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
36 IsInsideNestedRepo { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
37 path: HgPathBuf, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
38 nested_repo: HgPathBuf, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
39 }, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
40 TraversesSymbolicLink { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
41 path: HgPathBuf, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
42 symlink: HgPathBuf, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
43 }, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
44 NotFsCompliant(HgPathBuf), |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
45 /// `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
|
46 NotUnderRoot { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
47 path: PathBuf, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
48 root: PathBuf, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
49 }, |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
50 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
51 |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
52 impl fmt::Display for HgPathError { |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
53 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
|
54 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
|
55 HgPathError::LeadingSlash(bytes) => { |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
56 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
|
57 } |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
58 HgPathError::ConsecutiveSlashes { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
59 bytes, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
60 second_slash_index: pos, |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
61 } => write!( |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
62 f, |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
63 "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
|
64 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
|
65 ), |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
66 HgPathError::ContainsNullByte { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
67 bytes, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
68 null_byte_index: pos, |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
69 } => write!( |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
70 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
|
71 "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
|
72 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
|
73 ), |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
74 HgPathError::DecodeError(bytes) => write!( |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
75 f, |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
76 "Invalid HgPath '{:?}': could not be decoded.", |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
77 bytes |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
78 ), |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
79 HgPathError::EndsWithSlash(path) => { |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
80 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
|
81 } |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
82 HgPathError::ContainsIllegalComponent(path) => write!( |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
83 f, |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
84 "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
|
85 path |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
86 ), |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
87 HgPathError::InsideDotHg(path) => write!( |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
88 f, |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
89 "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
|
90 path |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
91 ), |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
92 HgPathError::IsInsideNestedRepo { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
93 path, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
94 nested_repo: nested, |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
95 } => { |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
96 write!(f, |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
97 "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
|
98 path, nested |
46444
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 } |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
101 HgPathError::TraversesSymbolicLink { path, symlink } => write!( |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
102 f, |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
103 "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
|
104 path, symlink |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
105 ), |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
106 HgPathError::NotFsCompliant(path) => write!( |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
107 f, |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
108 "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
|
109 filesystem path.", |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
110 path |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
111 ), |
46444
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
112 HgPathError::NotUnderRoot { path, root } => write!( |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
113 f, |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
114 "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
|
115 path.display(), |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
116 root.display() |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
117 ), |
42956
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 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
122 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
|
123 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
|
124 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
|
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 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
128 /// 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
|
129 /// - 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
|
130 /// - `/` 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
|
131 /// - 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
|
132 /// - 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
|
133 /// - 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
|
134 /// - 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
|
135 /// |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
136 /// 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
|
137 /// 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
|
138 /// 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
|
139 /// operation. |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
140 /// |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
141 /// 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
|
142 /// 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
|
143 /// 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
|
144 /// 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
|
145 /// 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
|
146 /// character encoding will be determined on a per-repository basis. |
43908
4b3c8df189bc
rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents:
43833
diff
changeset
|
147 #[derive(Eq, Ord, PartialEq, PartialOrd, Hash)] |
49004
9dcfd1d05e6e
rust-hgpath: add `repr(transparent)` to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48311
diff
changeset
|
148 #[repr(transparent)] |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
149 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
|
150 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
|
151 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
152 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
153 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
|
154 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
|
155 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
|
156 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
157 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
|
158 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
|
159 } |
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 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
|
161 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
|
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 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
|
164 HgPathBuf { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
165 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
|
166 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
167 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
168 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
|
169 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
|
170 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
171 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
|
172 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
|
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 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
|
175 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
|
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 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
|
178 &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
|
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 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
|
181 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
|
182 } |
44266
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
183 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
|
184 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
|
185 } |
44266
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
186 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
|
187 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
|
188 &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
|
189 } else { |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
190 &self.inner[..] |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
191 }) |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
192 } |
44267
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
193 /// 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
|
194 /// at the rightmost `/`, if any. |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
195 /// |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
196 /// # Examples: |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
197 /// |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
198 /// ``` |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
199 /// use hg::utils::hg_path::HgPath; |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
200 /// |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
201 /// 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
|
202 /// 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
|
203 /// |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
204 /// 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
|
205 /// 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
|
206 /// ``` |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
207 pub fn split_filename(&self) -> (&Self, &Self) { |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
208 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
|
209 None => (HgPath::new(""), &self), |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
210 Some(size) => ( |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
211 HgPath::new(&self.inner[..*size]), |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
212 HgPath::new(&self.inner[*size + 1..]), |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
213 ), |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
214 } |
0e9ac3968b56
rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44266
diff
changeset
|
215 } |
48311
6d69e83e6b6e
rhg: more efficient `HgPath::join`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
47192
diff
changeset
|
216 |
6d69e83e6b6e
rhg: more efficient `HgPath::join`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
47192
diff
changeset
|
217 pub fn join(&self, path: &HgPath) -> HgPathBuf { |
6d69e83e6b6e
rhg: more efficient `HgPath::join`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
47192
diff
changeset
|
218 let mut buf = self.to_owned(); |
6d69e83e6b6e
rhg: more efficient `HgPath::join`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
47192
diff
changeset
|
219 buf.push(path); |
6d69e83e6b6e
rhg: more efficient `HgPath::join`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
47192
diff
changeset
|
220 buf |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
221 } |
47099
3da19db33cbc
dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents:
46444
diff
changeset
|
222 |
3da19db33cbc
dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents:
46444
diff
changeset
|
223 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
|
224 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
|
225 } |
3da19db33cbc
dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents:
46444
diff
changeset
|
226 |
47192
1249eb9cc332
dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents:
47113
diff
changeset
|
227 /// Returns the first (that is "root-most") slash-separated component of |
1249eb9cc332
dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents:
47113
diff
changeset
|
228 /// the path, and the rest after the first slash if there is one. |
1249eb9cc332
dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents:
47113
diff
changeset
|
229 pub fn split_first_component(&self) -> (&HgPath, Option<&HgPath>) { |
1249eb9cc332
dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents:
47113
diff
changeset
|
230 match self.inner.split_2(b'/') { |
1249eb9cc332
dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents:
47113
diff
changeset
|
231 Some((a, b)) => (HgPath::new(a), Some(HgPath::new(b))), |
1249eb9cc332
dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents:
47113
diff
changeset
|
232 None => (self, None), |
1249eb9cc332
dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents:
47113
diff
changeset
|
233 } |
1249eb9cc332
dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents:
47113
diff
changeset
|
234 } |
1249eb9cc332
dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents:
47113
diff
changeset
|
235 |
44266
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
236 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
|
237 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
|
238 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
|
239 Some(pos) => &inner[..pos], |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
240 None => &[], |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
241 }) |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
242 } |
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
|
243 /// 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
|
244 /// 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
|
245 /// `b'/'`), returns `None`. |
44266
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
246 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
|
247 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
|
248 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
|
249 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
|
250 } |
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 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
|
252 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
|
253 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
|
254 } 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
|
255 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
|
256 } |
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
|
257 } |
44136
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
258 |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
259 #[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
|
260 /// 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
|
261 /// |
44191
732098027b34
rust: re-format with nightly rustfmt
Martin von Zweigbergk <martinvonz@google.com>
parents:
44136
diff
changeset
|
262 /// 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
|
263 /// 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
|
264 /// 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
|
265 /// |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
266 /// 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
|
267 /// 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
|
268 /// 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
|
269 /// 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
|
270 /// |
44191
732098027b34
rust: re-format with nightly rustfmt
Martin von Zweigbergk <martinvonz@google.com>
parents:
44136
diff
changeset
|
271 /// 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
|
272 /// 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
|
273 /// 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
|
274 /// |
44191
732098027b34
rust: re-format with nightly rustfmt
Martin von Zweigbergk <martinvonz@google.com>
parents:
44136
diff
changeset
|
275 /// 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
|
276 /// 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
|
277 /// separator character. |
732098027b34
rust: re-format with nightly rustfmt
Martin von Zweigbergk <martinvonz@google.com>
parents:
44136
diff
changeset
|
278 /// 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
|
279 /// "/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
|
280 /// |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
281 /// 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
|
282 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
|
283 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
|
284 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
|
285 |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
286 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
|
287 (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
|
288 } 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
|
289 && 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
|
290 && (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
|
291 { |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
292 // 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
|
293 // 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
|
294 // \\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
|
295 // directory ^^^^^^^^^^^^^^^ |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
296 |
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 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
|
298 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
|
299 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
|
300 } else { |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
301 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
|
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 |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
304 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
|
305 .iter() |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
306 .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
|
307 { |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
308 // 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
|
309 // (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
|
310 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
|
311 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
|
312 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
|
313 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
|
314 (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
|
315 } |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
316 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
|
317 } |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
318 } 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
|
319 // 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
|
320 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
|
321 (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
|
322 } else { |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
323 (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
|
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 |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
327 #[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
|
328 /// 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
|
329 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
|
330 (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
|
331 } |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
332 |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
333 /// 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
|
334 /// 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
|
335 /// 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
|
336 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
|
337 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
|
338 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
|
339 } |
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 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
|
341 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
|
342 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
343 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
|
344 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
|
345 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
346 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
|
347 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
|
348 0 => { |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
349 return Err(HgPathError::ContainsNullByte { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
350 bytes: bytes.to_vec(), |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
351 null_byte_index: index, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
352 }) |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
353 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
354 b'/' => { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
355 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
|
356 return Err(HgPathError::ConsecutiveSlashes { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
357 bytes: bytes.to_vec(), |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
358 second_slash_index: index, |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
359 }); |
42956
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 }; |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
364 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
|
365 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
366 Ok(()) |
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 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
369 #[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
|
370 /// 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
|
371 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
|
372 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
|
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 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
375 |
43908
4b3c8df189bc
rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents:
43833
diff
changeset
|
376 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
|
377 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
|
378 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
|
379 } |
4b3c8df189bc
rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents:
43833
diff
changeset
|
380 } |
4b3c8df189bc
rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents:
43833
diff
changeset
|
381 |
43827
c27e688fcdc3
rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
382 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
|
383 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
|
384 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
|
385 } |
c27e688fcdc3
rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
386 } |
c27e688fcdc3
rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
387 |
46435
2e2033081274
rust: replace trivial `impl From ?` with `#[derive(derive_more::From)]`
Simon Sapin <simon.sapin@octobus.net>
parents:
45538
diff
changeset
|
388 #[derive( |
2e2033081274
rust: replace trivial `impl From ?` with `#[derive(derive_more::From)]`
Simon Sapin <simon.sapin@octobus.net>
parents:
45538
diff
changeset
|
389 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
|
390 )] |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
391 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
|
392 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
|
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 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
395 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
|
396 pub fn new() -> Self { |
44973
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44267
diff
changeset
|
397 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
|
398 } |
48311
6d69e83e6b6e
rhg: more efficient `HgPath::join`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
47192
diff
changeset
|
399 |
6d69e83e6b6e
rhg: more efficient `HgPath::join`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
47192
diff
changeset
|
400 pub fn push<T: ?Sized + AsRef<HgPath>>(&mut self, other: &T) -> () { |
6d69e83e6b6e
rhg: more efficient `HgPath::join`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
47192
diff
changeset
|
401 if !self.inner.is_empty() && self.inner.last() != Some(&b'/') { |
6d69e83e6b6e
rhg: more efficient `HgPath::join`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
47192
diff
changeset
|
402 self.inner.push(b'/'); |
6d69e83e6b6e
rhg: more efficient `HgPath::join`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
47192
diff
changeset
|
403 } |
6d69e83e6b6e
rhg: more efficient `HgPath::join`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
47192
diff
changeset
|
404 self.inner.extend(other.as_ref().bytes()) |
6d69e83e6b6e
rhg: more efficient `HgPath::join`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
47192
diff
changeset
|
405 } |
6d69e83e6b6e
rhg: more efficient `HgPath::join`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
47192
diff
changeset
|
406 |
6d69e83e6b6e
rhg: more efficient `HgPath::join`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
47192
diff
changeset
|
407 pub fn push_byte(&mut self, byte: u8) { |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
408 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
|
409 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
410 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
|
411 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
|
412 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
413 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
|
414 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
|
415 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
416 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
417 |
43908
4b3c8df189bc
rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents:
43833
diff
changeset
|
418 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
|
419 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
|
420 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
|
421 } |
4b3c8df189bc
rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents:
43833
diff
changeset
|
422 } |
4b3c8df189bc
rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents:
43833
diff
changeset
|
423 |
43827
c27e688fcdc3
rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
424 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
|
425 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
|
426 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
|
427 } |
c27e688fcdc3
rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
428 } |
c27e688fcdc3
rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43250
diff
changeset
|
429 |
42956
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 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
|
431 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
|
432 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
433 #[inline] |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
434 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
|
435 &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
|
436 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
437 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
438 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
439 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
|
440 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
|
441 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
|
442 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
443 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
444 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
445 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
|
446 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
|
447 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
|
448 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
449 } |
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 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
|
452 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
|
453 &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
|
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 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
457 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
|
458 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
|
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 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
|
461 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
|
462 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
463 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
464 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
465 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
|
466 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
|
467 self |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
468 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
469 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
470 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
471 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
|
472 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
|
473 self |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
474 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
475 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
476 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
477 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
|
478 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
|
479 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
|
480 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
481 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
482 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
483 /// 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
|
484 /// 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
|
485 /// 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
|
486 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
487 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
|
488 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
|
489 ) -> 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
|
490 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
|
491 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
|
492 #[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
|
493 { |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
494 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
|
495 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
|
496 } |
43250
98d996a138de
rust-cross-platform: remove `unimplemented!` to get compile-time errors
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42956
diff
changeset
|
497 // 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
|
498 // 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
|
499 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
|
500 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
501 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
502 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
|
503 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
|
504 ) -> 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
|
505 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
|
506 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
507 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
508 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
|
509 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
|
510 ) -> 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
|
511 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
|
512 #[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
|
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 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
|
515 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
|
516 } |
43250
98d996a138de
rust-cross-platform: remove `unimplemented!` to get compile-time errors
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42956
diff
changeset
|
517 // 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
|
518 // 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
|
519 |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
520 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
|
521 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
|
522 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
523 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
524 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
|
525 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
|
526 ) -> 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
|
527 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
|
528 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
|
529 #[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
|
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 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
|
532 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
|
533 } |
43250
98d996a138de
rust-cross-platform: remove `unimplemented!` to get compile-time errors
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42956
diff
changeset
|
534 // 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
|
535 // 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
|
536 |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
537 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
|
538 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
|
539 } |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
540 |
45538
2d5dfc8fed55
hg-core: impl TryFrom<PathBuff> for HgPathBuf
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44973
diff
changeset
|
541 impl TryFrom<PathBuf> for HgPathBuf { |
2d5dfc8fed55
hg-core: impl TryFrom<PathBuff> for HgPathBuf
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44973
diff
changeset
|
542 type Error = HgPathError; |
2d5dfc8fed55
hg-core: impl TryFrom<PathBuff> for HgPathBuf
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44973
diff
changeset
|
543 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
|
544 path_to_hg_path_buf(path) |
2d5dfc8fed55
hg-core: impl TryFrom<PathBuff> for HgPathBuf
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44973
diff
changeset
|
545 } |
2d5dfc8fed55
hg-core: impl TryFrom<PathBuff> for HgPathBuf
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44973
diff
changeset
|
546 } |
2d5dfc8fed55
hg-core: impl TryFrom<PathBuff> for HgPathBuf
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44973
diff
changeset
|
547 |
47113
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
548 impl From<HgPathBuf> for Cow<'_, HgPath> { |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
549 fn from(path: HgPathBuf) -> Self { |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
550 Cow::Owned(path) |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
551 } |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
552 } |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
553 |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
554 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
|
555 fn from(path: &'a HgPath) -> Self { |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
556 Cow::Borrowed(path) |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
557 } |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
558 } |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
559 |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
560 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
|
561 fn from(path: &'a HgPathBuf) -> Self { |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
562 Cow::Borrowed(&**path) |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
563 } |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
564 } |
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47099
diff
changeset
|
565 |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
566 #[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
|
567 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
|
568 use super::*; |
44266
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
569 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
|
570 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
571 #[test] |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
572 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
|
573 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
|
574 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
|
575 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
|
576 ); |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
577 assert_eq!( |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
578 Err(HgPathError::ConsecutiveSlashes { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
579 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
|
580 second_slash_index: 4 |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
581 }), |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
582 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
|
583 ); |
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!( |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
585 Err(HgPathError::ContainsNullByte { |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
586 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
|
587 null_byte_index: 4 |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44191
diff
changeset
|
588 }), |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
589 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
|
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 // 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
|
592 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
|
593 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
|
594 // 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
|
595 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
|
596 // 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
|
597 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
|
598 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
|
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 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
601 #[test] |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
602 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
|
603 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
|
604 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
|
605 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
|
606 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
|
607 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
|
608 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
609 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
|
610 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
|
611 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
|
612 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
|
613 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
|
614 |
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 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
|
616 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
|
617 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
|
618 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
|
619 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
|
620 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
|
621 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
|
622 |
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 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
|
624 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
|
625 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
|
626 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
|
627 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
|
628 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
|
629 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
|
630 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
631 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
|
632 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
|
633 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
|
634 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
|
635 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
|
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 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
|
638 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
|
639 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
|
640 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
641 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
|
642 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
|
643 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
|
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 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
646 #[test] |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
647 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
|
648 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
|
649 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
|
650 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
651 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
|
652 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
|
653 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
654 // 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
|
655 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
|
656 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
|
657 |
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
658 // 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
|
659 // 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
|
660 // 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
|
661 // 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
|
662 // 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
|
663 // `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
|
664 // 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
|
665 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
|
666 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
|
667 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
|
668 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
|
669 } |
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
|
670 |
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 #[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
|
672 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
|
673 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
|
674 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
|
675 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
|
676 |
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 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
|
678 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
|
679 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
|
680 |
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 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
|
682 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
|
683 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
|
684 |
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 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
|
686 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
|
687 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
|
688 |
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 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
|
690 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
|
691 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
|
692 |
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
|
693 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
|
694 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
|
695 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
|
696 |
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
|
697 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
|
698 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
|
699 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
|
700 } |
44136
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
701 |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
702 #[test] |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
703 #[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
|
704 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
|
705 // 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
|
706 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
|
707 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
|
708 (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
|
709 ); |
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"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"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(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
|
716 (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
|
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 // 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
|
719 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
|
720 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
|
721 (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
|
722 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
723 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
|
724 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
|
725 (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
|
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 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
|
728 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
|
729 ( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
730 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
|
731 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
|
732 ) |
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 } |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
735 |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
736 #[test] |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
737 #[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
|
738 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
|
739 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
|
740 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
|
741 (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
|
742 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
743 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
|
744 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
|
745 (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
|
746 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
747 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
|
748 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
|
749 ( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
750 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
|
751 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
|
752 ) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
753 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
754 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
|
755 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
|
756 ( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
757 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
|
758 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
|
759 ) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
760 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
761 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
|
762 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
|
763 ( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
764 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
|
765 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
|
766 ) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
767 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
768 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
|
769 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
|
770 ( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
771 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
|
772 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
|
773 ) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
774 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
775 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
|
776 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
|
777 ( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
778 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
|
779 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
|
780 ) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
781 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
782 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
|
783 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
|
784 ( |
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""), |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
786 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
|
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 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
789 // 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
|
790 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
|
791 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
|
792 ( |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
793 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
|
794 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
|
795 ) |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
796 ); |
baa4e7fdfd47
rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43908
diff
changeset
|
797 } |
44266
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
798 |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
799 #[test] |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
800 fn test_parent() { |
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""); |
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(), path); |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
803 |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
804 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
|
805 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
|
806 |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
807 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
|
808 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
|
809 |
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44265
diff
changeset
|
810 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
|
811 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
|
812 } |
42956
3fe40dd6355d
rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
813 } |