X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FCPANPLUS-Dist-Gentoo.git;a=blobdiff_plain;f=lib%2FCPANPLUS%2FDist%2FGentoo%2FAtom.pm;h=45a68c5b90ff08b05c92b5c13d7da886e204cbb0;hp=b017e6be25be43e6e26014ab7ac07dc04621ac63;hb=74685418c28730b1369e262955b9ffef57cda050;hpb=00e09b5e966914ebedb5c08927cf5a66af177171 diff --git a/lib/CPANPLUS/Dist/Gentoo/Atom.pm b/lib/CPANPLUS/Dist/Gentoo/Atom.pm index b017e6b..45a68c5 100644 --- a/lib/CPANPLUS/Dist/Gentoo/Atom.pm +++ b/lib/CPANPLUS/Dist/Gentoo/Atom.pm @@ -49,15 +49,20 @@ sub new { } } + Carp::confess('Minimum atoms require a valid version') if not defined $version + and $args{minimum}; + bless { category => $category, name => $name, version => $name, + minimum => $args{minimum}, + ebuild => $args{ebuild}, }, $class; } BEGIN { - eval "sub $_ { \$_[0]->{$_} }" for qw/category name version/; + eval "sub $_ { \$_[0]->{$_} }" for qw/category name version minimum ebuild/; } sub cmp { @@ -82,7 +87,50 @@ sub cmp { sub as_string { my ($a) = @_; - $a->category . '/' . $a->name . '-' . $a->version; + my $atom = $a->category . '/' . $a->name; + + my $version = $a->version; + if (defined $version) { + $atom = "=$atom-$version"; + $atom = ">$atom" if $a->minimum; + } + + return $atom; +} + +sub fold { + shift unless length ref $_[0]; + + my %seen; + for my $atom (@_) { + my ($category, $name, $version) = map $atom->$_, qw/category name version/; + my $key = join '/', $category, $name; + my $cur = $seen{$key}; + + unless (defined $cur) { + $seen{$key} = $atom; + next; + } + + next unless defined $version; + + if (not defined $cur->version) { + $seen{$key} = $atom; + next; + } + + if ($atom->minimum) { + if ($cur->minmium) { + $seen{$key} = $atom < $cur ? $cur : $atom; + } else { + Carp::confess('Version mismatch') if $atom > $cur; + } + } elsif ($cur->minimum) { + Carp::confess('Version mismatch') if $cur > $atom; + } + } + + return values %seen; } 1;