1#!/usr/local/bin/perl -w 2 3use strict; 4use IO::File; 5use ExtUtils::Packlist; 6use ExtUtils::Installed; 7 8use vars qw($Inst @Modules); 9 10################################################################################ 11 12sub do_module($) 13{ 14my ($module) = @_; 15my $help = <<EOF; 16Available commands are: 17 f [all|prog|doc] - List installed files of a given type 18 d [all|prog|doc] - List the directories used by a module 19 v - Validate the .packlist - check for missing files 20 t <tarfile> - Create a tar archive of the module 21 q - Quit the module 22EOF 23print($help); 24while (1) 25 { 26 print("$module cmd? "); 27 my $reply = <STDIN>; chomp($reply); 28 CASE: 29 { 30 $reply =~ /^f\s*/ and do 31 { 32 my $class = (split(' ', $reply))[1]; 33 $class = 'all' if (! $class); 34 my @files; 35 if (eval { @files = $Inst->files($module, $class); }) 36 { 37 print("$class files in $module are:\n ", 38 join("\n ", @files), "\n"); 39 last CASE; 40 } 41 else 42 { print($@); } 43 }; 44 $reply =~ /^d\s*/ and do 45 { 46 my $class = (split(' ', $reply))[1]; 47 $class = 'all' if (! $class); 48 my @dirs; 49 if (eval { @dirs = $Inst->directories($module, $class); }) 50 { 51 print("$class directories in $module are:\n ", 52 join("\n ", @dirs), "\n"); 53 last CASE; 54 } 55 else 56 { print($@); } 57 }; 58 $reply =~ /^t\s*/ and do 59 { 60 my $file = (split(' ', $reply))[1]; 61 my $tmp = "/tmp/inst.$$"; 62 if (my $fh = IO::File->new($tmp, "w")) 63 { 64 $fh->print(join("\n", $Inst->files($module))); 65 $fh->close(); 66 system("tar cvf $file -I $tmp"); 67 unlink($tmp); 68 last CASE; 69 } 70 else { print("Can't open $file: $!\n"); } 71 last CASE; 72 }; 73 $reply eq 'v' and do 74 { 75 if (my @missing = $Inst->validate($module)) 76 { 77 print("Files missing from $module are:\n ", 78 join("\n ", @missing), "\n"); 79 } 80 else 81 { 82 print("$module has no missing files\n"); 83 } 84 last CASE; 85 }; 86 $reply eq 'q' and do 87 { 88 return; 89 }; 90 # Default 91 print($help); 92 } 93 } 94} 95 96################################################################################ 97 98sub toplevel() 99{ 100my $help = <<EOF; 101Available commands are: 102 l - List all installed modules 103 m <module> - Select a module 104 q - Quit the program 105EOF 106print($help); 107while (1) 108 { 109 print("cmd? "); 110 my $reply = <STDIN>; chomp($reply); 111 CASE: 112 { 113 $reply eq 'l' and do 114 { 115 print("Installed modules are:\n ", join("\n ", @Modules), "\n"); 116 last CASE; 117 }; 118 $reply =~ /^m\s+/ and do 119 { 120 do_module((split(' ', $reply))[1]); 121 last CASE; 122 }; 123 $reply eq 'q' and do 124 { 125 exit(0); 126 }; 127 # Default 128 print($help); 129 } 130 } 131} 132 133################################################################################ 134 135$Inst = ExtUtils::Installed->new(); 136@Modules = $Inst->modules(); 137toplevel(); 138 139################################################################################ 140