diff options
Diffstat (limited to 'vendor/gix-path/src/spec.rs')
-rw-r--r-- | vendor/gix-path/src/spec.rs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/vendor/gix-path/src/spec.rs b/vendor/gix-path/src/spec.rs new file mode 100644 index 000000000..0ff9e661c --- /dev/null +++ b/vendor/gix-path/src/spec.rs @@ -0,0 +1,53 @@ +use std::ffi::OsStr; + +use bstr::{BStr, ByteSlice, ByteVec}; + +use crate::Spec; + +impl std::convert::TryFrom<&OsStr> for Spec { + type Error = crate::Utf8Error; + + fn try_from(value: &OsStr) -> Result<Self, Self::Error> { + crate::os_str_into_bstr(value).map(|value| { + assert_valid_hack(value); + Spec(value.into()) + }) + } +} + +fn assert_valid_hack(input: &BStr) { + assert!(!input.contains_str(b"/../")); + assert!(!input.contains_str(b"/./")); + assert!(!input.starts_with_str(b"../")); + assert!(!input.starts_with_str(b"./")); + assert!(!input.starts_with_str(b"/")); +} + +impl Spec { + /// Parse `input` into a `Spec` or `None` if it could not be parsed + // TODO: tests, actual implementation probably via `gix-pathspec` to make use of the crate after all. + pub fn from_bytes(input: &BStr) -> Option<Self> { + assert_valid_hack(input); + Spec(input.into()).into() + } + /// Return all paths described by this path spec, using slashes on all platforms. + pub fn items(&self) -> impl Iterator<Item = &BStr> { + std::iter::once(self.0.as_bstr()) + } + /// Adjust this path specification according to the given `prefix`, which may be empty to indicate we are the at work-tree root. + // TODO: this is a hack, needs test and time to do according to spec. This is just a minimum version to have -something-. + pub fn apply_prefix(&mut self, prefix: &std::path::Path) -> &Self { + // many more things we can't handle. `Path` never ends with trailing path separator. + let prefix = crate::into_bstr(prefix); + if !prefix.is_empty() { + let mut prefix = crate::to_unix_separators_on_windows(prefix); + { + let path = prefix.to_mut(); + path.push_byte(b'/'); + path.extend_from_slice(&self.0); + } + self.0 = prefix.into_owned(); + } + self + } +} |