summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Turner <jturner.usa@gmail.com>2025-11-14 20:38:31 +0000
committerJohn Turner <jturner.usa@gmail.com>2025-11-14 20:38:31 +0000
commit17684d17428d1fcab12f4ea363d44dd24f4680a0 (patch)
tree6088badb47563fcc49c20091f5f57747fa52ce81
parent85853ada1e3c8ecfdffa72fad4fcf34860661f35 (diff)
downloadgentoo-utils-debugging.tar.gz
debuggingdebugging
-rw-r--r--Cargo.lock2
-rw-r--r--Cargo.toml2
-rw-r--r--src/ebuild/parsers.rs20
-rw-r--r--testdata/porthole.txt145
-rw-r--r--tests/porthole.rs93
5 files changed, 211 insertions, 51 deletions
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
-
-+ >=media-video/knob-goblin-1.0_alpha-r4
-+ media-video/knobgoblin:4
-
-- /hello
-- group/-1.0
-- >=/
-- >=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
+**********************
+*** porthole tests ***
+**********************
+
+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
+
+*** 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
+
+*************************
+*** 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()
- );
- }
- Operator::No => {
- assert!(
- Atom::parser()
- .parse_finished(InputIter::new(
- line.split_ascii_whitespace().nth(1).unwrap()
- ))
- .is_err()
+ 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!(),