diff options
author | Martin Whitaker <mageia@martin-whitaker.me.uk> | 2018-03-31 14:00:02 +0100 |
---|---|---|
committer | Neal Gompa <ngompa13@gmail.com> | 2018-03-31 09:03:06 -0400 |
commit | 30a195d307f9166ea5ca6b0b93ec3b205472ee87 (patch) | |
tree | 566b7da2d38ac432742d144a06587bb51377bfd1 | |
parent | d7e77fdefb37e2b1244c7c38b544d6c893a671ed (diff) | |
download | qarepo-30a195d307f9166ea5ca6b0b93ec3b205472ee87.tar qarepo-30a195d307f9166ea5ca6b0b93ec3b205472ee87.tar.gz qarepo-30a195d307f9166ea5ca6b0b93ec3b205472ee87.tar.bz2 qarepo-30a195d307f9166ea5ca6b0b93ec3b205472ee87.tar.xz qarepo-30a195d307f9166ea5ca6b0b93ec3b205472ee87.zip |
New release
This version supports simultaneous 32-bit and 64-bit local repos.
They will be (unimaginatively) named 'QA Testing (32-bit)' and 'QA Testing (64-bit)'.
The repos will be stored in 'i586' and 'x86_64' subdirectories of the directory
specified in the QA Repo box.
Each repo can be independently enabled/disabled. The repos can have different contents.
When you switch between them in the GUI, the RPMs box will be updated to show the current
contents of the selected repo.
Before using the new version, make sure the old 'QA Testing' repo is disabled, and, if you
want to save redownloading lots of files, move the the contents of your current repo down one
level into the appropriately named (i586 or x86_64) subdirectory.
-rw-r--r-- | qarepo.pl | 224 |
1 files changed, 131 insertions, 93 deletions
@@ -25,7 +25,7 @@ use Gtk3 '-init'; use MDK::Common; use URPM; -my $release = 'v1.3'; +my $version = 'v1.4'; ############################################################################### # States and Status @@ -64,25 +64,25 @@ if (open(my $f, '<', $config_file)) { # Use sensible defaults for settings not in the config file. my $mirror = $config{MIRROR} // 'rsync://mirrors.kernel.org/mirrors/mageia'; -my $version = $config{VERSION} // '6'; +my $release = $config{RELEASE} // '6'; my $arch = $config{ARCH} // 'x86_64'; my $nonfree = $config{NONFREE} // 1; my $tainted = $config{TAINTED} // 1; my $qa_repo = $config{QA_REPO} // "$home/qa-testing"; -my $qa_repo_name = 'QA Testing'; - -my $repo_name_and_url = `urpmq --list-url | grep '$qa_repo_name '`; -chomp($repo_name_and_url); +my %qa_repo_names = ( + i586 => 'QA Testing (32-bit)', + x86_64 => 'QA Testing (64-bit)' +); -my $active_qa_repo = $repo_name_and_url =~ s/$qa_repo_name +//r; +my $qa_repo_name; +my $active_qa_repo; -if ($repo_name_and_url && $active_qa_repo ne $qa_repo) { - disable_repo(); -} +my $last_release = $release; +my $last_arch = ''; -my $last_version = $version; -my $last_arch = $arch; +my $fatal_message = '*** application will terminate ***'; +my $fatal_error; ############################################################################### # GUI Main Window @@ -95,14 +95,14 @@ my $grid = Gtk3::Grid->new(); my $label1 = Gtk3::Label->new('Mirror:'); my $entry1 = Gtk3::Entry->new(); -my $label2 = Gtk3::Label->new('Version:'); +my $label2 = Gtk3::Label->new('Release:'); my $entry2 = Gtk3::Entry->new(); -my $label3 = Gtk3::Label->new('Arch:'); -my $entry3 = Gtk3::ComboBoxText->new(); +my $label3 = Gtk3::Label->new('QA Repo:'); +my $entry3 = Gtk3::Entry->new(); -my $label4 = Gtk3::Label->new('QA Repo:'); -my $entry4 = Gtk3::Entry->new(); +my $label4 = Gtk3::Label->new('Arch:'); +my $entry4 = Gtk3::ComboBoxText->new(); my $label5 = Gtk3::Label->new('RPMs:'); my $entry5 = Gtk3::TextView->new(); @@ -117,13 +117,14 @@ my $button2 = Gtk3::Button->new('Disable'); my $button3 = Gtk3::Button->new('Enable'); my $button4 = Gtk3::Button->new('Clear'); +my $check0 = Gtk3::CheckButton->new_with_label("core"); my $check1 = Gtk3::CheckButton->new_with_label("nonfree"); my $check2 = Gtk3::CheckButton->new_with_label("tainted"); my $check3 = Gtk3::CheckButton->new_with_label("fuzzy\nversion"); my $check4 = Gtk3::CheckButton->new_with_label("add\ndeps"); -$window->set_title("QA Repo $release"); +$window->set_title("QA Repo $version"); $window->set_default_size(600, 400); $window->set_border_width(10); $window->signal_connect(delete_event => \&quit); @@ -139,32 +140,31 @@ $entry1->signal_connect(changed => \&changed); $label2->set_halign('GTK_ALIGN_END'); -$entry2->set_text($version); +$entry2->set_text($release); $entry2->set_width_chars(2); $entry2->set_hexpand(TRUE); $entry2->signal_connect(changed => \&changed); $label3->set_halign('GTK_ALIGN_END'); -$entry3->append_text('i586'); -$entry3->append_text('x86_64'); -if ($arch eq 'x86_64') { - $entry3->set_active(1); -} else { - $entry3->set_active(0); -} +$entry3->set_text($qa_repo); +$entry3->set_hexpand(TRUE); $entry3->signal_connect(changed => \&changed); $label4->set_halign('GTK_ALIGN_END'); -$entry4->set_text($qa_repo); -$entry4->set_hexpand(TRUE); +$entry4->append_text('i586'); +$entry4->append_text('x86_64'); +if ($arch eq 'x86_64') { + $entry4->set_active(1); +} else { + $entry4->set_active(0); +} $entry4->signal_connect(changed => \&changed); $label5->set_valign('GTK_ALIGN_START'); $label5->set_halign('GTK_ALIGN_END'); -$entry5->get_buffer->set_text(join("\n", get_existing_rpms())); $entry5->get_buffer->signal_connect(changed => \&changed); $scroll->set_hexpand(TRUE); @@ -185,34 +185,37 @@ $button4->set_vexpand(TRUE); $button4->set_valign('GTK_ALIGN_END'); $button4->signal_connect(clicked => \&clear); -$check1->signal_connect(clicked => \&changed); +$check0->set_active(TRUE); +$check0->set_sensitive(FALSE); + $check1->set_active($nonfree); +$check1->signal_connect(clicked => \&changed); -$check2->signal_connect(clicked => \&changed); $check2->set_active($tainted); +$check2->signal_connect(clicked => \&changed); -$check3->signal_connect(clicked => \&changed); $check3->set_active(FALSE); +$check3->signal_connect(clicked => \&changed); -$check4->signal_connect(clicked => \&changed); $check4->set_active(FALSE); +$check4->signal_connect(clicked => \&changed); $grid->attach($label1, 0, 0, 1, 1); -$grid->attach($entry1, 1, 0, 6, 1); +$grid->attach($entry1, 1, 0, 5, 1); $grid->attach($label2, 1, 1, 1, 1); $grid->attach($entry2, 2, 1, 1, 1); -$grid->attach($label3, 3, 1, 1, 1); -$grid->attach($entry3, 4, 1, 1, 1); -$grid->attach($check1, 5, 1, 1, 1); -$grid->attach($check2, 6, 1, 1, 1); +$grid->attach($check0, 3, 1, 1, 1); +$grid->attach($check1, 4, 1, 1, 1); +$grid->attach($check2, 5, 1, 1, 1); -$grid->attach($label4, 0, 2, 1, 1); -$grid->attach($entry4, 1, 2, 6, 1); +$grid->attach($label3, 0, 2, 1, 1); +$grid->attach($entry3, 1, 2, 4, 1); +$grid->attach($entry4, 5, 2, 1, 1); $grid->attach($label5, 0, 3, 1, 1); -$grid->attach($scroll, 1, 3, 6, 4); +$grid->attach($scroll, 1, 3, 5, 4); $grid->attach($label6, 0, 7, 1, 1); -$grid->attach($status, 1, 7, 6, 1); +$grid->attach($status, 1, 7, 5, 1); $grid->attach($button1, 7, 0, 1, 1); $grid->attach($button2, 7, 2, 1, 1); @@ -223,12 +226,6 @@ $grid->attach($button4, 7, 6, 1, 1); $window->add($grid); -if ($active_qa_repo) { - set_state('enabled'); -} else { - set_state('disabled'); -} - ############################################################################### # GUI Error Dialogue ############################################################################### @@ -249,7 +246,7 @@ $error_window->set_title("Error"); $error_window->set_default_size(600, 300); $error_window->set_border_width(10); $error_window->set_type_hint('dialog'); -$error_window->signal_connect(delete_event => sub { $error_window->hide_on_delete() }); +$error_window->signal_connect(delete_event => \&error_dismiss); $error_grid->set_row_spacing(10); $error_grid->set_column_spacing(10); @@ -262,7 +259,7 @@ $error_scroll->set_hexpand(TRUE); $error_scroll->set_vexpand(TRUE); $error_scroll->add($error_text); -$error_button->signal_connect(clicked => sub { $error_window->hide() }); +$error_button->signal_connect(clicked => \&error_dismiss); $error_button->set_halign('GTK_ALIGN_CENTER'); $error_grid->attach($error_label, 0, 0, 1, 1); @@ -275,6 +272,8 @@ $error_window->add($error_grid); # GUI Start ############################################################################### +changed(); + $window->show_all(); Gtk3->main(); @@ -284,21 +283,32 @@ Gtk3->main(); ############################################################################### sub changed { - set_state('changed'); + $arch = trim($entry4->get_active_text()); + if ($arch ne $last_arch) { + $last_arch = $arch; + set_qa_repo_info(); + if ($active_qa_repo) { + set_state('enabled'); + } else { + set_state('disabled'); + } + } else { + set_state('changed'); + } } sub quit { get_settings(); if (open(my $f, '>', $config_file)) { printf $f "MIRROR=%s\n", $mirror; - printf $f "VERSION=%s\n", $version; + printf $f "RELEASE=%s\n", $release; printf $f "ARCH=%s\n", $arch; printf $f "NONFREE=%d\n", $nonfree; printf $f "TAINTED=%d\n", $tainted; printf $f "QA_REPO=%s\n", $qa_repo; close($f); } - Gtk3->main_quit; + Gtk3->main_quit(); } sub disable { @@ -332,10 +342,33 @@ sub clear { $entry5->get_buffer()->set_text(''); } +sub error_dismiss { + if ($fatal_error) { + Gtk3->main_quit(); + } else { + $error_window->hide_on_delete() + } +} + ############################################################################### # Subsidiary Functions ############################################################################### +sub set_qa_repo_info { + $qa_repo_name = $qa_repo_names{$arch}; + + my $repo_name_and_url = `urpmq --list-url | grep '$qa_repo_name '`; + chomp($repo_name_and_url); + + $active_qa_repo = $repo_name_and_url =~ s/\Q$qa_repo_name\E\s+(\S+)\/$arch/$1/r; + + if ($repo_name_and_url && $active_qa_repo ne $qa_repo) { + disable_repo(); + } + + $entry5->get_buffer->set_text(join("\n", get_existing_rpms())); +} + sub set_state { my ($new_state) = @_; $state = $new_state; @@ -361,11 +394,11 @@ sub disable_buttons { sub get_settings { $mirror = trim($entry1->get_text()); - $version = trim($entry2->get_text()); - $arch = trim($entry3->get_active_text()); + $release = trim($entry2->get_text()); + $arch = trim($entry4->get_active_text()); $nonfree = $check1->get_active(); $tainted = $check2->get_active(); - $qa_repo = trim($entry4->get_text()); + $qa_repo = trim($entry3->get_text()); if ($active_qa_repo && $active_qa_repo ne $qa_repo) { disable_repo(); } @@ -381,7 +414,7 @@ sub get_requested_rpms { my @lines = split("\n", $buffer->get_text($start, $end, FALSE)); if ($fuzzy_version) { # replace version-release with wildcard - s/-\d.*-.+(\.mga$version(?:(?:\.$arch|\.noarch)(?:\.rpm)?)?)$/-\\d*$1/ foreach @lines; + s/-\d.*-.+(\.mga$release(?:(?:\.$arch|\.noarch)(?:\.rpm)?)?)$/-\\d*$1/ foreach @lines; } s/^\s+// foreach @lines; # trim leading white space s/\s+$// foreach @lines; # trim trailing white space @@ -389,7 +422,7 @@ sub get_requested_rpms { } sub get_existing_rpms { - map { basename($_) } glob("$qa_repo/*.rpm"); + map { basename($_) } glob("$qa_repo/$arch/*.rpm"); } sub disable_repo { @@ -397,18 +430,18 @@ sub disable_repo { $active_qa_repo = ''; } else { my $message = "couldn't disable the $qa_repo_name media"; - show_error_dialogue($message); - die "ERROR: $message.\n"; + show_error_dialogue($message, $fatal_message); + print_error($message, 'fatal'); } } sub enable_repo { - if (system("$sudo urpmi.addmedia --update '$qa_repo_name' $qa_repo") == 0) { + if (system("$sudo urpmi.addmedia --update '$qa_repo_name' $qa_repo/$arch") == 0) { $active_qa_repo = $qa_repo; } else { my $message = "couldn't enable the $qa_repo_name media"; show_error_dialogue($message); - print "ERROR: $message.\n"; + print_error($message); $active_qa_repo = ''; } } @@ -417,7 +450,7 @@ sub update_repo { if (system("$sudo urpmi.update '$qa_repo_name'") != 0) { my $message = "couldn't update the $qa_repo_name media"; show_error_dialogue($message); - print "ERROR: $message.\n"; + print_error($message); disable_repo(); } } @@ -426,10 +459,10 @@ sub clear_repo { my ($type) = @_; my @existing_rpms = grep { $_ =~ /$type/ } get_existing_rpms(); if (@existing_rpms) { - if (!unlink(map { "$qa_repo/$_" } @existing_rpms)) { + if (!unlink(map { "$qa_repo/$arch/$_" } @existing_rpms)) { my $message = "couldn't delete existing RPMs in the QA repo"; - show_error_dialogue($message); - die "ERROR: $message.\n"; + show_error_dialogue($message, $fatal_message); + print_error($message, 'fatal'); } } } @@ -443,28 +476,27 @@ sub sync_repo { my $sync_file; if ($mirror =~ /^rsync:/) { $sync_file = \&sync_file_rsync; - } elsif ($mirror =~ /^ftp:/ - || $mirror =~ /^http:/) { + } elsif ($mirror =~ /^ftp:/ || $mirror =~ /^http:/) { $sync_file = \&sync_file_aria2; } elsif ($mirror !~ /^\w+:/) { $sync_file = \&sync_file_link; } else { my $message = "unsupported mirror URL type"; show_error_dialogue($message); - print "ERROR: $message.\n"; + print_error($message); return 0; } - if ($version ne $last_version || $arch ne $last_arch) { - $last_version = $version; - $last_arch = $arch; + if ($release ne $last_release) { + $last_release = $release; clear_repo(); gtk_update(); } my $add_dependencies = $check4->get_active(); - my $remote_repo = "$mirror/distrib/$version/$arch/media"; + my $remote_repo = "$mirror/distrib/$release/$arch/media"; + my $local_repo = "$qa_repo/$arch"; my @mediatypes = ( 'core' ); push @mediatypes, 'nonfree' if $nonfree; @@ -498,9 +530,9 @@ sub sync_repo { }); if (!unlink("$download_dir/$synthesis")) { - my $message = "couldn't delete $download_dir/$synthesis in the QA repo.\n"; - show_error_dialogue($message); - die "ERROR: $message.\n"; + my $message = "couldn't delete $download_dir/$synthesis in the QA repo"; + show_error_dialogue($message, $fatal_message); + print_error($message, 'fatal'); } gtk_update(); } @@ -531,26 +563,26 @@ sub sync_repo { return 0; } - my @required_rpms = keys %selection; + my @required_rpms = sort keys %selection; my @existing_rpms = get_existing_rpms(); my @unwanted_rpms = difference2(\@existing_rpms, \@required_rpms); if (@unwanted_rpms) { - if (!unlink(map { "$qa_repo/$_" } @unwanted_rpms)) { - my $message = "couldn't delete unwanted RPMs in the QA repo.\n"; - show_error_dialogue($message); - die "ERROR: $message.\n"; + if (!unlink(map { "$local_repo/$_" } @unwanted_rpms)) { + my $message = "couldn't delete unwanted RPMs in the QA repo"; + show_error_dialogue($message, $fatal_message); + print_error($message, 'fatal'); } } - my $old_pubkey = "$qa_repo/media_info/pubkey"; + my $old_pubkey = "$local_repo/media_info/pubkey"; if (-e $old_pubkey) { if (!unlink($old_pubkey)) { - my $message = "couldn't delete old pubkey in the QA repo.\n"; - show_error_dialogue($message); - die "ERROR: $message.\n"; + my $message = "couldn't delete old pubkey in the QA repo"; + show_error_dialogue($message, $fatal_message); + print_error($message, 'fatal'); } } - mkdir_p("$qa_repo/media_info"); + mkdir_p("$local_repo/media_info"); gtk_update(); foreach my $rpm (difference2(\@required_rpms, \@existing_rpms)) { @@ -562,17 +594,17 @@ sub sync_repo { } else { $remote_url .= "/core/updates_testing/$rpm"; } - &$sync_file($remote_url, $qa_repo); + &$sync_file($remote_url, $local_repo); gtk_update(); } - &$sync_file("$remote_repo/core/updates_testing/media_info/pubkey", "$qa_repo/media_info"); + &$sync_file("$remote_repo/core/updates_testing/media_info/pubkey", "$local_repo/media_info"); gtk_update(); - if (@sync_errors == 0) { - system("genhdlist2 --allow-empty-media $qa_repo") == 0 - or sync_error("failed to update hdlist"); + if (@sync_errors) { + print_error('failed to download all the files'); } else { - print "ERROR: failed to download all the files.\n"; + system("genhdlist2 --allow-empty-media $local_repo") == 0 + or sync_error("failed to update hdlist"); } if (@sync_errors) { @@ -612,7 +644,7 @@ sub sync_file_link { sub sync_error { my ($message) = @_; push @sync_errors, $message; - print "ERROR: $message.\n"; + print_error($message); 0; } @@ -636,6 +668,12 @@ sub show_error_dialogue { $error_window->show_all(); } +sub print_error { + my ($message, $o_fatal) = @_; + print "ERROR: $message.\n"; + $fatal_error = $o_fatal; +} + sub gtk_update { while (Gtk3::events_pending()) { Gtk3::main_iteration(); |