rust/hg-core/src/utils/hg_path.rs
author Raphaël Gomès <rgomes@octobus.net>
Fri, 29 Nov 2019 17:24:40 +0100
changeset 43833 4f1543a2f5c3
parent 43827 c27e688fcdc3
child 43908 4b3c8df189bc
permissions -rw-r--r--
rust-hg-path: add method to get part of a path relative to a prefix This will be used in the next patch in this series. Differential Revision: https://phab.mercurial-scm.org/D7526
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42956
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
     1
// hg_path.rs
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
     2
//
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
     3
// Copyright 2019 Raphaël Gomès <rgomes@octobus.net>
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
     4
//
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
     5
// This software may be used and distributed according to the terms of the
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
     6
// GNU General Public License version 2 or any later version.
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
     7
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
     8
use std::borrow::Borrow;
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};
43827
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;
42956
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    11
use std::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>),
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    18
    /// Bytes and index of the second slash
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    19
    ConsecutiveSlashes(Vec<u8>, usize),
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    20
    /// Bytes and index of the null byte
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    21
    ContainsNullByte(Vec<u8>, usize),
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    22
    /// Bytes
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    23
    DecodeError(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
    24
}
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    25
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    26
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
    27
    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
    28
        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
    29
            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
    30
                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
    31
            }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    32
            HgPathError::ConsecutiveSlashes(bytes, pos) => format!(
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    33
                "Invalid HgPath '{:?}': consecutive slahes 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
    34
                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
    35
            ),
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    36
            HgPathError::ContainsNullByte(bytes, pos) => format!(
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    37
                "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
    38
                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
    39
            ),
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    40
            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
    41
                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
    42
            }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    43
        }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    44
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    45
}
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    46
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    47
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
    48
    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
    49
        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
    50
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    51
}
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    52
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    53
/// 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
    54
///     - 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
    55
///     - `/` 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
    56
///     - 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
    57
///     - 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
    58
///     - 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
    59
///     - 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
    60
///
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    61
/// 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
    62
/// 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
    63
/// 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
    64
/// operation.
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    65
///
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    66
/// 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
    67
/// 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
    68
/// 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
    69
/// 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
    70
/// 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
    71
/// 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
    72
//
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    73
// 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
    74
// `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
    75
// 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
    76
// 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
    77
// `#[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
    78
// 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
    79
// detail, are not documented and must not be relied upon.
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    80
#[derive(Eq, Ord, PartialEq, PartialOrd, Debug, Hash)]
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    81
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
    82
    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
    83
}
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    84
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    85
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
    86
    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
    87
        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
    88
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    89
    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
    90
        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
    91
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    92
    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
    93
        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
    94
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    95
    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
    96
        HgPathBuf {
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    97
            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
    98
        }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
    99
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   100
    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
   101
        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
   102
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   103
    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
   104
        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
   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
    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
   107
        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
   108
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   109
    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
   110
        &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
   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
    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
   113
        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
   114
    }
43833
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   115
    pub fn starts_with(&self, needle: impl AsRef<HgPath>) -> bool {
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   116
        self.inner.starts_with(needle.as_ref().as_bytes())
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   117
    }
42956
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   118
    pub fn join<T: ?Sized + AsRef<HgPath>>(&self, other: &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
   119
        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
   120
        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
   121
            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
   122
        }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   123
        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
   124
        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
   125
    }
43833
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   126
    /// Given a base directory, returns the slice of `self` relative to the
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   127
    /// base directory. If `base` is not a directory (does not end with a
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   128
    /// `b'/'`), returns `None`.
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   129
    pub fn relative_to(&self, base: impl AsRef<HgPath>) -> Option<&HgPath> {
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   130
        let base = base.as_ref();
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   131
        if base.is_empty() {
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   132
            return Some(self);
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   133
        }
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   134
        let is_dir = base.as_bytes().ends_with(b"/");
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   135
        if is_dir && self.starts_with(base) {
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   136
            Some(HgPath::new(&self.inner[base.len()..]))
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   137
        } else {
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   138
            None
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   139
        }
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   140
    }
