summaryrefslogtreecommitdiffstats
path: root/gurpmi
blob: 57420ad4aa080b2c877b10f3bafa93bd38deed3d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/usr/bin/perl

#- Copyright (C) 2005 Mandriva

use strict;
use warnings;

BEGIN { #- set up a safe path and environment
    $ENV{PATH} = "/bin:/usr/bin:/usr/X11R6/bin";
    delete @ENV{qw(ENV BASH_ENV IFS CDPATH)};
}

use Gtk2;
use gurpmi;

#- globals
my ($srpms, $rpms) = ([], []);
my ($mainw, $mainbox);
my @all_rpms = gurpmi::parse_command_line();

#- Now, the graphical stuff.

Gtk2->init;

#- Create main window

$mainw = Gtk2::Window->new('toplevel');
$mainw->set_border_width(3);
$mainw->set_title(N("RPM installation"));
$mainw->signal_connect(destroy => \&quit);
$mainw->set_position('center');
$mainw->set_modal(0);
$mainbox = Gtk2::VBox->new(0, 5);
$mainw->add($mainbox);

sub all_descriptions {
    join '', qx(rpm -qp --qf '%{name}-%{version}-%{release}: %{summary}\\n' @_);
}

foreach (@all_rpms) {
    unless (-e $_) {
	$mainbox->pack_start(new_label(N("Error: unable to find file %s, will cancel operation", $_)), 1, 1, 0);
	my $abort_button = Gtk2::Button->new(but(N("_Ok")));
	$abort_button->signal_connect(clicked => sub { quit(); exit 1 });
	add_button_box($mainbox, $abort_button);
	$mainw->show_all;
	Gtk2->main;
    }
    /\.src\.rpm$/ ? push(@$srpms, $_) : push(@$rpms, $_);
}

#- Ask question: save or install ?
#- change depending on the number of rpms, and on the presence of srpms
{
    my $msg = (
	@$srpms > 0
	? N("You have selected a source package:

%s

You probably didn't want to install it on your computer (installing it would allow you to make modifications to its sourcecode then compile it).

What would you like to do?", $srpms->[0])
	: @all_rpms == 1
	? N("You are about to install the following software package on your computer:

%s

You may prefer to just save it. What is your choice?", all_descriptions($rpms->[0]))
	: N("You are about to install the following software packages on your computer:

%s

Proceed?", all_descriptions(@all_rpms))
    );
    $mainbox->pack_start(new_label($msg), 1, 1, 0);
}

{   #- buttons
    my $inst_button = Gtk2::Button->new(but(N("_Install")));
    my $save_button = @all_rpms == 1 ? Gtk2::Button->new(but(N("_Save"))) : undef;
    my $ccel_button = Gtk2::Button->new(but(N("_Cancel")));

    $inst_button->signal_connect(clicked => sub {
	#- performs installation.
	quit();
	#- we need to switch to root if we're not already (via consolehelper)
	#- yes. hardcoded paths. safe.
	exec $> ? '/usr/bin/gurpmi2' : '/usr/sbin/gurpmi2', @ARGV;
    });
    $save_button and $save_button->signal_connect(clicked => sub {
	my $file_dialog = Gtk2::FileSelection->new(N("Choose location to save file"));
	$file_dialog->set_modal(1);
	$file_dialog->set_position('center');
	my $filename = @$srpms > 0 ? $srpms->[0] : $rpms->[0];
	$file_dialog->set_filename($filename);
	$file_dialog->hide_fileop_buttons;
	$file_dialog->ok_button->signal_connect(clicked => sub {
	    my $location = $file_dialog->get_filename;
	    quit();
	    $location and exec '/bin/mv', '-f', $filename, $location;
	});
	$file_dialog->cancel_button->signal_connect(clicked => \&quit);
	$file_dialog->show;
    });
    $ccel_button->signal_connect(clicked => \&quit);
    add_button_box($mainbox, grep { defined $_ } $inst_button, $save_button, $ccel_button);
}

$mainw->show_all;
Gtk2->main;