#!/usr/bin/perl -w # Parse a Packages file and store it in an MLDBM file for caching use strict; use warnings; use MLDBM qw(DB_File Storable); use Fcntl; my %packages; my %virtuals; my %maints; my $entry = {}; my $lastatt = undef; my $count=0; my $spinat=-1; my @spinner = ( '|', '/', '-', '\\'); unlink($ENV{"HOME"} . "/.packages-dbm"); unlink($ENV{"HOME"} . "/.virtuals-dbm"); unlink($ENV{"HOME"} . "/.maints-dbm"); tie(%packages, "MLDBM", $ENV{"HOME"} . "/.packages-dbm", O_RDWR|O_CREAT, 0640); tie(%virtuals, "MLDBM", $ENV{"HOME"} . "/.virtuals-dbm", O_RDWR|O_CREAT, 0640); tie(%maints, "MLDBM", $ENV{"HOME"} . "/.maints-dbm", O_RDWR|O_CREAT, 0640); $|=1; print "Reading data... "; sub handle_provides($) { my $ent = shift; my $item; for $item(split /,/,$ent->{Provides}) { my $pack; $item =~ s/^\s*//; $item =~ s/\s*$//; if(!exists $virtuals{$item}) { # If this virtual package also exists as a regular # package, this will be overwritten. Well, tough, we're # not checking that afterwards, anyway $pack = {}; $pack->{Package} = $item; $pack->{Provider} = (); } else { my $pack = $virtuals{$item}; if(!defined($pack->{Provider})) { $pack->{Provider} = (); } } push @{$pack->{Provider}}, $ent->{Package}; $virtuals{$item} = $pack; } } while() { chomp; if(/^$/) { my @val; my $dep; $count++; if($count>$spinat) { my $char=shift @spinner; if($count) { print ''; } print $char; push @spinner, $char; $spinat+=100; } $packages{$entry->{Package}} = $entry; if(exists $maints{$entry->{Maintainer}}) { @val = $maints{$entry->{Maintainer}}; } else { @val = (); } push @val, $entry->{Package}; $maints{$entry->{Maintainer}} = \@val; if(exists $entry->{Provides}) { handle_provides($entry); } $entry = {}; $lastatt = undef; } elsif(/^([^ :]*): (.*)$/) { my $name = $1; my $val = $2; $entry->{$name} = $val; $lastatt = \$entry->{$name}; } elsif(/^\s(.*)$/) { $lastatt .= "\n$1"; } else { die "Encountered unexpected line:\n$_\n"; } } print " done ($count packages). Closing cache... "; untie %packages; untie %virtuals; untie %maints; print "ready. Have a nice day!\n";