? log.txt
? modules/simpletest/tests/343502.test
? modules/simpletest/tests/path.test
? modules/system/system.http.inc
Index: modules/system/system.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.admin.inc,v
retrieving revision 1.110
diff -u -p -r1.110 system.admin.inc
--- modules/system/system.admin.inc	26 Nov 2008 13:54:05 -0000	1.110
+++ modules/system/system.admin.inc	6 Dec 2008 03:23:21 -0000
@@ -1802,6 +1802,49 @@ function system_status($check = FALSE) {
 }
 
 /**
+ * Menu callback: exports the site status report.
+ */
+function system_status_export() {
+  // Load .install files
+  include_once DRUPAL_ROOT . '/includes/install.inc';
+  drupal_load_updates();
+
+  // Check run-time requirements and status information.
+  $requirements = module_invoke_all('requirements', 'runtime');
+  usort($requirements, '_system_sort_requirements');
+
+  // Fetch list of enabled modules and their versions.
+  $modules = module_rebuild_cache();
+  $enabled = array();
+  foreach ($modules as $module) {
+    if ($module->status && !isset($module->info['required'])) {
+      $enabled[] = $module->name . (isset($module->info['version']) ? ' ' . $module->info['version'] : '');
+    }
+  }
+  sort($enabled);
+  $requirements[] = array(
+    'title' => t('Enabled modules'),
+    'value' => theme('item_list', $enabled),
+  );
+
+  // Generate output using a simple HTML markup structure.
+  $output = '<h1>Status Report</h1>';
+  foreach ($requirements as $requirement) {
+    if (empty($requirement['#type'])) {
+      // Contrary to the on-site page, the export should not contain descriptions.
+      $output .= '<h2>' . $requirement['title'] . '</h2><p>' . $requirement['value'] . '</p>';
+    }
+  }
+  
+  // Force the browser to display the file save dialog.
+  drupal_set_header('Content-Type: text/plain; charset=utf-8');
+  drupal_set_header('Content-Disposition: attachment; filename="system-status-report.txt"');
+  // Strip links and any other HTML tags from the output.
+  echo drupal_html_to_text($output, array('p', 'ul', 'li', 'h1', 'h2'));
+  exit;
+}
+
+/**
  * Menu callback: run cron manually.
  */
 function system_run_cron() {
Index: modules/system/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.module,v
retrieving revision 1.650
diff -u -p -r1.650 system.module
--- modules/system/system.module	28 Nov 2008 09:25:59 -0000	1.650
+++ modules/system/system.module	6 Dec 2008 03:23:23 -0000
@@ -110,7 +110,7 @@ function system_help($path, $arg) {
     case 'admin/settings/ip-blocking':
       return '<p>' . t('IP addresses listed here are blocked from your site before any modules are loaded. You may add IP addresses to the list, or delete existing entries.') . '</p>';
     case 'admin/reports/status':
-      return '<p>' . t("Here you can find a short overview of your site's parameters as well as any problems detected with your installation. It may be useful to copy and paste this information into support requests filed on drupal.org's support forums and project issue queues.") . '</p>';
+      return '<p>' . t("Here you can find a short overview of your site's parameters as well as any problems detected with your installation. It may be useful to <a href=\"@status-report-export\">attach this information</a> to support requests and bug reports filed on drupal.org's project issue queues.", array('@status-report-export' => url('admin/reports/status/export'))) . '</p>';
   }
 }
 
@@ -705,6 +705,12 @@ function system_menu() {
     'access arguments' => array('administer site configuration'),
     'type' => MENU_CALLBACK,
   );
+  $items['admin/reports/status/export'] = array(
+    'title' => 'Export status report',
+    'page callback' => 'system_status_export',
+    'access arguments' => array('administer site configuration'),
+    'type' => MENU_CALLBACK,
+  );
   // Default page for batch operations
   $items['batch'] = array(
     'page callback' => 'system_batch_page',
