#!/usr/bin/perl -w use strict; ############################################################################ # # Debian System Wide Information Manager # # Copyright (C) 1999-2001 Jonathan Rosenbaum # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA # ############################################################################# =pod This program only takes two argument, a temp directory and the name of the binary sort..sort. You can test a filedir.deb file. =cut if ($#ARGV == -1) { print STDERR "swim: slowswim requires arguments, see program for instructions\n"; exit; } my $tmp = $ARGV[0]; my $sort = $ARGV[1]; pre_md(); # This is nmd()'s version of fastswim..also a lowmem method, after making # long.debian and big.debian, process_md() finishes the job. sub pre_md { my %HL; my $temp; my %repeaters; my $fcount = 0; my @tempholder; print STDERR "Sorting everything\n"; system ("$sort $tmp/filedir.deb > $tmp/sortfiledir.deb"); unlink("$tmp/filedir.deb"); # grab the keys from the sorted file print STDERR "Making the massive hash using lowmem\n"; $| = 1; my $x = 1; open(FILEDIR, "$tmp/sortfiledir.deb") or die "where is sortfiledir.deb?\n"; while () { $x = 1 if $x == 6; print STDERR "|\r" if $x == 1 || $x == 4; print STDERR "/\r" if $x == 2; print STDERR "-\r" if $x == 3 || $x == 6; print STDERR "\\\r" if $x == 5; $x++; my ($place, $packname) = split(/ -> /,$_,2); push(@tempholder,"$place -> $packname"); if ($fcount != 0) { my($tplace,$tpackname) = split(/ -> /,$tempholder[$fcount - 1],2); chomp $tpackname; # As long as they aren't different add to HL because they # belong to a group. if ($tplace eq $place) { #print "$tplace and $place\n"; $repeaters{$tplace}++; if ($repeaters{$tplace} == 1) { $temp = 0; } else { $temp = $repeaters{$tplace} - 1; } $HL{$tplace}[$temp] = $tpackname; } # they new guy is different, but the old guy belongs to the # previous group or not, so finish adding to %HL and then # print out, and undef %HL else { #print "I AM DIFF $tplace\n"; # finish adding $repeaters{$tplace}++; if ($repeaters{$tplace} == 1) { $temp = 0; } else { $temp = $repeaters{$tplace} - 1; } $HL{$tplace}[$temp] = $tpackname; # print out open(BIG, ">>$tmp/big.debian") or die; open(LONG, ">>$tmp/long.debian") or die; my $thingo; foreach $thingo (sort keys %HL ) { my $tingy = "@{ $HL{$thingo} }"; if (@{ $HL{$thingo} } > 1 || @{ $HL{$thingo} } eq "") { print LONG "$thingo -> $tingy\n"; } elsif (@{ $HL{$thingo} } == 1) { print BIG "$thingo -> $tingy\n"; } } close(BIG); close(LONG); # The whole key for lowmem systems undef %repeaters; undef %HL; undef $tempholder[$fcount - 1]; } } # if fcount ne 0 $fcount++; } # also do this in db() & ndb() unlink("$tmp/sortfiledir.deb"); } # end sub pre_md