From 1a238d7110152349c453e39c036c22b46bd7e068 Mon Sep 17 00:00:00 2001 From: Tzafrir Cohen Date: Fri, 5 Jun 2009 22:40:56 +0300 Subject: explin fail reason in modinfo * -m (--modinfo) now shows the dependencies (and which of those are unsatisfied). * With the new option -v (--verose) it also gives a better reason and a multi-line list of dependencies. * Patchy fix to reading dependencies from the dump file: were read as string rather than array. --- menuselect/menuselect | 68 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/menuselect/menuselect b/menuselect/menuselect index 935b0b3..de2dee8 100755 --- a/menuselect/menuselect +++ b/menuselect/menuselect @@ -551,6 +551,11 @@ sub read_dump() { my ($var, $value) = split /: /, $_, 2; $item{$var} = $value; } + # FIXME: dependencies are a list. This should not be a + # special case. + if (exists $item{Depend}) { + $item{Depend} = [split /\s*,\s*/,$item{Depend}]; + } $items{$item{Key}} = \%item; } close DUMP_FILE; @@ -558,7 +563,30 @@ sub read_dump() { return \%items; } +# Explain why a module (read from the dump file) was not enabled. +# (We assume here that $item->{Avail} is 0) +sub fail_reason($) { + my $item = shift; + if ($item->{Type} eq 'lib') { + return " Not found: system library"; + } elsif ($item->{Type} eq 'XML') { + if ($item->{Defaultenabled} !~ /^y/) { + return "Not enabled"; + } else { + return "Missing dependencies"; + } + } elsif ($item->{Type} eq 'module') { + if (exists ($item->{Defaultenabled}) && + $item->{Defaultenabled} =~ /^n/) { + return "Disabled"; + } else { + return "Missing dependencies"; + } + } +} + sub print_module_status { + my $flag_verbose = shift; my $items = read_dump(); my %items_matched = (); @@ -574,10 +602,36 @@ sub print_module_status { foreach my $item_name (@items_list) { my $item = $items->{$item_name}; - printf "%s %-8s %-30s\n", - (($item->{Avail})? 'Y':'n'), - $item->{Type}, - $item->{Key}; + if ($flag_verbose) { + printf "%s %-8s %-30s\n", + (($item->{Avail})? 'Y':'n'), + $item->{Type}, + $item->{Key}; + if (!$item->{Avail}) { + my $reason = fail_reason($item); + print " $reason\n"; + } + foreach (@{$item->{Depend}}) { + my $depmod = $items->{$_}; + printf(" * %-12s ",$_); + print (($depmod->{Avail})? '': "un"); + print "available\n"; + } + } else { + printf "%s %-8s %-30s", + (($item->{Avail})? 'Y':'n'), + $item->{Type}, + $item->{Key}; + foreach (@{$item->{Depend}}) { + my $depmod = $items->{$_}; + if ($depmod->{Avail}) { + print "$_ "; + } else { + printf "[%s] ", $_; + } + } + print "\n"; + } } } @@ -587,6 +641,7 @@ sub usage() { print "Usage:\n"; print "$0 # menuselect processing\n"; print "$0 -m|--modinfo|--moduls-info PATTERN # Status of modules\n"; + print "$0 -v|--verbose # verbose (modinfo)\n"; print "$0 -c|--check-deps # Check for dependencies\n"; print "\n"; print "PATTERN is a partial perl regex. Use '-m .' to list all.\n"; @@ -594,10 +649,13 @@ sub usage() { my @module_status = (); +my $flag_verbose = 0; + my $action = ''; my $rc = GetOptions( 'modinfo|modules-info|m=s' => \@module_status, + 'verbose|v' => \$flag_verbose, 'check-deps|c:s' => sub { $action = 'check_dependencies'}, 'help|h' => sub { usage(); exit 0 }, ); @@ -611,7 +669,7 @@ if (@module_status) { } if ($action eq 'module_status') { - print_module_status(@module_status); + print_module_status($flag_verbose, @module_status); exit 0; } elsif ( $action eq 'check_dependencies') { check_dependencies(); -- cgit v1.2.3