forked from gentoo-utils/gentoo-utils
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
17684d1742 |
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
139
testdata/porthole.txt
vendored
@@ -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
|
||||||
|
|||||||
@@ -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!(),
|
||||||
|
|||||||
Reference in New Issue
Block a user