42956
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   141
    /// 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
   142
    /// 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
   143
    /// 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
   144
    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
   145
        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
   146
            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
   147
        }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   148
        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
   149
        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
   150
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   151
        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
   152
            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
   153
        }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   154
        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
   155
            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
   156
                0 => {
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   157
                    return Err(HgPathError::ContainsNullByte(
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   158
                        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
   159
                        index,
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
                }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   162
                b'/' => {
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   163
                    if previous_byte.is_some() && previous_byte == 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
   164
                        return Err(HgPathError::ConsecutiveSlashes(
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   165
                            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
   166
                            index,
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   167
                        ));
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   168
                    }
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
                _ => (),
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   171
            };
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   172
            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
   173
        }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   174
        Ok(())
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   175
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   176
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   177
    #[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
   178
    /// 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
   179
    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
   180
        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
   181
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   182
}
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   183
43827
c27e688fcdc3 rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Raphaël Gomès <rgomes@octobus.net>
parents: 43250
diff changeset
   184
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
   185
    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
   186
        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
   187
    }
c27e688fcdc3 rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Raphaël Gomès <rgomes@octobus.net>
parents: 43250
diff changeset
   188
}
c27e688fcdc3 rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Raphaël Gomès <rgomes@octobus.net>
parents: 43250
diff changeset
   189
42956
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   190
#[derive(Eq, Ord, Clone, PartialEq, PartialOrd, Debug, Hash)]
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   191
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
   192
    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
   193
}
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   194
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   195
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
   196
    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
   197
        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
   198
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   199
    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
   200
        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
   201
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   202
    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
   203
        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
   204
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   205
    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
   206
        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
   207
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   208
    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
   209
        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
   210
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   211
}
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   212
43827
c27e688fcdc3 rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Raphaël Gomès <rgomes@octobus.net>
parents: 43250
diff changeset
   213
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
   214
    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
   215
        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
   216
    }
c27e688fcdc3 rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Raphaël Gomès <rgomes@octobus.net>
parents: 43250
diff changeset
   217
}
c27e688fcdc3 rust-hg-path: implement `Display` for `HgPath` and `HgPathBuf`
Raphaël Gomès <rgomes@octobus.net>
parents: 43250
diff changeset
   218
42956
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   219
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
   220
    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
   221
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   222
    #[inline]
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   223
    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
   224
        &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
   225
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   226
}
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   227
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   228
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
   229
    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
   230
        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
   231
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   232
}
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   233
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   234
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
   235
    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
   236
        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
   237
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   238
}
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   239
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   240
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
   241
    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
   242
        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
   243
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   244
}
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   245
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   246
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
   247
    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
   248
        &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
   249
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   250
}
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   251
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   252
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
   253
    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
   254
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   255
    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
   256
        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
   257
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   258
}
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   259
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   260
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
   261
    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
   262
        self
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   263
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   264
}
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   265
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   266
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
   267
    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
   268
        self
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   269
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   270
}
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   271
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   272
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
   273
    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
   274
        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
   275
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   276
}
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   277
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   278
/// 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
   279
/// 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
   280
/// 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
   281
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   282
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
   283
    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
   284
) -> 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
   285
    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
   286
    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
   287
    #[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
   288
    {
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   289
        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
   290
        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
   291
    }
43250
98d996a138de rust-cross-platform: remove `unimplemented!` to get compile-time errors
Raphaël Gomès <rgomes@octobus.net>
parents: 42956
diff changeset
   292
    // TODO Handle other platforms
98d996a138de rust-cross-platform: remove `unimplemented!` to get compile-time errors
Raphaël Gomès <rgomes@octobus.net>
parents: 42956
diff changeset
   293
    // TODO: convert from WTF8 to Windows MBCS (ANSI encoding).
42956
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   294
    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
   295
}
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   296
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   297
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
   298
    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
   299
) -> 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
   300
    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
   301
}
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   302
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   303
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
   304
    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
   305
) -> 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
   306
    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
   307
    #[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
   308
    {
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   309
        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
   310
        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
   311
    }
43250
98d996a138de rust-cross-platform: remove `unimplemented!` to get compile-time errors
Raphaël Gomès <rgomes@octobus.net>
parents: 42956
diff changeset
   312
    // TODO Handle other platforms
98d996a138de rust-cross-platform: remove `unimplemented!` to get compile-time errors
Raphaël Gomès <rgomes@octobus.net>
parents: 42956
diff changeset
   313
    // TODO: convert from WTF8 to Windows MBCS (ANSI encoding).
98d996a138de rust-cross-platform: remove `unimplemented!` to get compile-time errors
Raphaël Gomès <rgomes@octobus.net>
parents: 42956
diff changeset
   314
