Compare commits

..

3 Commits
0.0.6 ... 0.0.9

Author SHA1 Message Date
Andrew Gallant
af48aaa647 another try 2016-09-05 21:57:57 -04:00
Andrew Gallant
ee7f300ae2 windows debug, take 1 2016-09-05 21:46:11 -04:00
Andrew Gallant
a4d8db16f7 Fix glob tests.
When matching directly with a regex, we need to make sure the path is
normalized first.
2016-09-05 21:36:19 -04:00
2 changed files with 21 additions and 14 deletions

View File

@@ -32,8 +32,8 @@ build: false
# Equivalent to Travis' `script` phase # Equivalent to Travis' `script` phase
# TODO modify this phase as you see fit # TODO modify this phase as you see fit
test_script: test_script:
- cargo build --verbose # - cargo build --verbose
- cargo test - cargo test matchslash2 -- --nocapture
before_deploy: before_deploy:
# Generate artifacts for release # Generate artifacts for release

View File

@@ -29,7 +29,6 @@ to make its way into `glob` proper.
use std::error::Error as StdError; use std::error::Error as StdError;
use std::fmt; use std::fmt;
use std::iter; use std::iter;
use std::path;
use std::str; use std::str;
use regex; use regex;
@@ -214,7 +213,7 @@ impl Pattern {
/// regular expression and will represent the matching semantics of this /// regular expression and will represent the matching semantics of this
/// glob pattern and the options given. /// glob pattern and the options given.
pub fn to_regex_with(&self, options: &MatchOptions) -> String { pub fn to_regex_with(&self, options: &MatchOptions) -> String {
let sep = regex::quote(&path::MAIN_SEPARATOR.to_string()); let seps = regex::quote(r"/\");
let mut re = String::new(); let mut re = String::new();
re.push_str("(?-u)"); re.push_str("(?-u)");
if options.case_insensitive { if options.case_insensitive {
@@ -235,26 +234,27 @@ impl Pattern {
} }
Token::Any => { Token::Any => {
if options.require_literal_separator { if options.require_literal_separator {
re.push_str(&format!("[^{}]", sep)); re.push_str(&format!("[^{}]", seps));
} else { } else {
re.push_str("."); re.push_str(".");
} }
} }
Token::ZeroOrMore => { Token::ZeroOrMore => {
if options.require_literal_separator { if options.require_literal_separator {
re.push_str(&format!("[^{}]*", sep)); re.push_str(&format!("[^{}]*", seps));
} else { } else {
re.push_str(".*"); re.push_str(".*");
} }
} }
Token::RecursivePrefix => { Token::RecursivePrefix => {
re.push_str(&format!("(?:{sep}?|.*{sep})", sep=sep)); re.push_str(&format!("(?:[{sep}]?|.*[{sep}])", sep=seps));
} }
Token::RecursiveSuffix => { Token::RecursiveSuffix => {
re.push_str(&format!("(?:{sep}?|{sep}.*)", sep=sep)); re.push_str(&format!("(?:[{sep}]?|[{sep}].*)", sep=seps));
} }
Token::RecursiveZeroOrMore => { Token::RecursiveZeroOrMore => {
re.push_str(&format!("(?:{sep}|{sep}.*{sep})", sep=sep)); re.push_str(&format!("(?:[{sep}]|[{sep}].*[{sep}])",
sep=seps));
} }
Token::Class { negated, ref ranges } => { Token::Class { negated, ref ranges } => {
re.push('['); re.push('[');
@@ -414,6 +414,8 @@ impl<'a> Parser<'a> {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use std::path::Path;
use regex::bytes::Regex; use regex::bytes::Regex;
use super::{Error, Pattern, MatchOptions, SetBuilder, Token}; use super::{Error, Pattern, MatchOptions, SetBuilder, Token};
@@ -461,8 +463,9 @@ mod tests {
#[test] #[test]
fn $name() { fn $name() {
let pat = Pattern::new($pat).unwrap(); let pat = Pattern::new($pat).unwrap();
let path = &Path::new($path).to_str().unwrap();
let re = Regex::new(&pat.to_regex_with(&$options)).unwrap(); let re = Regex::new(&pat.to_regex_with(&$options)).unwrap();
assert!(re.is_match($path.as_bytes())); assert!(re.is_match(path.as_bytes()));
} }
}; };
} }
@@ -475,8 +478,12 @@ mod tests {
#[test] #[test]
fn $name() { fn $name() {
let pat = Pattern::new($pat).unwrap(); let pat = Pattern::new($pat).unwrap();
let path = &Path::new($path).to_str().unwrap();
let re = Regex::new(&pat.to_regex_with(&$options)).unwrap(); let re = Regex::new(&pat.to_regex_with(&$options)).unwrap();
assert!(!re.is_match($path.as_bytes())); // println!("PATTERN: {}", $pat);
// println!("REGEX: {:?}", re);
// println!("PATH: {}", path);
assert!(!re.is_match(path.as_bytes()));
} }
}; };
} }
@@ -557,12 +564,11 @@ mod tests {
case_insensitive: true, case_insensitive: true,
require_literal_separator: false, require_literal_separator: false,
}; };
const SEP: char = ::std::path::MAIN_SEPARATOR;
toregex!(re_casei, "a", "(?i)^a$", &CASEI); toregex!(re_casei, "a", "(?i)^a$", &CASEI);
toregex!(re_slash1, "?", format!("^[^{}]$", SEP), SLASHLIT); toregex!(re_slash1, "?", r"^[^/\\]$", SLASHLIT);
toregex!(re_slash2, "*", format!("^[^{}]*$", SEP), SLASHLIT); toregex!(re_slash2, "*", r"^[^/\\]*$", SLASHLIT);
toregex!(re1, "a", "^a$"); toregex!(re1, "a", "^a$");
toregex!(re2, "?", "^.$"); toregex!(re2, "?", "^.$");
@@ -638,6 +644,7 @@ mod tests {
matches!(matchslash1, "abc/def", "abc/def", SLASHLIT); matches!(matchslash1, "abc/def", "abc/def", SLASHLIT);
nmatches!(matchslash2, "abc?def", "abc/def", SLASHLIT); nmatches!(matchslash2, "abc?def", "abc/def", SLASHLIT);
nmatches!(matchslash2_win, "abc?def", "abc\\def", SLASHLIT);
nmatches!(matchslash3, "abc*def", "abc/def", SLASHLIT); nmatches!(matchslash3, "abc*def", "abc/def", SLASHLIT);
matches!(matchslash4, "abc[/]def", "abc/def", SLASHLIT); // differs matches!(matchslash4, "abc[/]def", "abc/def", SLASHLIT); // differs