forked from gentoo-utils/gentoo-utils
Compare commits
1 Commits
932cf32a24
...
debugging
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
17684d1742 |
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
139
testdata/porthole.txt
vendored
139
testdata/porthole.txt
vendored
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
assert_eq!(
|
||||
line.split_ascii_whitespace().nth(1).unwrap(),
|
||||
&a.to_string()
|
||||
);
|
||||
}
|
||||
Operator::No => {
|
||||
assert!(
|
||||
Atom::parser()
|
||||
let b = Cpv::parser()
|
||||
.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()
|
||||
.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!(),
|
||||
|
||||
Reference in New Issue
Block a user