diff options
Diffstat (limited to 'lib/Carton/Index.pm')
-rw-r--r-- | lib/Carton/Index.pm | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/lib/Carton/Index.pm b/lib/Carton/Index.pm new file mode 100644 index 0000000..3ce215c --- /dev/null +++ b/lib/Carton/Index.pm @@ -0,0 +1,68 @@ +package Carton::Index; +use strict; +use Class::Tiny { + _packages => sub { +{} }, + generator => sub { require Carton; "Carton $Carton::VERSION" }, +}; + +sub add_package { + my($self, $package) = @_; + $self->_packages->{$package->name} = $package; # XXX ||= +} + +sub count { + my $self = shift; + scalar keys %{$self->_packages}; +} + +sub packages { + my $self = shift; + sort { lc $a->name cmp lc $b->name } values %{$self->_packages}; +} + +sub write { + my($self, $fh) = @_; + + print $fh <<EOF; +File: 02packages.details.txt +URL: http://www.perl.com/CPAN/modules/02packages.details.txt +Description: Package names found in cpanfile.snapshot +Columns: package name, version, path +Intended-For: Automated fetch routines, namespace documentation. +Written-By: @{[ $self->generator ]} +Line-Count: @{[ $self->count ]} +Last-Updated: @{[ scalar localtime ]} + +EOF + for my $p ($self->packages) { + print $fh $self->_format_line($p->name, $p->version || 'undef', $p->pathname); + } +} + +sub _format_line { + my($self, @row) = @_; + + # from PAUSE::mldistwatch::rewrite02 + my $one = 30; + my $two = 8; + + if (length $row[0] > $one) { + $one += 8 - length $row[1]; + $two = length $row[1]; + } + + sprintf "%-${one}s %${two}s %s\n", @row; +} + +sub pad { + my($str, $len, $left) = @_; + + my $howmany = $len - length($str); + return $str if $howmany <= 0; + + my $pad = " " x $howmany; + return $left ? "$pad$str" : "$str$pad"; +} + + +1; |