diff options
-rwxr-xr-x | mdkupdate | 64 |
1 files changed, 63 insertions, 1 deletions
@@ -24,6 +24,8 @@ use POSIX; use lib qw(/usr/lib/libDrakX /usr/lib/libDrakX/drakfirsttime); use common; use mdkonline; +use interactive; +use urpm; BEGIN { unshift @::textdomains, 'mdkupdate' } @@ -62,12 +64,13 @@ usage: ") . N(" --auto - Mandrakeupdate launched automatically. ") . N(" --applet - launch Mandrakeupdate. ") . N(" --mnf - launch mnf specific scripts. +") . N(" --noX - MandrakeUpdate newt version. "); exit(0); } my ($opt) = @ARGV; -@ARGV == 1 && ($opt eq '--auto' || $opt eq '--applet' || $opt eq '--mnf') or usage(); +@ARGV == 1 && member($opt, qw(--auto --applet --mnf --noX)) or usage(); -s $conffile or die N("No %s file found. Run mdkonline wizard first", $conffile); @@ -98,6 +101,11 @@ if ($o{LOGIN} && $o{PASS} && $o{LOGIN} !~ /\s+/ && $o{PASS} !~ /\s+/) { -f $currentrpm or rpm_qa($currentrpm); if ($opt eq '--applet') { system "/usr/bin/MandrakeUpdate", "--no-confirmation", "--media=update_source", "--pkg-sel=$scheduled", "--pkg-nosel=$noscheduled" + } elsif ($opt eq '--noX') { + my $in = interactive->vnew; + my $pkgs = ask_pkgs($in); + install_pkgs($in, $pkgs) if $pkgs; + $in->exit(0); } elsif ($opt eq '--auto') { $o{AUTO} eq 'TRUE' and auto_install_rpms($c2h->{sched}) } @@ -133,6 +141,60 @@ if ($o{LOGIN} && $o{PASS} && $o{LOGIN} !~ /\s+/ && $o{PASS} !~ /\s+/) { } else { my $ret = -1; } +sub ask_pkgs { + my ($in) = @_; + my $pkgs = get_updatable_pkgs(); + $in->ask_browse_tree_info('Mdkupdate', N("Choose which packages should be installed and Press Ok"), + { + node_state => sub { $pkgs->{$_[0]}{selected} ? 'selected' : 'unselected' }, + build_tree => sub { + my ($add_node, $flat) = @_; + $add_node->($_, undef) foreach sort keys %{$pkgs}; + }, + grep_unselected => sub { grep { !$pkgs->{$_}{selected} } @_ }, + toggle_nodes => sub { + my ($set_state, @nodes) = @_; + my $new_state = !$pkgs->{$nodes[0]}{selected}; + foreach (@nodes) { + $set_state->($_, $new_state ? 'selected' : 'unselected'); + $pkgs->{$_}{selected} = $new_state; + } + }, + get_info => sub {}, + }) or return keys %{$pkgs}; #- no change on cancel. + [ grep { $pkgs->{$_}{selected} } keys %{$pkgs} ]; +} +sub install_pkgs { + my ($in, $choosed) = @_; + print foreach @{$choosed}; + auto_install_rpms(@{$choosed}); +} +sub get_updatable_pkgs() { + my $urpm = new urpm; + $urpm->read_config; + my %installable_pkgs; my @update_medias; + my ($medium) = grep { $_->{name} eq "update_source" } @{$urpm->{media}}; + + if ($medium) { + $urpm->configure(media => $medium->{name}); + @update_medias = grep { !$_->{ignore} && $_->{update} } @{$urpm->{media}}; + $urpm->compute_installed_flags(URPM::DB::open); + foreach my $pkg (@{$urpm->{depslist}}) { + $pkg->flag_upgrade or next; + my $selected = 0; + $pkg->flag_installed or next; + any { $pkg->id >= $_->{start} && $pkg->id <= $_->{end} } @update_medias or next; + $selected = member($pkg->name, qw(perl-URPM, urpmi, mdkonline, drakxtools)) ? 1 : 0; + $installable_pkgs{my_fullname($pkg)} = { selected => $selected, pkg => $pkg }; + } + } + \%installable_pkgs; +} +sub my_fullname { + return '?-?-?' unless ref $_[0]; + my ($name, $version, $release) = $_[0]->fullname; + "$name-$version-$release"; +} sub split_contents { my $cont = shift; my ($elem, $s); |