X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=submit%2Fcontest;h=7d5445663a099bcfd3d0ccc0dbf7d8b1c6170935;hb=24a6e512fa3427c0f7f3003723093ff38ec11637;hp=0246cadf680d33b4793d61b08750928d147cb435;hpb=3717439c7ae2a6188b4bb396cb9daf7da188ba5c;p=eval.git
diff --git a/submit/contest b/submit/contest
index 0246cad..7d54456 100755
--- a/submit/contest
+++ b/submit/contest
@@ -8,7 +8,7 @@ use warnings;
BEGIN {
defined $ENV{"MO_ROOT"} or die "Please set MO_ROOT to the contest root directory first.\n";
}
-use lib $ENV{"MO_ROOT"} . "/submit";
+use lib $ENV{"MO_ROOT"} . "/lib/perl5";
use lib $ENV{"MO_ROOT"} . "/submit/lib/perl5";
use MO::Submit;
@@ -45,14 +45,17 @@ $title_lab->set_markup("" . $conn->{"Contest"} . "")
# The row of buttons
my $b_submit = Gtk2::Button->new('Submit');
+$b_submit->set_image(Gtk2::Image->new_from_stock('gtk-apply', 'button'));
$b_submit->signal_connect(clicked => sub { submit(0) });
$b_submit->set_sensitive(0);
my $b_check = Gtk2::Button->new('Check');
+$b_check->set_image(Gtk2::Image->new_from_stock('gtk-find', 'button'));
$b_check->signal_connect(clicked => sub { submit(1) });
$b_check->set_sensitive(0);
my $b_refresh = Gtk2::Button->new('Refresh');
+$b_refresh->set_image(Gtk2::Image->new_from_stock('gtk-refresh', 'button'));
$b_refresh->signal_connect(clicked => sub { start_refresh_timer(1) });
my $button_box = Gtk2::HBox->new;
@@ -151,7 +154,7 @@ my $refresh_timer_id;
sub timed_refresh()
{
- refresh(); # FIXME: If-modified-since version?
+ refresh();
return 1; # We wish to re-run the timer
}
@@ -159,7 +162,7 @@ sub start_refresh_timer($) {
my ($go) = @_;
stop_refresh_timer();
refresh() if $go;
- $refresh_timer_id = Glib::Timeout->add(5000, \&timed_refresh);
+ $refresh_timer_id = Glib::Timeout->add($conn->{"RefreshTimer"}, \&timed_refresh);
}
sub stop_refresh_timer() {
@@ -255,6 +258,7 @@ sub refresh()
if (!$conn->is_connected && !$force_refresh) {
# Retry
$conn->log("Retrying");
+ $force_refresh = 1;
refresh();
}
}
@@ -267,6 +271,7 @@ my $subwin_vbox;
my $subwin_label;
my $bbutton_box;
my $submitting_label;
+my $text_frame;
my $status_label;
my $check_only;
my $submit_filename;
@@ -276,12 +281,11 @@ my %submit_fn_cache = ();
sub end_submit($) {
my ($close) = @_;
$subwin->destroy if $close;
- start_refresh_timer(0);
- ### FIXME: ... and refresh status
+ start_refresh_timer(1);
}
sub finish_submit() {
- my $button = Gtk2::Button->new('Return');
+ my $button = Gtk2::Button->new_from_stock('gtk-close');
$button->signal_connect(clicked => sub { end_submit(1) });
$bbutton_box = Gtk2::HButtonBox->new;
@@ -308,24 +312,33 @@ sub submit_failed($) {
}
sub run_submit() {
+ my ($task, $part) = split /\//, $selected_task;
+ defined $part or $part = $task;
+
+ if (defined $conn->{"History"}) {
+ busy("Submitting locally to " . $conn->{"History"});
+ my $err = $conn->write_history($task, $part, $submit_extension, $submit_filename);
+ if (defined $err) {
+ submit_failed("Recording to local history failed\n($err)");
+ return;
+ }
+ }
+
if ($conn->is_connected) {
- ### FIXME: Busy cursor should be started earlier
busy("Checking server status...");
- my $r = new Sherlock::Object("!" => "STATUS"); ### FIXME: use a NOP command
+ my $r = new Sherlock::Object("!" => "NOP");
$r = $conn->request($r);
}
if (!$conn->is_connected) {
busy("Reconnecting to server...");
if (!$conn->connect) {
ready($conn->{"error"});
- submit_failed("Unable to connect to the server"); ### FIXME: Mention local submit
+ submit_failed("Unable to connect to the server");
+ return;
}
}
busy("Submitting...");
- my ($task, $part) = split /\//, $selected_task;
- defined $part or $part = $task;
-
my $fh = new IO::File($submit_filename);
if (!$fh) {
submit_failed("Unable to open $submit_filename\n($!)");
@@ -361,10 +374,40 @@ sub run_submit() {
submit_ok();
}
+sub checks_ok() {
+ if ($check_only) {
+ $status_label->set_markup("Checked successfully");
+ $submitting_label->set_markup("The task has passed the checks.");
+ finish_submit();
+ return;
+ }
+
+ $status_label->set_markup("Submitting");
+ $subwin->show_all;
+
+ # Continue when everything is displayed
+ Glib::Idle->add(sub {
+ $window->Gtk2::Gdk::flush;
+ run_submit();
+ return 0;
+ });
+}
+
+sub checks_override() {
+ $submitting_label = Gtk2::Label->new("Please wait...");
+ $subwin_vbox->pack_start_defaults($submitting_label);
+
+ $subwin->window->set_cursor($busy_cursor);
+ $bbutton_box->destroy;
+ $text_frame->destroy;
+ checks_ok();
+}
+
sub checks_failed($) {
my ($msg) = @_;
$status_label->set_markup("Check failed");
+ $submitting_label->destroy;
my $text_buffer = Gtk2::TextBuffer->new;
$text_buffer->set_text($msg);
@@ -373,31 +416,35 @@ sub checks_failed($) {
$text_view->set_editable(0);
$text_view->set_cursor_visible(0);
- $submitting_label->destroy;
- $subwin_vbox->pack_start_defaults($text_view);
+ my $text_scroll = Gtk2::ScrolledWindow->new;
+ $text_scroll->set_policy("automatic", "automatic");
+ $text_scroll->add($text_view);
- finish_submit();
-}
+ $text_frame = Gtk2::Frame->new("Checker log");
+ $text_frame->add($text_scroll);
-sub checks_ok() {
- if ($check_only) {
- $status_label->set_markup("Checked successfully");
- $submitting_label->set_markup("The task has passed the checks.");
+ $subwin_vbox->pack_start_defaults($text_frame);
+
+ if ($check_only || !$conn->{"AllowOverride"}) {
finish_submit();
return;
}
- ### FIXME: Record to local history here
+ my $close_button = Gtk2::Button->new_from_stock('gtk-close');
+ $close_button->signal_connect(clicked => sub { end_submit(1) });
- $status_label->set_markup("Submitting");
- $subwin->show_all;
+ my $anyway_button = Gtk2::Button->new('Submit anyway');
+ $anyway_button->signal_connect(clicked => \&checks_override);
- # Continue when everything is displayed
- Glib::Idle->add(sub {
- $window->Gtk2::Gdk::flush;
- run_submit();
- return 0;
- });
+ $bbutton_box = Gtk2::HButtonBox->new;
+ $bbutton_box->pack_start_defaults($anyway_button);
+ $bbutton_box->pack_start_defaults($close_button);
+ $bbutton_box->set_border_width(5);
+ $subwin_vbox->pack_start($bbutton_box, 0, 0, 10);
+
+ ready("Ready");
+ $subwin->show_all;
+ $subwin->window->set_cursor(undef);
}
sub run_checks() {
@@ -406,9 +453,19 @@ sub run_checks() {
checks_failed("The filename does not have a valid extension");
return;
}
- sleep 1;
- #checks_failed("One\nTwo\nThree...\n");
- checks_ok();
+ if (!$conn->{"Checks"}) {
+ checks_ok();
+ return;
+ }
+ my $root = $conn->{"root"};
+ my ($task, $part) = split /\//, $selected_task;
+ defined $part or $part = "";
+ my $verdict = `$root/bin/check -s "$submit_filename" $task $part 2>&1`;
+ if ($?) {
+ checks_failed($verdict);
+ } else {
+ checks_ok();
+ }
}
sub do_submit() {
@@ -451,10 +508,10 @@ sub submit($) {
$subwin->signal_connect("delete-event" => sub { end_submit(0); return 0; });
my $bb_submit = Gtk2::Button->new($check_only ? 'Check' : 'Submit');
+ $bb_submit->set_image(Gtk2::Image->new_from_stock('gtk-apply', 'button'));
$bb_submit->signal_connect(clicked => \&do_submit);
- #$bb_submit->set_sensitive(0);
- my $bb_cancel = Gtk2::Button->new('Cancel');
+ my $bb_cancel = Gtk2::Button->new_from_stock('gtk-cancel');
$bb_cancel->signal_connect(clicked => sub { end_submit(1) });
$bbutton_box = Gtk2::HButtonBox->new;