1 Commits

Author SHA1 Message Date
John Turner
17684d1742 debugging 2025-11-14 20:38:31 +00:00
5 changed files with 208 additions and 48 deletions

2
Cargo.lock generated
View File

@@ -40,7 +40,7 @@ dependencies = [
[[package]] [[package]]
name = "mon" name = "mon"
version = "0.1.0" 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]] [[package]]
name = "proc-macro2" name = "proc-macro2"

View File

@@ -4,7 +4,7 @@ version = "0.1.0"
edition = "2024" edition = "2024"
[dependencies] [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" } get = { git = "https://jturnerusa.dev/cgit/get/", rev = "cd5f75b65777a855ab010c3137304ac05f2e56b8" }
itertools = "0.14.0" itertools = "0.14.0"
thiserror = "2.0.17" thiserror = "2.0.17"

View File

@@ -117,20 +117,29 @@ where
let all_of_group = Depend::parser() let all_of_group = Depend::parser()
.separated_by(whitespace1()) .separated_by(whitespace1())
.at_least(1) .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)); .map(|exprs| Depend::AllOf(exprs));
let any_of_group = Depend::parser() let any_of_group = Depend::parser()
.separated_by(whitespace1()) .separated_by(whitespace1())
.at_least(1) .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())) .preceded_by(tag("||").followed_by(whitespace1()))
.map(|exprs| Depend::AnyOf(exprs)); .map(|exprs| Depend::AnyOf(exprs));
let one_of_group = Depend::parser() let one_of_group = Depend::parser()
.separated_by(whitespace1()) .separated_by(whitespace1())
.at_least(1) .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())) .preceded_by(tag("^^").followed_by(whitespace1()))
.map(|exprs| Depend::OneOf(exprs)); .map(|exprs| Depend::OneOf(exprs));
@@ -140,7 +149,10 @@ where
Depend::parser() Depend::parser()
.separated_by(whitespace1()) .separated_by(whitespace1())
.at_least(1) .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)); .map(|(conditional, exprs)| Depend::ConditionalGroup(conditional, exprs));

139
testdata/porthole.txt vendored
View File

@@ -1,19 +1,126 @@
+ something/package **********************
+ something/package *** porthole tests ***
- some#thing/package **********************
+ =cat/package-1.0:0/2.0
- something/pac?kage
- =something/+package-1.0:3.0
- a b c
+ >=media-video/knob-goblin-1.0_alpha-r4 cp+ something/package
+ media-video/knobgoblin:4 cp+ something/package
cp- some#thing/package
cpv+ foo/package-1.0:0/2.0
cp- something/pac?kage
cp- a b c
- /hello *** https://github.com/pkgcore/pkgcore/pull/420
- group/-1.0 *** I accidentally stumbled upon this old bug somehow in pkgcore
- >=/ *** and was curious if we would pass it.
- >=media-video/revised-knob-3.0aaaaaaaaa-r15 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 *** pkgcore cpv tests ***
< cat/test-1.0 cat/test-2.0 *************************
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

View File

@@ -2,9 +2,9 @@ use std::cmp::Ordering;
use gentoo_utils::{ use gentoo_utils::{
Parseable, 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!( static PORTHOLE_TXT: &'static str = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"), env!("CARGO_MANIFEST_DIR"),
@@ -12,29 +12,38 @@ static PORTHOLE_TXT: &'static str = include_str!(concat!(
)); ));
enum Operator { enum Operator {
Comment, Cpv(bool),
Yes, Cp(bool),
No,
Eq, Eq,
Ne,
Gt, Gt,
Lt, Lt,
} }
fn parse_operator<'a>() -> impl Parser<&'a str, Output = Operator> { fn parse_operator<'a>() -> impl Parser<&'a str, Output = Operator> {
let comment = tag("***").map(|_| Operator::Comment); let cpvyes = tag("cpv+").map(|_: &str| Operator::Cpv(true));
let yes = tag("+").map(|_| Operator::Yes); let cpvno = tag("cpv-").map(|_: &str| Operator::Cpv(false));
let no = tag("-").map(|_| Operator::No); let cpyes = tag("cp+").map(|_| Operator::Cp(true));
let cpno = tag("cp-").map(|_: &str| Operator::Cp(false));
let eq = tag("=").map(|_| Operator::Eq); let eq = tag("=").map(|_| Operator::Eq);
let ne = tag("!=").map(|_: &str| Operator::Ne);
let gt = tag(">").map(|_| Operator::Gt); let gt = tag(">").map(|_| Operator::Gt);
let lt = tag("<").map(|_| Operator::Lt); 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] #[test]
fn test_porthole() { fn test_porthole() {
for line in PORTHOLE_TXT.lines() { for line in PORTHOLE_TXT.lines() {
if line.is_empty() { if line.is_empty() || line.starts_with("*") {
continue; continue;
} }
@@ -45,29 +54,62 @@ fn test_porthole() {
.unwrap(); .unwrap();
match &operator { match &operator {
Operator::Comment => continue, Operator::Cpv(is_err) => {
Operator::Yes => { let col = line.split_ascii_whitespace().nth(1).unwrap();
let a = Atom::parser()
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( .parse_finished(InputIter::new(
line.split_ascii_whitespace().nth(1).unwrap(), line.split_ascii_whitespace().nth(1).unwrap(),
)) ))
.unwrap(); .unwrap();
assert_eq!( let b = Cpv::parser()
line.split_ascii_whitespace().nth(1).unwrap(),
&a.to_string()
);
}
Operator::No => {
assert!(
Atom::parser()
.parse_finished(InputIter::new( .parse_finished(InputIter::new(
line.split_ascii_whitespace().nth(1).unwrap() line.split_ascii_whitespace().nth(2).unwrap(),
)) ))
.is_err() .unwrap();
assert_eq!(
a.eq(&b),
match &operator {
Operator::Eq => true,
Operator::Ne => false,
_ => unreachable!(),
}
); );
} }
Operator::Eq | Operator::Gt | Operator::Lt => {
Operator::Gt | Operator::Lt => {
let a = Cpv::parser() let a = Cpv::parser()
.parse_finished(InputIter::new( .parse_finished(InputIter::new(
line.split_ascii_whitespace().nth(1).unwrap(), line.split_ascii_whitespace().nth(1).unwrap(),
@@ -83,7 +125,6 @@ fn test_porthole() {
assert_eq!( assert_eq!(
a.partial_cmp(&b).unwrap(), a.partial_cmp(&b).unwrap(),
match &operator { match &operator {
Operator::Eq => Ordering::Equal,
Operator::Gt => Ordering::Greater, Operator::Gt => Ordering::Greater,
Operator::Lt => Ordering::Less, Operator::Lt => Ordering::Less,
_ => unreachable!(), _ => unreachable!(),