--- Emerge-Progress_0.99-1.perl 2006-04-17 00:58:18.000000000 +0200 +++ Emerge-Progress_0.99-2.perl 2006-04-17 16:19:49.628571124 +0200 @@ -11,11 +11,7 @@ setlocale(LC_NUMERIC, "C"); use strict; use FileHandle; -#use threads; use Data::Dumper; # for debugging purposes -#use Linux::Inotify; -#my $notifier = Linux::Inotify->new(); -#my $watch = $notifier->add_watch('filename', Linux::Inotify::MASK); # This file must be downloaded from http://www.smokepit.net/~theemperor/Utvikling/Emerge-Progress/ep.glade and placed somewhere, then change the next line accordingly.. my $glade = Gtk2::GladeXML -> new("/home/users/t/theemperor/Projects/project1/project1.glade"); @@ -28,8 +24,6 @@ my $lastline; my @logfile; my $packages = (); -my @new_package_list; -my @comp_package_list; my $updatetag; my @cols = ( { title => 'Name', type => 'Glib::String', }, @@ -69,7 +63,7 @@ sub sett_opp { &sett_opp_kolonner; - &parselog_test; + &parselog; my $timer = Glib::Timeout->add(5000, \&test); } @@ -112,16 +106,16 @@ return 1; } -sub parselog_test +sub parselog { my $fh = FileHandle -> new; my $tag; open($fh, " add_watch($fh -> fileno, 'in', sub { parselog_test_callback($fh,$tag); }); + $tag = Gtk2::Helper -> add_watch($fh -> fileno, 'in', sub { parselog_callback($fh,$tag); }); return TRUE; } -sub parselog_test_callback +sub parselog_callback { my ($fh,$tag) = @_; if(eof($fh)) @@ -151,7 +145,7 @@ $packages -> {$pkg} -> {'start_time'} = $time; if(keys %$packages > @package_list) { - push(@package_list, $pkg); + unshift(@package_list, $pkg); &clean_package_list; } } @@ -163,42 +157,10 @@ { if($#package_list >= 10) { - foreach my $pkg(@package_list[0..($#package_list - 10)]) + foreach my $pkg(@package_list[10..($#package_list)]) { delete $packages -> {$pkg}; - shift(@package_list); - } - } - 1; -} - -sub update_list -{ - @new_package_list = @package_list; - my $tag; - my $fh = FileHandle -> new; - open($fh,q^tail -n50 /var/log/emerge.log|^); - $tag = Gtk2::Helper->add_watch ( $fh->fileno, 'in', sub { update_list_callback($fh,$tag); }); - 1; -} - -sub update_list_callback -{ - my ($fh,$tag) = @_; - if(eof($fh)) - { - Gtk2::Helper -> remove_watch ($tag) or &error("Could not release Gtk2::Helper"); - close($fh); - @comp_package_list = @new_package_list; - 1; - } - else - { - my $line = <$fh>; - unless(@comp_package_list = @new_package_list) - { - push(@new_package_list, $line); - print "njaa\n"; + pop(@package_list); } } 1; @@ -252,18 +214,28 @@ my $pathi = 0; while($testi < $#package_list + 1) { - unless($packages -> {$package_list[$testi]} -> {'status'} =~ "Completed" or $packages -> {$package_list[$testi]} -> {'status'} =~ "Terminated") + if(defined($packages -> {$package_list[$testi]})) { - my $time = time(); my $pkg = $packages -> {$package_list[$testi]} -> {'name'}; - &eta($pkg); - my $eta = &gettime($packages -> {$pkg} -> {'eta'}); - my $percent = $packages -> {$pkg} -> {'percent'}; - my $string = "$percent% ETA: $eta"; - my $status = $packages -> {$package_list[$testi]} -> {'status'}; - my $path = Gtk2::TreePath->new_from_string($testi); - my $iter = $store->get_iter($path); - $store->set($iter, 2, "$string"); + if(defined($pkg)) + { + unless($packages -> {$pkg} -> {'status'} =~ "Completed" or $packages -> {$pkg} -> {'status'} =~ "Terminated") + { + my $string; + my $path; + my $iter; + my $time = time(); + &eta($pkg); + my $eta = &gettime($packages -> {$pkg} -> {'eta'}); + my $percent = $packages -> {$pkg} -> {'percent'}; + my $status = $packages -> {$package_list[$testi]} -> {'status'}; + if(($percent) || ($eta)) { $string = "$percent% ETA: $eta"; } + else { $string = $status; } + $path = Gtk2::TreePath->new_from_string($testi); + if(defined($path)) { $iter = $store->get_iter($path); } + if(defined($iter)) { $store->set($iter, 2, "$string"); } + } + } } $testi++; } @@ -274,7 +246,7 @@ @package_list = (); $store->clear; $storedone->clear; - &parselog_test; + &parselog; } } @@ -312,9 +284,12 @@ $whendone = &gettime($whendone - $packages -> {$pkg} -> {'start_time'}); $packages -> {$pkg} -> {'status'} = "Completed after $whendone"; } - if($logfile[$line_i + 1] =~ 'terminating') #if the line after one telling about the status of the package is *** terminating, we can be pretty sure the emerge has been stopped, and that package will NOT be completed... + if(defined($logfile[$line_i + 1])) { - $packages -> {$pkg} -> {'status'} = "Terminated"; + if($logfile[$line_i + 1] =~ 'terminating') #if the line after one telling about the status of the package is *** terminating, we can be pretty sure the emerge has been stopped, and that package will NOT be completed... + { + $packages -> {$pkg} -> {'status'} = "Terminated"; + } } #this will loop for all logfile entries concerning the package, it may be many :) {'status'} will change a lot... probably there is MANY better ways to do this :)... anyhow, it will only return one value, and that is the last entry.., so the routine will only inform you about the last status of the package... } @@ -336,6 +311,7 @@ sub eta { + return 0 unless(defined($_[0])); my $pkg = $_[0]; my $start_time = $packages -> {$pkg} -> {'start_time'}; &percent($pkg); @@ -355,7 +331,7 @@ sub percent { - return 0 unless $_[0]; + return 0 unless(defined($_[0])); my $pkg = $_[0]; my $progress; my $total = `find /var/tmp/portage/$pkg -iname "*.c" -or -iname "*.cpp" -or -iname "*.cc" | wc -l`; @@ -386,6 +362,7 @@ sub gettime # gettime(tid i sekunder) { + return 0 unless(defined($_[0])); my $gettime = $_[0]; if($gettime > 0) {