| 1 | |
|---|
| 2 | use warnings; |
|---|
| 3 | use strict; |
|---|
| 4 | |
|---|
| 5 | use File::Copy qw(move); |
|---|
| 6 | use FileHandle; |
|---|
| 7 | use IPC::Open2; |
|---|
| 8 | use File::Spec::Functions; |
|---|
| 9 | use File::Find; |
|---|
| 10 | use File::Basename; |
|---|
| 11 | |
|---|
| 12 | use Getopt::Long; |
|---|
| 13 | |
|---|
| 14 | our $DEBUG = 0; |
|---|
| 15 | our $remove = ''; |
|---|
| 16 | |
|---|
| 17 | our $parentdir = '/Volumes/Junior/Dave/packages'; |
|---|
| 18 | our $pid; |
|---|
| 19 | |
|---|
| 20 | GetOptions( |
|---|
| 21 | 'debug' => \$DEBUG, |
|---|
| 22 | 'r|remove=s' => \$remove, |
|---|
| 23 | ) or die "Bad options\n"; |
|---|
| 24 | $remove = 0 if grep { $_ eq lc $remove } ('false', '0', 'no'); |
|---|
| 25 | |
|---|
| 26 | sub remote_needed { |
|---|
| 27 | my ($in, $out); |
|---|
| 28 | my $input = <<COMMAND; |
|---|
| 29 | . /fink/permanent/bin/init.sh |
|---|
| 30 | /Users/vasi/Hacking/bin/fink-needed |
|---|
| 31 | COMMAND |
|---|
| 32 | $pid = open2($in, $out, qw(ssh -T 10.0.1.203)); |
|---|
| 33 | print $out $input; |
|---|
| 34 | close $out; |
|---|
| 35 | return $in; |
|---|
| 36 | } |
|---|
| 37 | |
|---|
| 38 | our %targets = ( |
|---|
| 39 | DEFAULT => { |
|---|
| 40 | keep => sub { \*STDIN }, |
|---|
| 41 | scan => sub { m,/binary-darwin-powerpc$, } |
|---|
| 42 | }, |
|---|
| 43 | |
|---|
| 44 | permanent => { |
|---|
| 45 | subdir => 'ToasterPermanentFink', |
|---|
| 46 | keep => sub { \*STDIN }, |
|---|
| 47 | scan => sub { m,/binary-darwin-powerpc$, }, |
|---|
| 48 | }, |
|---|
| 49 | regular => { |
|---|
| 50 | subdir => 'ToasterFink105', |
|---|
| 51 | keep => sub { \*STDIN }, |
|---|
| 52 | scan => sub { m,/binary-darwin-powerpc$, }, |
|---|
| 53 | }, |
|---|
| 54 | ); |
|---|
| 55 | |
|---|
| 56 | sub needed { |
|---|
| 57 | my ($target) = @_; |
|---|
| 58 | |
|---|
| 59 | my $in = &{$target->{keep}}(); |
|---|
| 60 | my @result = <$in>; |
|---|
| 61 | close $in; |
|---|
| 62 | |
|---|
| 63 | waitpid $pid, 0 if defined $pid; |
|---|
| 64 | |
|---|
| 65 | print @result if $DEBUG; |
|---|
| 66 | die "Not enough needed, probably a bug!\n" . join('', @result) |
|---|
| 67 | unless scalar(@result) > 10; |
|---|
| 68 | |
|---|
| 69 | chomp @result; |
|---|
| 70 | return @result; |
|---|
| 71 | } |
|---|
| 72 | |
|---|
| 73 | sub have { |
|---|
| 74 | my @debs; |
|---|
| 75 | find({ no_chdir => 1, wanted => sub { |
|---|
| 76 | return if m,^\W*/trash/,; |
|---|
| 77 | return unless /\.deb$/; |
|---|
| 78 | push @debs, $_; |
|---|
| 79 | }}, '.'); |
|---|
| 80 | print map { "$_\n" } @debs if $DEBUG; |
|---|
| 81 | @debs; |
|---|
| 82 | } |
|---|
| 83 | |
|---|
| 84 | my ($tname, $tdir) = @ARGV; |
|---|
| 85 | my $target = $targets{$tname} || $targets{DEFAULT}; |
|---|
| 86 | $target->{subdir} ||= $tdir; |
|---|
| 87 | print "### Cleaning up target '$tname'\n"; |
|---|
| 88 | |
|---|
| 89 | my $debdir = catdir($parentdir, $target->{subdir}); |
|---|
| 90 | my $trash = catdir($debdir, 'trash'); |
|---|
| 91 | mkdir $trash unless -d $trash; |
|---|
| 92 | chdir($debdir); |
|---|
| 93 | |
|---|
| 94 | if ($remove) { |
|---|
| 95 | print "### Getting the debs to keep\n"; |
|---|
| 96 | my %needed = map { $_ => 1 } needed($target); |
|---|
| 97 | |
|---|
| 98 | print "### Finding the debs we have\n"; |
|---|
| 99 | my @have = have; |
|---|
| 100 | |
|---|
| 101 | print "### Throwing out the ones we don't want anymore\n"; |
|---|
| 102 | for my $have (@have) { |
|---|
| 103 | my ($file, $dir) = fileparse($have); |
|---|
| 104 | unless ($needed{$file}) { |
|---|
| 105 | my $newdir = catdir($trash, $dir); |
|---|
| 106 | unless (-d $newdir) { |
|---|
| 107 | system('mkdir', '-p', $newdir) == 0 |
|---|
| 108 | or die "Can't create the target dir $newdir: $!\n"; |
|---|
| 109 | } |
|---|
| 110 | my $newfile = catfile($newdir, $file); |
|---|
| 111 | print " $have => $newfile\n"; |
|---|
| 112 | File::Copy::move($have, $newfile); |
|---|
| 113 | } |
|---|
| 114 | } |
|---|
| 115 | } |
|---|
| 116 | |
|---|
| 117 | print "### Updating the Packages.gz files\n"; |
|---|
| 118 | my @scandirs; |
|---|
| 119 | find({ no_chdir => 1, wanted => sub { |
|---|
| 120 | return if m,^\W*/trash/, || !&{$target->{scan}}(); |
|---|
| 121 | push @scandirs, $_; |
|---|
| 122 | $File::Find::prune = 1; |
|---|
| 123 | }}, '.'); |
|---|
| 124 | |
|---|
| 125 | use lib '/sw/lib/perl5'; |
|---|
| 126 | use Fink::Scanpackages; |
|---|
| 127 | my $sp = Fink::Scanpackages->new(db => 'scanpackages.db'); |
|---|
| 128 | my $release = { |
|---|
| 129 | Origin => 'Vasi', |
|---|
| 130 | Label => 'Fink', |
|---|
| 131 | Architecture => 'darwin-powerpc' |
|---|
| 132 | }; |
|---|
| 133 | $sp->scan_dists({ release => $release }, @scandirs); |
|---|
| 134 | |
|---|
| 135 | |
|---|
| 136 | if (!$DEBUG && $remove eq 'delete') { |
|---|
| 137 | print "### Permanently deleting old debs\n"; |
|---|
| 138 | system('rm', '-rf', $trash) == 0 or die "Can't take out the trash: $!\n"; |
|---|
| 139 | } |
|---|