]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 705393: Improve the error message thrown by Update.pm when updates.bugzilla.org...
authorFrédéric Buclin <LpSolit@gmail.com>
Mon, 28 Nov 2011 16:10:07 +0000 (17:10 +0100)
committerFrédéric Buclin <LpSolit@gmail.com>
Mon, 28 Nov 2011 16:10:07 +0000 (17:10 +0100)
r=glob a=LpSolit

Bugzilla/Constants.pm
Bugzilla/Update.pm
template/en/default/index.html.tmpl

index 5c9fecc579371f87ee02290f743fdc9dce1b7ed7..e443065200e72c6593ccb67db837170b3a10af22 100644 (file)
@@ -40,6 +40,9 @@ use Memoize;
 @Bugzilla::Constants::EXPORT = qw(
     BUGZILLA_VERSION
 
+    REMOTE_FILE
+    LOCAL_FILE
+
     bz_locations
 
     IS_NULL
@@ -201,6 +204,10 @@ use Memoize;
 # Bugzilla version
 use constant BUGZILLA_VERSION => "4.1.3+";
 
+# Location of the remote and local XML files to track new releases.
+use constant REMOTE_FILE => 'http://updates.bugzilla.org/bugzilla-update.xml';
+use constant LOCAL_FILE  => 'bugzilla-update.xml'; # Relative to datadir.
+
 # These are unique values that are unlikely to match a string or a number,
 # to be used in criteria for match() functions and other things. They start
 # and end with spaces because most Bugzilla stuff has trim() called on it,
index a94fd167d427b148a406a4645e73eaff7b142e8c..c9942a4f08c85d61eab6b429500ddff4830ea26c 100644 (file)
@@ -20,8 +20,6 @@ use strict;
 
 use Bugzilla::Constants;
 
-use constant REMOTE_FILE   => 'http://updates.bugzilla.org/bugzilla-update.xml';
-use constant LOCAL_FILE    => "/bugzilla-update.xml"; # Relative to datadir.
 use constant TIME_INTERVAL => 86400; # Default is one day, in seconds.
 use constant TIMEOUT       => 5; # Number of seconds before timeout.
 
@@ -30,26 +28,25 @@ sub get_notifications {
     return if !Bugzilla->feature('updates');
     return if (Bugzilla->params->{'upgrade_notification'} eq 'disabled');
 
-    my $local_file = bz_locations()->{'datadir'} . LOCAL_FILE;
+    my $local_file = bz_locations()->{'datadir'} . '/' . LOCAL_FILE;
     # Update the local XML file if this one doesn't exist or if
     # the last modification time (stat[9]) is older than TIME_INTERVAL.
     if (!-e $local_file || (time() - (stat($local_file))[9] > TIME_INTERVAL)) {
         unlink $local_file; # Make sure the old copy is away.
-        if (-e $local_file) {
-            return { 'error' => 'no_update', xml_file => $local_file };
-        }
+        return { 'error' => 'no_update' } if (-e $local_file);
+
         my $error = _synchronize_data();
         # If an error is returned, leave now.
         return $error if $error;
     }
 
     # If we cannot access the local XML file, ignore it.
-    return {'error' => 'no_access', 'xml_file' => $local_file} unless (-r $local_file);
+    return { 'error' => 'no_access' } unless (-r $local_file);
 
     my $twig = XML::Twig->new();
     $twig->safe_parsefile($local_file);
     # If the XML file is invalid, return.
-    return {'error' => 'corrupted', 'xml_file' => $local_file} if $@;
+    return { 'error' => 'corrupted' } if $@;
     my $root = $twig->root;
 
     my @releases;
@@ -119,7 +116,7 @@ sub get_notifications {
 }
 
 sub _synchronize_data {
-    my $local_file = bz_locations()->{'datadir'} . LOCAL_FILE;
+    my $local_file = bz_locations()->{'datadir'} . '/' . LOCAL_FILE;
 
     my $ua = LWP::UserAgent->new();
     $ua->timeout(TIMEOUT);
@@ -133,7 +130,7 @@ sub _synchronize_data {
     else {
         $ua->env_proxy;
     }
-    $ua->mirror(REMOTE_FILE, $local_file);
+    my $response = eval { $ua->mirror(REMOTE_FILE, $local_file) };
 
     # $ua->mirror() forces the modification time of the local XML file
     # to match the modification time of the remote one.
@@ -144,11 +141,14 @@ sub _synchronize_data {
         # Try to alter its last modification time.
         my $can_alter = utime(undef, undef, $local_file);
         # This error should never happen.
-        $can_alter || return {'error' => 'no_update', 'xml_file' => $local_file};
+        $can_alter || return { 'error' => 'no_update' };
     }
-    else {
+    elsif ($response && $response->is_error) {
         # We have been unable to download the file.
-        return {'error' => 'cannot_download', 'xml_file' => $local_file};
+        return { 'error' => 'cannot_download', 'reason' => $response->status_line };
+    }
+    else {
+        return { 'error' => 'no_write', 'reason' => $@ };
     }
 
     # Everything went well.
index b1370261fd54871bd39d5fba3cef1ea669080636..98648e25edbf6ad182051b5e7eeabdbfe960d96c 100644 (file)
@@ -92,18 +92,24 @@ YAHOO.util.Event.onDOMReady(onLoadActions);
       You can configure this notification from the
       <a href="editparams.cgi?section=general#upgrade_notification_desc">Parameters</a> page.</p>
     [% ELSIF release.error == "cannot_download" %]
-      <p>The local XML file '[% release.xml_file FILTER html %]' cannot be created.
-      Please make sure the web server can write in this directory and that you can access
+      <p>The remote file <a href="[% constants.REMOTE_FILE FILTER html %]">
+      [%~ constants.REMOTE_FILE FILTER html %]</a> cannot be downloaded
+      (reason: [% release.reason FILTER html %]).<br>
+      Either the remote server is temporarily unavailable, or your web server cannot access
       the web. If you are behind a proxy, set the
       <a href="editparams.cgi?section=advanced#proxy_url_desc">proxy_url</a> parameter correctly.</p>
+    [% ELSIF release.error == "no_write" %]
+      <p>The local XML file '[% constants.LOCAL_FILE FILTER html %]' cannot be created
+      (reason: [% release.reason FILTER html %]).<br>
+      Please make sure the web server can write into this directory.
     [% ELSIF release.error == "no_update" %]
-      <p>The local XML file '[% release.xml_file FILTER html %]' cannot be updated.
+      <p>The local XML file '[% constants.LOCAL_FILE FILTER html %]' cannot be updated.
       Please make sure the web server can edit this file.</p>
     [% ELSIF release.error == "no_access" %]
-      <p>The local XML file '[% release.xml_file FILTER html %]' cannot be read.
+      <p>The local XML file '[% constants.LOCAL_FILE FILTER html %]' cannot be read.
       Please make sure this file has the correct rights set on it.</p>
     [% ELSIF release.error == "corrupted" %]
-      <p>The local XML file '[% release.xml_file FILTER html %]' has an invalid XML format.
+      <p>The local XML file '[% constants.LOCAL_FILE FILTER html %]' has an invalid XML format.
       Please delete it and try accessing this page again.</p>
     [% ELSIF release.error == "unknown_parameter" %]
       <p>'[% Param("upgrade_notification") FILTER html %]' is not a valid notification