X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FCPANPLUS%2FDist%2FGentoo%2FAtom.pm;h=543693e5ab7b8471dfdf10d1f73870fea153074c;hb=4e0c9cad73c65d6c469d35afebbef746ab15ce89;hp=bc0e9c027eb57809f817da445e64e92aa2673aeb;hpb=5a5575483b3f3ae59a3895e1a571edd687becec0;p=perl%2Fmodules%2FCPANPLUS-Dist-Gentoo.git diff --git a/lib/CPANPLUS/Dist/Gentoo/Atom.pm b/lib/CPANPLUS/Dist/Gentoo/Atom.pm index bc0e9c0..543693e 100644 --- a/lib/CPANPLUS/Dist/Gentoo/Atom.pm +++ b/lib/CPANPLUS/Dist/Gentoo/Atom.pm @@ -9,8 +9,9 @@ use Carp (); use Scalar::Util (); use overload ( - '<=>' => \&cmp, - '""' => \&as_string, + '<=>' => \&_spaceship, + 'cmp' => \&_cmp, + '""' => \&_stringify, ); use CPANPLUS::Dist::Gentoo::Version; @@ -33,11 +34,6 @@ sub new { $atom =~ m{^([\w-]+)/([\w-]+)-v?($version_rx)$} or Carp::confess('Invalid atom'); ($category, $name, $version) = ($1, $2, $3); - } elsif (defined $args{ebuild}) { - my $ebuild = $args{ebuild}; - $ebuild =~ m{/([\w-]+)/([\w-]+)/\2-v?($version_rx)\.ebuild$} - or Carp::confess('Invalid ebuild'); - ($category, $name, $version) = ($1, $2, $3); } else { Carp::confess('Not enough information for building an atom object'); } @@ -71,11 +67,32 @@ sub new { }, $class; } +sub new_from_ebuild { + my $class = shift; + $class = ref($class) || $class; + + my $ebuild = shift; + $ebuild = '' unless defined $ebuild; + + $ebuild =~ m{/([\w-]+)/([\w-]+)/\2-v?($version_rx)\.ebuild$} + or Carp::confess('Invalid ebuild'); + my ($category, $name, $version) = ($1, $2, $3); + + return $class->new( + category => $category, + name => $name, + version => $version, + ebuild => $ebuild, + ); +} + BEGIN { eval "sub $_ { \$_[0]->{$_} }" for qw/category name version range ebuild/; } -sub cmp { +sub qualified_name { join '/', $_[0]->category, $_[0]->name } + +sub _spaceship { my ($a1, $a2, $r) = @_; my $v1 = $a1->version; @@ -94,10 +111,29 @@ sub cmp { return $v1 <=> $v2; } -sub as_string { +sub _cmp { + my ($a1, $a2, $r) = @_; + + my $s1 = $a1->qualified_name; + my $v1 = $a1->version; + $s1 .= "-$v1" if defined $v1; + + my $s2; + if (Scalar::Util::blessed($a2) and $a2->isa(__PACKAGE__)) { + $s2 = $a2->qualified_name; + my $v2 = $a2->version; + $s2 .= "-$v2" if defined $v2; + } else { + $s2 = $a2; + } + + $s1 cmp $s2; +} + +sub _stringify { my ($a) = @_; - my $atom = $a->category . '/' . $a->name; + my $atom = $a->qualified_name; my $version = $a->version; $atom = $a->range . $atom . '-' . $version if defined $version; @@ -120,8 +156,8 @@ sub and { my $a2 = shift; $a2 = $a2->and(@_) if @_; - my $p1 = join '/', $a1->category, $a1->name; - my $p2 = join '/', $a2->category, $a2->name; + my $p1 = $a1->qualified_name; + my $p2 = $a2->qualified_name; Carp::confess("Atoms for different packages $p1 and $p2") unless $p1 eq $p2; my $v1 = $a1->version; @@ -160,7 +196,7 @@ sub fold { my %seen; for my $atom (@_) { - my $key = join '/', $atom->category, $atom->name; + my $key = $atom->qualified_name; my $cur = $seen{$key}; $seen{$key} = defined $cur ? $cur->and($atom) : $atom;