X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=submit%2Fcontest;h=7d5445663a099bcfd3d0ccc0dbf7d8b1c6170935;hb=6cba59728737842b32077102280642d269b78d90;hp=0c2e0227a98528727a41b675f90ea7fdc67fcae6;hpb=27eeef5382c1b3693c6ab64391cac17de9dc0016;p=moe.git diff --git a/submit/contest b/submit/contest index 0c2e022..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($conn->{"RefreshTimer}, \&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; @@ -312,8 +316,8 @@ sub run_submit() { defined $part or $part = $task; if (defined $conn->{"History"}) { - busy("Submitting locally"); - my $err = $conn->local_submit($task, $part, $submit_extension, $submit_filename); + 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; @@ -322,14 +326,14 @@ sub run_submit() { if ($conn->is_connected) { 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; } } @@ -370,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); @@ -382,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() { @@ -415,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() { @@ -460,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;