annotate rust/hg-core/src/utils/hg_path.rs @ 44420:6329ce04c69f

rust-nodemap: accounting for dead blocks By the very append-only nature of the `NodeTree`, inserting new blocks has the effect of making some of the older ones useless as they become unreachable. Therefore some automatic housekeeping will need to be provided. This is standard procedure in the word of databases, under names such as "repack" or "vacuum". The new `masked_readonly_blocks()` will provide callers with useful information to decide if the nodetree is ripe for repacking, but all the `NodeTree` can provide is how many blocks have been masked in the currently mutable part. Analysing the readonly part would be way too long to do it for each transaction and defeat the whole purpose of nodemap persistence. Serializing callers (from the Python layer) will get this figure before each extraction and maintain an aggregate counter of unreachable blocks separately. Note: at this point, the most efficient repacking is just to restart afresh with a full rescan. Differential Revision: https://phab.mercurial-scm.org/D8097
author Georges Racinet <georges.racinet@octobus.net>
date Tue, 18 Feb 2020 19:11:17 +0100
parents 0e9ac3968b56
children 26114bd6ec60
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
1 // hg_path.rs
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
2 //
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
3 // Copyright 2019 Raphaël Gomès <rgomes@octobus.net>
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
4 //
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
5 // This software may be used and distributed according to the terms of the
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
6 // GNU General Public License version 2 or any later version.
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
7
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
8 use std::borrow::Borrow;
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::ffi::{OsStr, OsString};
43845
c27e688fcdc3 rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
10 use std::fmt;
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
11 use std::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
12 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
13
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
14 #[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
15 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
16 /// 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
17 LeadingSlash(Vec<u8>),
44312
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
18 ConsecutiveSlashes {
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
19 bytes: Vec<u8>,
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
20 second_slash_index: usize,
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
21 },
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
22 ContainsNullByte {
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
23 bytes: Vec<u8>,
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
24 null_byte_index: usize,
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
25 },
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
26 /// Bytes
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
27 DecodeError(Vec<u8>),
44312
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
28 /// The rest come from audit errors
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
29 EndsWithSlash(HgPathBuf),
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
30 ContainsIllegalComponent(HgPathBuf),
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
31 /// Path is inside the `.hg` folder
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
32 InsideDotHg(HgPathBuf),
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
33 IsInsideNestedRepo {
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
34 path: HgPathBuf,
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
35 nested_repo: HgPathBuf,
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
36 },
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
37 TraversesSymbolicLink {
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
38 path: HgPathBuf,
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
39 symlink: HgPathBuf,
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
40 },
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
41 NotFsCompliant(HgPathBuf),
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
42 /// `path` is the smallest invalid path
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
43 NotUnderRoot {
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
44 path: PathBuf,
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
45 root: PathBuf,
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
46 },
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
47 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
48
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
49 impl ToString for HgPathError {
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
50 fn to_string(&self) -> String {
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
51 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
52 HgPathError::LeadingSlash(bytes) => {
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
53 format!("Invalid HgPath '{:?}': has a leading slash.", bytes)
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
54 }
44312
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
55 HgPathError::ConsecutiveSlashes {
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
56 bytes,
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
57 second_slash_index: pos,
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
58 } => format!(
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
59 "Invalid HgPath '{:?}': consecutive slashes at pos {}.",
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
60 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
61 ),
44312
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
62 HgPathError::ContainsNullByte {
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
63 bytes,
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
64 null_byte_index: pos,
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
65 } => format!(
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
66 "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
67 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
68 ),
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
69 HgPathError::DecodeError(bytes) => {
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
70 format!("Invalid HgPath '{:?}': could not be decoded.", bytes)
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
71 }
44312
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
72 HgPathError::EndsWithSlash(path) => {
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
73 format!("Audit failed for '{}': ends with a slash.", path)
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
74 }
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
75 HgPathError::ContainsIllegalComponent(path) => format!(
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
76 "Audit failed for '{}': contains an illegal component.",
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
77 path
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
78 ),
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
79 HgPathError::InsideDotHg(path) => format!(
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
80 "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: 44266
diff changeset
81 path
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
82 ),
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
83 HgPathError::IsInsideNestedRepo {
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
84 path,
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
85 nested_repo: nested,
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
86 } => format!(
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
87 "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: 44266
diff changeset
88 path, nested
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
89 ),
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
90 HgPathError::TraversesSymbolicLink { path, symlink } => format!(
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
91 "Audit failed for '{}': traverses symbolic link '{}'.",
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
92 path, symlink
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
93 ),
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
94 HgPathError::NotFsCompliant(path) => format!(
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
95 "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: 44266
diff changeset
96 filesystem path.",
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
97 path
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
98 ),
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
99 HgPathError::NotUnderRoot { path, root } => format!(
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
100 "Audit failed for '{}': not under root {}.",
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
101 path.display(),
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
102 root.display()
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
103 ),
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
104 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
105 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
106 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
107
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
108 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
109 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
110 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
111 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
112 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
113
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
114 /// 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
115 /// - 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
116 /// - `/` 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
117 /// - 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
118 /// - 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
119 /// - 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
120 /// - 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
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 /// 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
123 /// 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
124 /// 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
125 /// operation.
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
126 ///
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
127 /// This 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
128 /// 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
129 /// 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
130 /// 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
131 /// 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
132 /// character encoding will be determined on a per-repository basis.
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
133 //
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
134 // FIXME: (adapted from a comment in the stdlib)
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
135 // `HgPath::new()` current implementation relies on `Slice` being
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
136 // layout-compatible with `[u8]`.
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
137 // When attribute privacy is implemented, `Slice` should be annotated as
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
138 // `#[repr(transparent)]`.
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
139 // Anyway, `Slice` representation and layout are considered implementation
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
140 // detail, are not documented and must not be relied upon.
43914
4b3c8df189bc rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents: 43851
diff changeset
141 #[derive(Eq, Ord, PartialEq, PartialOrd, Hash)]
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
142 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
143 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
144 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
145
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
146 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
147 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
148 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
149 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
150 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
151 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
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 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
154 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
155 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
156 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
157 HgPathBuf {
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
158 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
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 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
161 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
162 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
163 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
164 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
165 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
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 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
168 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
169 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
170 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
171 &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
172 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
173 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
174 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
175 }
44313
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
176 pub fn starts_with(&self, needle: impl AsRef<Self>) -> bool {
43851
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43845
diff changeset
177 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: 43845
diff changeset
178 }
44313
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
179 pub fn trim_trailing_slash(&self) -> &Self {
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
180 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: 44312
diff changeset
181 &self.inner[..self.inner.len() - 1]
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
182 } else {
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
183 &self.inner[..]
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
184 })
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
185 }
44314
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
186 /// 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: 44313
diff changeset
187 /// at the rightmost `/`, if any.
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
188 ///
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
189 /// # Examples:
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
190 ///
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
191 /// ```
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
192 /// use hg::utils::hg_path::HgPath;
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
193 ///
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
194 /// let path = HgPath::new(b"cool/hg/path").split_filename();
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
195 /// 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: 44313
diff changeset
196 ///
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
197 /// let path = HgPath::new(b"pathwithoutsep").split_filename();
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
198 /// assert_eq!(path, (HgPath::new(b""), HgPath::new(b"pathwithoutsep")));
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
199 /// ```
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
200 pub fn split_filename(&self) -> (&Self, &Self) {
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
201 match &self.inner.iter().rposition(|c| *c == b'/') {
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
202 None => (HgPath::new(""), &self),
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
203 Some(size) => (
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
204 HgPath::new(&self.inner[..*size]),
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
205 HgPath::new(&self.inner[*size + 1..]),
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
206 ),
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
207 }
0e9ac3968b56 rust-dirs-multiset: add `DirsChildrenMultiset`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44313
diff changeset
208 }
44313
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
209 pub fn join<T: ?Sized + AsRef<Self>>(&self, other: &T) -> HgPathBuf {
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
210 let mut 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
211 if inner.len() != 0 && inner.last() != Some(&b'/') {
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
212 inner.push(b'/');
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
213 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
214 inner.extend(other.as_ref().bytes());
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
215 HgPathBuf::from_bytes(&inner)
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
216 }
44313
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
217 pub fn parent(&self) -> &Self {
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
218 let inner = self.as_bytes();
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
219 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: 44312
diff changeset
220 Some(pos) => &inner[..pos],
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
221 None => &[],
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
222 })
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
223 }
43851
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43845
diff changeset
224 /// 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: 43845
diff changeset
225 /// 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: 43845
diff changeset
226 /// `b'/'`), returns `None`.
44313
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
227 pub fn relative_to(&self, base: impl AsRef<Self>) -> Option<&Self> {
43851
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43845
diff changeset
228 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: 43845
diff changeset
229 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: 43845
diff changeset
230 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: 43845
diff changeset
231 }
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43845
diff changeset
232 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: 43845
diff changeset
233 if is_dir && self.starts_with(base) {
44313
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
234 Some(Self::new(&self.inner[base.len()..]))
43851
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43845
diff changeset
235 } 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: 43845
diff changeset
236 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: 43845
diff changeset
237 }
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43845
diff changeset
238 }
44221
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
239
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
240 #[cfg(windows)]
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
241 /// 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: 43914
diff changeset
242 ///
44266
732098027b34 rust: re-format with nightly rustfmt
Martin von Zweigbergk <martinvonz@google.com>
parents: 44221
diff changeset
243 /// Split a pathname into drive/UNC sharepoint and relative path
732098027b34 rust: re-format with nightly rustfmt
Martin von Zweigbergk <martinvonz@google.com>
parents: 44221
diff changeset
244 /// 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: 44221
diff changeset
245 /// be empty.
44221
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
246 ///
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
247 /// If you assign
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
248 /// result = split_drive(p)
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
249 /// 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: 43914
diff changeset
250 /// 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: 43914
diff changeset
251 ///
44266
732098027b34 rust: re-format with nightly rustfmt
Martin von Zweigbergk <martinvonz@google.com>
parents: 44221
diff changeset
252 /// 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: 44221
diff changeset
253 /// everything up to and including the colon.
44221
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
254 /// 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: 43914
diff changeset
255 ///
44266
732098027b34 rust: re-format with nightly rustfmt
Martin von Zweigbergk <martinvonz@google.com>
parents: 44221
diff changeset
256 /// 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: 44221
diff changeset
257 /// 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: 44221
diff changeset
258 /// separator character.
732098027b34 rust: re-format with nightly rustfmt
Martin von Zweigbergk <martinvonz@google.com>
parents: 44221
diff changeset
259 /// e.g. split_drive("//host/computer/dir") returns ("//host/computer",
732098027b34 rust: re-format with nightly rustfmt
Martin von Zweigbergk <martinvonz@google.com>
parents: 44221
diff changeset
260 /// "/dir")
44221
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
261 ///
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
262 /// 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: 43914
diff changeset
263 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: 43914
diff changeset
264 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: 43914
diff changeset
265 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: 43914
diff changeset
266
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
267 if self.len() < 2 {
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
268 (HgPath::new(b""), &self)
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
269 } 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: 43914
diff changeset
270 && is_sep(bytes[1])
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
271 && (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: 43914
diff changeset
272 {
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
273 // Is a UNC path:
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
274 // 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: 43914
diff changeset
275 // \\machine\mountpoint\directory\etc\...
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
276 // directory ^^^^^^^^^^^^^^^
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
277
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
278 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: 43914
diff changeset
279 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: 43914
diff changeset
280 i + 2
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
281 } else {
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
282 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: 43914
diff changeset
283 };
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
284
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
285 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: 43914
diff changeset
286 .iter()
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
287 .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: 43914
diff changeset
288 {
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
289 // 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: 43914
diff changeset
290 // (after the initial two)
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
291 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: 43914
diff changeset
292 Some(i) => {
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
293 let (a, b) =
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
294 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: 43914
diff changeset
295 (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: 43914
diff changeset
296 }
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
297 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: 43914
diff changeset
298 }
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
299 } 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: 43914
diff changeset
300 // Drive path c:\directory
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
301 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: 43914
diff changeset
302 (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: 43914
diff changeset
303 } else {
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
304 (HgPath::new(b""), &self)
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
305 }
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
306 }
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
307
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
308 #[cfg(unix)]
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
309 /// 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: 43914
diff changeset
310 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: 43914
diff changeset
311 (HgPath::new(b""), &self)
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
312 }
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
313
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
314 /// 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
315 /// 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
316 /// 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
317 pub fn check_state(&self) -> Result<(), HgPathError> {
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
318 if self.len() == 0 {
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
319 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
320 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
321 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
322 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
323
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
324 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
325 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
326 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
327 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
328 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
329 0 => {
44312
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
330 return Err(HgPathError::ContainsNullByte {
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
331 bytes: bytes.to_vec(),
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
332 null_byte_index: index,
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
333 })
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
334 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
335 b'/' => {
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
336 if previous_byte.is_some() && previous_byte == Some(b'/') {
44312
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
337 return Err(HgPathError::ConsecutiveSlashes {
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
338 bytes: bytes.to_vec(),
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
339 second_slash_index: index,
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
340 });
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
341 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
342 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
343 _ => (),
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
344 };
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
345 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
346 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
347 Ok(())
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
348 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
349
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
350 #[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
351 /// 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
352 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
353 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
354 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
355 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
356
43914
4b3c8df189bc rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents: 43851
diff changeset
357 impl fmt::Debug for HgPath {
4b3c8df189bc rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents: 43851
diff changeset
358 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: 43851
diff changeset
359 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: 43851
diff changeset
360 }
4b3c8df189bc rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents: 43851
diff changeset
361 }
4b3c8df189bc rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents: 43851
diff changeset
362
43845
c27e688fcdc3 rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
363 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
364 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
365 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
366 }
c27e688fcdc3 rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
367 }
c27e688fcdc3 rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
368
43914
4b3c8df189bc rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents: 43851
diff changeset
369 #[derive(Eq, Ord, Clone, PartialEq, PartialOrd, Hash)]
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
370 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
371 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
372 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
373
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
374 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
375 pub fn new() -> Self {
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
376 Self { inner: 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
377 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
378 pub fn push(&mut self, byte: u8) {
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
379 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
380 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
381 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
382 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
383 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
384 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
385 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
386 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
387 pub fn as_ref(&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
388 self.inner.as_ref()
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
389 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
390 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
391
43914
4b3c8df189bc rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents: 43851
diff changeset
392 impl fmt::Debug for HgPathBuf {
4b3c8df189bc rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents: 43851
diff changeset
393 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: 43851
diff changeset
394 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: 43851
diff changeset
395 }
4b3c8df189bc rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents: 43851
diff changeset
396 }
4b3c8df189bc rust-hg-path: implement more readable custom Debug for HgPath{,Buf}
Martin von Zweigbergk <martinvonz@google.com>
parents: 43851
diff changeset
397
43845
c27e688fcdc3 rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
398 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
399 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
400 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
401 }
c27e688fcdc3 rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
402 }
c27e688fcdc3 rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43250
diff changeset
403
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
404 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
405 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
406
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
407 #[inline]
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
408 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
409 &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
410 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
411 }
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 impl From<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
414 fn from(vec: Vec<u8>) -> Self {
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
415 Self { inner: vec }
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 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
418
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
419 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
420 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
421 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
422 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
423 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
424
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
425 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
426 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
427 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
428 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
429 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
430
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
431 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
432 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
433 &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
434 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
435 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
436
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
437 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
438 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
439
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
440 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
441 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
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 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
446 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
447 self
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 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
452 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
453 self
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 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
458 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
459 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
460 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
461 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
462
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
463 /// 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
464 /// 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
465 /// 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
466
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
467 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
468 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
469 ) -> 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
470 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
471 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
472 #[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
473 {
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
474 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
475 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
476 }
43250
98d996a138de rust-cross-platform: remove `unimplemented!` to get compile-time errors
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42959
diff changeset
477 // TODO Handle other platforms
98d996a138de rust-cross-platform: remove `unimplemented!` to get compile-time errors
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42959
diff changeset
478 // TODO: convert from WTF8 to Windows MBCS (ANSI encoding).
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
479 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
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 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
483 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
484 ) -> 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
485 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
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
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
488 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
489 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
490 ) -> 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
491 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
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 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
496 }
43250
98d996a138de rust-cross-platform: remove `unimplemented!` to get compile-time errors
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42959
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: 42959
diff changeset
498 // 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: 42959
diff changeset
499
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
500 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
501 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
502 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
503
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
504 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
505 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
506 ) -> 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
507 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
508 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
509 #[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
510 {
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
511 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
512 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
513 }
43250
98d996a138de rust-cross-platform: remove `unimplemented!` to get compile-time errors
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42959
diff changeset
514 // TODO Handle other platforms
98d996a138de rust-cross-platform: remove `unimplemented!` to get compile-time errors
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42959
diff changeset
515 // 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: 42959
diff changeset
516
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
517 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
518 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
519 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
520
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
521 #[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
522 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
523 use super::*;
44313
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
524 use pretty_assertions::assert_eq;
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
525
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
526 #[test]
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
527 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
528 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
529 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
530 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
531 );
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
532 assert_eq!(
44312
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
533 Err(HgPathError::ConsecutiveSlashes {
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
534 bytes: b"a/b//c".to_vec(),
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
535 second_slash_index: 4
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
536 }),
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
537 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
538 );
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
539 assert_eq!(
44312
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
540 Err(HgPathError::ContainsNullByte {
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
541 bytes: b"a/b/\0c".to_vec(),
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
542 null_byte_index: 4
c18dd48cea4a rust-pathauditor: add Rust implementation of the `pathauditor`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44266
diff changeset
543 }),
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
544 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
545 );
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
546 // 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
547 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
548 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
549 // 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
550 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
551 // 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
552 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
553 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
554 }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
555
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
556 #[test]
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
557 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
558 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
559 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
560 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
561 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
562 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
563
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
564 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
565 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
566 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
567 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
568 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
569
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
570 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
571 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
572 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
573 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
574 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
575 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
576 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
577
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
578 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
579 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
580 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
581 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
582 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
583 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
584 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
585
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
586 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
587 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
588 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
589 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
590 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
591
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
592 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
593 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
594 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
595
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
596 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
597 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
598 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
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_join() {
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 = 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
604 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
605
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
606 let path = 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
607 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
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 // 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
610 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
611 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
612
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
613 // 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
614 // 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
615 // 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
616 // 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
617 // 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
618 // `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
619 // 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
620 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
621 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
622 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
623 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
624 }
43851
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43845
diff changeset
625
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43845
diff changeset
626 #[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: 43845
diff changeset
627 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: 43845
diff changeset
628 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: 43845
diff changeset
629 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: 43845
diff changeset
630 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: 43845
diff changeset
631
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43845
diff changeset
632 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: 43845
diff changeset
633 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: 43845
diff changeset
634 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: 43845
diff changeset
635
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43845
diff changeset
636 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: 43845
diff changeset
637 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: 43845
diff changeset
638 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: 43845
diff changeset
639
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43845
diff changeset
640 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: 43845
diff changeset
641 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: 43845
diff changeset
642 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: 43845
diff changeset
643
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43845
diff changeset
644 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: 43845
diff changeset
645 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: 43845
diff changeset
646 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: 43845
diff changeset
647
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43845
diff changeset
648 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: 43845
diff changeset
649 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: 43845
diff changeset
650 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: 43845
diff changeset
651
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43845
diff changeset
652 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: 43845
diff changeset
653 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: 43845
diff changeset
654 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: 43845
diff changeset
655 }
44221
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
656
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
657 #[test]
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
658 #[cfg(unix)]
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
659 fn test_split_drive() {
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
660 // 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: 43914
diff changeset
661 assert_eq!(
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
662 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: 43914
diff changeset
663 (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: 43914
diff changeset
664 );
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
665 assert_eq!(
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
666 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: 43914
diff changeset
667 (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: 43914
diff changeset
668 );
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
669 assert_eq!(
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
670 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: 43914
diff changeset
671 (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: 43914
diff changeset
672 );
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
673 // 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: 43914
diff changeset
674 assert_eq!(
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
675 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: 43914
diff changeset
676 (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: 43914
diff changeset
677 );
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
678 assert_eq!(
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
679 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: 43914
diff changeset
680 (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: 43914
diff changeset
681 );
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
682 assert_eq!(
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
683 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: 43914
diff changeset
684 (
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
685 HgPath::new(b""),
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
686 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: 43914
diff changeset
687 )
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
688 );
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
689 }
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
690
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
691 #[test]
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
692 #[cfg(windows)]
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
693 fn test_split_drive() {
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
694 assert_eq!(
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
695 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: 43914
diff changeset
696 (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: 43914
diff changeset
697 );
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
698 assert_eq!(
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
699 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: 43914
diff changeset
700 (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: 43914
diff changeset
701 );
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
702 assert_eq!(
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
703 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: 43914
diff changeset
704 (
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
705 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: 43914
diff changeset
706 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: 43914
diff changeset
707 )
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
708 );
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
709 assert_eq!(
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
710 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: 43914
diff changeset
711 (
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
712 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: 43914
diff changeset
713 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: 43914
diff changeset
714 )
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
715 );
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
716 assert_eq!(
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
717 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: 43914
diff changeset
718 (
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
719 HgPath::new(br""),
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
720 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: 43914
diff changeset
721 )
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
722 );
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
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: 43914
diff changeset
724 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: 43914
diff changeset
725 (
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
726 HgPath::new(br""),
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
727 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: 43914
diff changeset
728 )
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
729 );
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
730 assert_eq!(
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
731 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: 43914
diff changeset
732 (
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
733 HgPath::new(br""),
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
734 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: 43914
diff changeset
735 )
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
736 );
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
737 assert_eq!(
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
738 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: 43914
diff changeset
739 (
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
740 HgPath::new(br""),
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
741 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: 43914
diff changeset
742 )
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
743 );
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
744 // 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: 43914
diff changeset
745 assert_eq!(
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
746 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: 43914
diff changeset
747 (
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
748 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: 43914
diff changeset
749 HgPath::new(br"/foo/bar")
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
750 )
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
751 );
baa4e7fdfd47 rust-utils: add Rust implementation of Python's "os.path.splitdrive"
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43914
diff changeset
752 }
44313
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
753
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
754 #[test]
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
755 fn test_parent() {
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
756 let path = HgPath::new(b"");
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
757 assert_eq!(path.parent(), path);
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
758
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
759 let path = HgPath::new(b"a");
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
760 assert_eq!(path.parent(), HgPath::new(b""));
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
761
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
762 let path = HgPath::new(b"a/b");
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
763 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: 44312
diff changeset
764
9ab4830e9e3d rust-hg-path: add useful methods to `HgPath`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44312
diff changeset
765 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: 44312
diff changeset
766 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: 44312
diff changeset
767 }
42959
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
768 }