42956
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   315
    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
   316
    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
   317
}
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   318
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   319
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
   320
    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
   321
) -> 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
   322
    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
   323
    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
   324
    #[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
   325
    {
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   326
        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
   327
        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
   328
    }
43250
98d996a138de rust-cross-platform: remove `unimplemented!` to get compile-time errors
Raphaël Gomès <rgomes@octobus.net>
parents: 42956
diff changeset
   329
    // TODO Handle other platforms
98d996a138de rust-cross-platform: remove `unimplemented!` to get compile-time errors
Raphaël Gomès <rgomes@octobus.net>
parents: 42956
diff changeset
   330
    // TODO: convert from WTF8 to Windows MBCS (ANSI encoding).
98d996a138de rust-cross-platform: remove `unimplemented!` to get compile-time errors
Raphaël Gomès <rgomes@octobus.net>
parents: 42956
diff changeset
   331
42956
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   332
    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
   333
    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
   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
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   336
#[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
   337
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
   338
    use super::*;
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   339
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   340
    #[test]
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   341
    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
   342
        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
   343
            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
   344
            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
   345
        );
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   346
        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
   347
            Err(HgPathError::ConsecutiveSlashes(b"a/b//c".to_vec(), 4)),
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   348
            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
   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
        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
   351
            Err(HgPathError::ContainsNullByte(b"a/b/\0c".to_vec(), 4)),
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   352
            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
   353
        );
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   354
        // 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
   355
        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
   356
        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
   357
        // 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
   358
        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
   359
        // 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
   360
        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
   361
        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
   362
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   363
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   364
    #[test]
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   365
    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
   366
        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
   367
        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
   368
        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
   369
        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
   370
        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
   371
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   372
        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
   373
        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
   374
        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
   375
        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
   376
        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
   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
        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
   379
        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
   380
        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
   381
        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
   382
        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
   383
        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
   384
        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
   385
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   386
        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
   387
        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
   388
        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
   389
        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
   390
        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
   391
        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
   392
        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
   393
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   394
        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
   395
        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
   396
        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
   397
        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
   398
        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
   399
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   400
        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
   401
        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
   402
        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
   403
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   404
        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
   405
        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
   406
        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
   407
    }
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   408
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   409
    #[test]
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   410
    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
   411
        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
   412
        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
   413
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   414
        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
   415
        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
   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
        // 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
   418
        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
   419
        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
   420
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   421
        // 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
   422
        // 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
   423
        // 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
   424
        // 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
   425
        // 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
   426
        // `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
   427
        // 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
   428
        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
   429
        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
   430
        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
   431
        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
   432
    }
43833
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   433
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   434
    #[test]
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   435
    fn test_relative_to() {
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   436
        let path = HgPath::new(b"");
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   437
        let base = HgPath::new(b"");
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   438
        assert_eq!(Some(path), path.relative_to(base));
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   439
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   440
        let path = HgPath::new(b"path");
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   441
        let base = HgPath::new(b"");
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   442
        assert_eq!(Some(path), path.relative_to(base));
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   443
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   444
        let path = HgPath::new(b"a");
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   445
        let base = HgPath::new(b"b");
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   446
        assert_eq!(None, path.relative_to(base));
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   447
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   448
        let path = HgPath::new(b"a/b");
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   449
        let base = HgPath::new(b"a");
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   450
        assert_eq!(None, path.relative_to(base));
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   451
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   452
        let path = HgPath::new(b"a/b");
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   453
        let base = HgPath::new(b"a/");
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   454
        assert_eq!(Some(HgPath::new(b"b")), path.relative_to(base));
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   455
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   456
        let path = HgPath::new(b"nested/path/to/b");
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   457
        let base = HgPath::new(b"nested/path/");
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   458
        assert_eq!(Some(HgPath::new(b"to/b")), path.relative_to(base));
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   459
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   460
        let path = HgPath::new(b"ends/with/dir/");
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   461
        let base = HgPath::new(b"ends/");
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   462
        assert_eq!(Some(HgPath::new(b"with/dir/")), path.relative_to(base));
4f1543a2f5c3 rust-hg-path: add method to get part of a path relative to a prefix
Raphaël Gomès <rgomes@octobus.net>
parents: 43827
diff changeset
   463
    }
42956
3fe40dd6355d rust-hgpath: add HgPath and HgPathBuf structs to encapsulate handling of paths
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
   464
}