diff --git a/Cargo.lock b/Cargo.lock index a4b5c42..6630a2a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -40,7 +40,7 @@ dependencies = [ [[package]] name = "mon" version = "0.1.0" -source = "git+https://jturnerusa.dev/cgit/mon/?rev=5b7d7eec545864727d33bb59503f0349cf02b337#5b7d7eec545864727d33bb59503f0349cf02b337" +source = "git+https://jturnerusa.dev/cgit/mon/?rev=e6c5335d43bfbf2fffa3d3c44cde404c970e5ee6#e6c5335d43bfbf2fffa3d3c44cde404c970e5ee6" [[package]] name = "proc-macro2" diff --git a/Cargo.toml b/Cargo.toml index 26d1de3..5e1525b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2024" [dependencies] -mon = { git = "https://jturnerusa.dev/cgit/mon/", rev = "5b7d7eec545864727d33bb59503f0349cf02b337" } +mon = { git = "https://jturnerusa.dev/cgit/mon/", rev = "e6c5335d43bfbf2fffa3d3c44cde404c970e5ee6" } get = { git = "https://jturnerusa.dev/cgit/get/", rev = "cd5f75b65777a855ab010c3137304ac05f2e56b8" } itertools = "0.14.0" thiserror = "2.0.17" diff --git a/src/ebuild/parsers.rs b/src/ebuild/parsers.rs index 8ab2978..bf5a03e 100644 --- a/src/ebuild/parsers.rs +++ b/src/ebuild/parsers.rs @@ -117,20 +117,29 @@ where let all_of_group = Depend::parser() .separated_by(whitespace1()) .at_least(1) - .delimited_by(tag("(").followed_by(whitespace1()), tag(")")) + .delimited_by( + tag("(").followed_by(whitespace1()), + tag(")").preceded_by(whitespace1().opt()), + ) .map(|exprs| Depend::AllOf(exprs)); let any_of_group = Depend::parser() .separated_by(whitespace1()) .at_least(1) - .delimited_by(tag("(").followed_by(whitespace1()), tag(")")) + .delimited_by( + tag("(").followed_by(whitespace1()), + tag(")").preceded_by(whitespace1().opt()), + ) .preceded_by(tag("||").followed_by(whitespace1())) .map(|exprs| Depend::AnyOf(exprs)); let one_of_group = Depend::parser() .separated_by(whitespace1()) .at_least(1) - .delimited_by(tag("(").followed_by(whitespace1()), tag(")")) + .delimited_by( + tag("(").followed_by(whitespace1()), + tag(")").preceded_by(whitespace1().opt()), + ) .preceded_by(tag("^^").followed_by(whitespace1())) .map(|exprs| Depend::OneOf(exprs)); @@ -140,7 +149,10 @@ where Depend::parser() .separated_by(whitespace1()) .at_least(1) - .delimited_by(tag("(").followed_by(whitespace1()), tag(")")), + .delimited_by( + tag("(").followed_by(whitespace1()), + tag(")").preceded_by(whitespace1().opt()), + ), ) .map(|(conditional, exprs)| Depend::ConditionalGroup(conditional, exprs)); diff --git a/testdata/porthole.txt b/testdata/porthole.txt index 99abf89..20f2beb 100644 --- a/testdata/porthole.txt +++ b/testdata/porthole.txt @@ -1,19 +1,126 @@ -+ something/package -+ something/package -- some#thing/package -+ =cat/package-1.0:0/2.0 -- something/pac?kage -- =something/+package-1.0:3.0 -- a b c +********************** +*** porthole tests *** +********************** -+ >=media-video/knob-goblin-1.0_alpha-r4 -+ media-video/knobgoblin:4 +cp+ something/package +cp+ something/package +cp- some#thing/package +cpv+ foo/package-1.0:0/2.0 +cp- something/pac?kage +cp- a b c -- /hello -- group/-1.0 -- >=/ -- >=media-video/revised-knob-3.0aaaaaaaaa-r15 +*** https://github.com/pkgcore/pkgcore/pull/420 +*** I accidentally stumbled upon this old bug somehow in pkgcore +*** and was curious if we would pass it. +cp- >=media-video/knobgoblin:4 +cp- /hello +cp- group/-1.0 +cp- >=/ +cp- >=media-video/revised-knob-3.0aaaaaaaaa-r15 -*** sanity check -> cat/test-2.0 cat/test-1.0 -< cat/test-1.0 cat/test-2.0 +************************* +*** pkgcore cpv tests *** +************************* + +cp+ dev-util/pkg +cp+ dev+/pkg +cp+ dev-util+/pkg +cp+ DEV-UTIL/pkg +cp+ aaa0/pkg +cp+ aaa-0/pkg +*** + multi/depth (what?) +cp+ cross-dev_idiot.hacks-suck/pkg +cp+ a/pkg +cp+ foo---/pkg +cp+ multi--hyphen/pkg +cp- .util/pkg +cp+ _dev/pkg +cp- dev-util /pkg +*** - multi//depth/pkg + +cp+ cat/diffball +cp+ cat/a9 +cp+ cat/a9+ +* + cat/a-100dpi +cp+ cat/diff-mode- +cp+ cat/multi--hyphen +cp+ cat/timidity-- +cp+ cat/frob--- +cp+ cat/diffball-9- +*** - cat/diffball +*** - cat/diffball-9 +cp+ cat/a-3D +cp- cat/-df +cp- cat/+dfa +* - cat/timidity--9f +* - cat/ormaybe---13_beta +* - cat/bar-11-r3 + +cp+ bbb-9/foon +cp+ dev-util/diffball +cp+ dev-util/diffball-a9 +cp+ dev-ut-asdf/emacs-cvs +cp+ xfce-base/xfce4 +cp+ bah/f-100dpi +cp+ dev-util/diffball-blah-monkeys +cp+ virtual/7z +* this is vlaid, +cp+ x11-drivers/xf86-video-r128 + +cpv+ dev-perl/mod-p-1 +cpv+ dev-perl/mod-p-2.3.4 +cpv+ dev-perl/mod-p-2.3.4a +cpv+ dev-perl/mod-p-02.3 +cpv+ dev-perl/mod-p-2.03 +cpv+ dev-perl/mod-p-3d +cpv- dev-perl/mod-p-3D +cpv- dev-perl/mod-p-2.3a.4 +cpv- dev-perl/mod-p-2.a.3 +cpv- dev-perl/mod-p-2.3_ +* - dev-perl/mod-p-2.3 +cpv- dev-perl/mod-p-2.3. +cpv- dev-perl/mod-p-cvs.2 +cpv+ dev-perl/mod-p-1-r1 +cpv+ dev-perl/mod-p-1-r300 +cpv+ dev-perl/mod-p-1-r0 +cpv+ dev-perl/mod-p-1-r10000000000000000000000 +cpv- dev-perl/mod-p-1-r +cpv- dev-perl/mod-p-1-ra +cpv- dev-perl/mod-p-1-r +cpv- dev-perl/mod-p-1-R1 + +*** skipping some tests for now, lazy + +> da/ba-6a da/ba-6 +> da/ba-6a-r1 da/ba-6a +> da/ba-6.0 da/ba-6 +> da/ba-6.0.0 da/ba-6.0b +> da/ba-6.02 da/ba-6.0.0 +> da/ba-6.2 da/ba-6.054 += da/ba-6 da/ba-6 +> db/ba da/ba +> da/bb da/ba +> da/ba-6.0_alpha0_p1 da/ba-6.0_alpha += da/ba-6.0_alpha da/ba-6.0_alpha0 +> da/ba-6.1 da/ba-6.09 +> da/ba-6.0.1 da/ba-6.0 +> da/ba-12.2.5 da/ba-12.2b +> dev-lang/erlang-12.2.5 dev-lang/erlang-12.2b +> dev-lang/erlang-12.2.5-r1 dev-lang/erlang-12.2b += da/ba-6.01.0 da/ba-6.010.0 += da/ba-6.0.1 da/ba-6.000.1 += da/ba-6.01.0 da/ba-6.01.0-r0 += da/ba-6.01.0-r0 da/ba-6.01.0-r00 += da/ba-6.01.0-r1 da/ba-6.01.0-r001 +< da/ba-1.001000000000000000001 da/ba-1.001000000000000000002 +< da/ba-1.00100000000 da/ba-1.0010000000000000001 +< da/ba-1.01 da/ba-1.1 +> da/ba-10181 da/ba-1181 +> da/ba-10361 da/ba-1361 +> da/ba-101001 da/ba-11001 +> sys-apps/net-tools-1.60_p2010081516093 sys-apps/net-tools-1.60_p2009072801401 +> sys-apps/net-tools-1.60_p20100815160931 sys-apps/net-tools-1.60_p20090728014017 +> sys-apps/net-tools-1.60_p20100815160931 sys-apps/net-tools-1.60_p20090728014017-r1 +!= da/ba-6.0_alpha0_p1 da/ba-6.0_alpha += da/ba-6.0_alpha0 da/ba-6.0_alpha +!= da/ba-6.0 da/ba diff --git a/tests/porthole.rs b/tests/porthole.rs index 3efbffe..2c55ffe 100644 --- a/tests/porthole.rs +++ b/tests/porthole.rs @@ -2,9 +2,9 @@ use std::cmp::Ordering; use gentoo_utils::{ Parseable, - atom::{Atom, Cpv}, + atom::{Cp, Cpv}, }; -use mon::{Parser, input::InputIter, tag}; +use mon::{Parser, ParserIter, input::InputIter, tag}; static PORTHOLE_TXT: &'static str = include_str!(concat!( env!("CARGO_MANIFEST_DIR"), @@ -12,29 +12,38 @@ static PORTHOLE_TXT: &'static str = include_str!(concat!( )); enum Operator { - Comment, - Yes, - No, + Cpv(bool), + Cp(bool), Eq, + Ne, Gt, Lt, } fn parse_operator<'a>() -> impl Parser<&'a str, Output = Operator> { - let comment = tag("***").map(|_| Operator::Comment); - let yes = tag("+").map(|_| Operator::Yes); - let no = tag("-").map(|_| Operator::No); + let cpvyes = tag("cpv+").map(|_: &str| Operator::Cpv(true)); + let cpvno = tag("cpv-").map(|_: &str| Operator::Cpv(false)); + let cpyes = tag("cp+").map(|_| Operator::Cp(true)); + let cpno = tag("cp-").map(|_: &str| Operator::Cp(false)); let eq = tag("=").map(|_| Operator::Eq); + let ne = tag("!=").map(|_: &str| Operator::Ne); let gt = tag(">").map(|_| Operator::Gt); let lt = tag("<").map(|_| Operator::Lt); - comment.or(yes).or(no).or(eq).or(gt).or(lt) + cpvyes + .or(cpvno) + .or(cpyes) + .or(cpno) + .or(eq) + .or(ne) + .or(gt) + .or(lt) } #[test] fn test_porthole() { for line in PORTHOLE_TXT.lines() { - if line.is_empty() { + if line.is_empty() || line.starts_with("*") { continue; } @@ -45,29 +54,62 @@ fn test_porthole() { .unwrap(); match &operator { - Operator::Comment => continue, - Operator::Yes => { - let a = Atom::parser() + Operator::Cpv(is_err) => { + let col = line.split_ascii_whitespace().nth(1).unwrap(); + + let cpv = Cpv::parser().parse_finished(InputIter::new(col)); + + match (dbg!(cpv), is_err) { + (Ok(cpv), true) => { + assert_eq!(&cpv.to_string(), col); + } + (Err(_), false) => (), + _ => { + panic!("{line}"); + } + }; + } + + Operator::Cp(is_err) => { + let col = line.split_ascii_whitespace().nth(1).unwrap(); + + let cp = Cp::parser().parse_finished(InputIter::new(col)); + + match (cp, is_err) { + (Ok(cp), true) => { + assert_eq!(&cp.to_string(), col); + } + (Err(_), false) => (), + _ => { + panic!("{line}"); + } + }; + } + + Operator::Eq | Operator::Ne => { + let a = Cpv::parser() .parse_finished(InputIter::new( line.split_ascii_whitespace().nth(1).unwrap(), )) .unwrap(); + let b = Cpv::parser() + .parse_finished(InputIter::new( + line.split_ascii_whitespace().nth(2).unwrap(), + )) + .unwrap(); + assert_eq!( - line.split_ascii_whitespace().nth(1).unwrap(), - &a.to_string() + a.eq(&b), + match &operator { + Operator::Eq => true, + Operator::Ne => false, + _ => unreachable!(), + } ); } - Operator::No => { - assert!( - Atom::parser() - .parse_finished(InputIter::new( - line.split_ascii_whitespace().nth(1).unwrap() - )) - .is_err() - ); - } - Operator::Eq | Operator::Gt | Operator::Lt => { + + Operator::Gt | Operator::Lt => { let a = Cpv::parser() .parse_finished(InputIter::new( line.split_ascii_whitespace().nth(1).unwrap(), @@ -83,7 +125,6 @@ fn test_porthole() { assert_eq!( a.partial_cmp(&b).unwrap(), match &operator { - Operator::Eq => Ordering::Equal, Operator::Gt => Ordering::Greater, Operator::Lt => Ordering::Less, _ => unreachable!(),