| @@ -1,25 +1,49 @@ |
| 1 | 1 | use bstr::BString; |
| 2 | +use git_attributes::State; |
| 2 | 3 | use git_pathspec::{MagicSignature, Pattern}; |
| 3 | 4 | |
| 4 | 5 | #[test] |
| 5 | 6 | fn can_parse() { |
| 6 | 7 | let inputs = vec![ |
| 7 | | − ("some/path", pat("some/path", None)), |
| 8 | | − ("some/*.path", pat("some/*.path", None)), |
| 9 | | − (":/", pat("", Some(MagicSignature::TOP))), |
| 10 | | − (":^", pat("", Some(MagicSignature::EXCLUDE))), |
| 11 | | − (":!", pat("", Some(MagicSignature::EXCLUDE))), |
| 12 | | − (":(top)", pat("", Some(MagicSignature::TOP))), |
| 13 | | − (":(literal)", pat("", Some(MagicSignature::LITERAL))), |
| 14 | | − (":(icase)", pat("", Some(MagicSignature::ICASE))), |
| 15 | | − (":(glob)", pat("", Some(MagicSignature::GLOB))), |
| 16 | | − (":(attr)", pat("", Some(MagicSignature::ATTR))), |
| 17 | | − (":(attr:someAttr)", pat("", Some(MagicSignature::ATTR))), |
| 18 | | − (":(attr:!someAttr)", pat("", Some(MagicSignature::ATTR))), |
| 19 | | − (":(attr:-someAttr)", pat("", Some(MagicSignature::ATTR))), |
| 20 | | − (":(attr:someAttr=value)", pat("", Some(MagicSignature::ATTR))), |
| 21 | | − (":(attr:someAttr anotherAttr)", pat("", Some(MagicSignature::ATTR))), |
| 22 | | − (":(exclude)", pat("", Some(MagicSignature::EXCLUDE))), |
| 8 | + ("some/path", pat("some/path", None, vec![])), |
| 9 | + ("some/*.path", pat("some/*.path", None, vec![])), |
| 10 | + (":/", pat("", Some(MagicSignature::TOP), vec![])), |
| 11 | + (":^", pat("", Some(MagicSignature::EXCLUDE), vec![])), |
| 12 | + (":!", pat("", Some(MagicSignature::EXCLUDE), vec![])), |
| 13 | + (":(top)", pat("", Some(MagicSignature::TOP), vec![])), |
| 14 | + (":(literal)", pat("", Some(MagicSignature::LITERAL), vec![])), |
| 15 | + (":(icase)", pat("", Some(MagicSignature::ICASE), vec![])), |
| 16 | + (":(glob)", pat("", Some(MagicSignature::GLOB), vec![])), |
| 17 | + (":(attr)", pat("", Some(MagicSignature::ATTR), vec![])), |
| 18 | + ( |
| 19 | + ":(attr:someAttr)", |
| 20 | + pat("", Some(MagicSignature::ATTR), vec![("someAttr", State::Set)]), |
| 21 | + ), |
| 22 | + ( |
| 23 | + ":(attr:!someAttr)", |
| 24 | + pat("", Some(MagicSignature::ATTR), vec![("someAttr", State::Unspecified)]), |
| 25 | + ), |
| 26 | + ( |
| 27 | + ":(attr:-someAttr)", |
| 28 | + pat("", Some(MagicSignature::ATTR), vec![("someAttr", State::Unset)]), |
| 29 | + ), |
| 30 | + ( |
| 31 | + ":(attr:someAttr=value)", |
| 32 | + pat( |
| 33 | + "", |
| 34 | + Some(MagicSignature::ATTR), |
| 35 | + vec![("someAttr", State::Value("value".into()))], |
| 36 | + ), |
| 37 | + ), |
| 38 | + ( |
| 39 | + ":(attr:someAttr anotherAttr)", |
| 40 | + pat( |
| 41 | + "", |
| 42 | + Some(MagicSignature::ATTR), |
| 43 | + vec![("someAttr", State::Set), ("anotherAttr", State::Set)], |
| 44 | + ), |
| 45 | + ), |
| 46 | + (":(exclude)", pat("", Some(MagicSignature::EXCLUDE), vec![])), |
| 23 | 47 | // TODO: |
| 24 | 48 | // 'literal' and 'glob' cannot appear in the same pathspec together |
| 25 | 49 | // is this the parsers job to handle? |
| @@ -35,17 +59,25 @@ fn can_parse() { · 9 unmodified lines |
| 35 | 59 | // | MagicSignature::ATTR |
| 36 | 60 | // | MagicSignature::EXCLUDE, |
| 37 | 61 | // ), |
| 62 | + // vec![] |
| 38 | 63 | // ), |
| 39 | 64 | // ), |
| 40 | | − (":/:some/path", pat("some/path", Some(MagicSignature::TOP))), |
| 65 | + (":/:some/path", pat("some/path", Some(MagicSignature::TOP), vec![])), |
| 41 | 66 | ( |
| 42 | 67 | ":!(literal)some/*path", |
| 43 | | − pat("some/*path", Some(MagicSignature::EXCLUDE | MagicSignature::LITERAL)), |
| 68 | + pat( |
| 69 | + "some/*path", |
| 70 | + Some(MagicSignature::EXCLUDE | MagicSignature::LITERAL), |
| 71 | + vec![], |
| 72 | + ), |
| 73 | + ), |
| 74 | + (":", pat("", None, vec![])), |
| 75 | + (":()", pat("", None, vec![])), |
| 76 | + (":::::", pat("", None, vec![])), |
| 77 | + ( |
| 78 | + ":!/!/:", |
| 79 | + pat("", Some(MagicSignature::TOP | MagicSignature::EXCLUDE), vec![]), |
| 44 | 80 | ), |
| 45 | | − (":", pat("", None)), |
| 46 | | − (":()", pat("", None)), |
| 47 | | − (":::::", pat("", None)), |
| 48 | | − (":!/!/:", pat("", Some(MagicSignature::TOP | MagicSignature::EXCLUDE))), |
| 49 | 81 | ]; |
| 50 | 82 | |
| 51 | 83 | for (input, expected) in inputs { |
| @@ -98,10 +130,14 @@ fn should_fail_on_whitespace_or_invalid_keywords() { · 46 unmodified lines |
| 98 | 130 | } |
| 99 | 131 | } |
| 100 | 132 | |
| 101 | | −fn pat(path: &str, signature: Option<MagicSignature>) -> Pattern { |
| 133 | +fn pat(path: &str, signature: Option<MagicSignature>, attributes: Vec<(&str, State)>) -> Pattern { |
| 102 | 134 | Pattern { |
| 103 | 135 | path: path.into(), |
| 104 | 136 | signature, |
| 137 | + attributes: attributes |
| 138 | + .into_iter() |
| 139 | + .map(|(attr, state)| (attr.into(), state)) |
| 140 | + .collect(), |
| 105 | 141 | } |
| 106 | 142 | } |
| 107 | 143 | |