Index: install.php
===================================================================
RCS file: /cvs/drupal/drupal/install.php,v
retrieving revision 1.168
diff -u -p -r1.168 install.php
--- install.php	12 May 2009 08:37:44 -0000	1.168
+++ install.php	14 May 2009 23:20:00 -0000
@@ -619,7 +619,7 @@ function install_already_done_error() {
  * Tasks performed after the database is initialized.
  */
 function install_tasks($profile, $task) {
-  global $base_url, $install_locale;
+  global $base_url, $install_locale, $conf;
 
   // Bootstrap newly installed Drupal, while preserving existing messages.
   $messages = isset($_SESSION['messages']) ? $_SESSION['messages'] : '';
@@ -698,7 +698,9 @@ function install_tasks($profile, $task) 
   }
 
   if ($task == 'configure') {
-    if (variable_get('site_name', FALSE) || variable_get('site_mail', FALSE)) {
+     // We need to check if a variable has been saved, because variable_get
+     // returns a different default value than we need here.
+     if (isset($conf['site_name']) || isset($conf['site_email'])) {
       // Site already configured: This should never happen, means re-running
       // the installer, possibly by an attacker after the 'install_task' variable
       // got accidentally blown somewhere. Stop it now.
@@ -706,7 +708,7 @@ function install_tasks($profile, $task) 
     }
     $form = drupal_render(drupal_get_form('install_configure_form', $url));
 
-    if (!variable_get('site_name', FALSE) && !variable_get('site_mail', FALSE)) {
+    if (!isset($conf['site_name']) && !isset($conf['site_email'])) {
       // Not submitted yet: Prepare to display the form.
       $output = $form;
       drupal_set_title(st('Configure site'));
Index: includes/bootstrap.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/bootstrap.inc,v
retrieving revision 1.280
diff -u -p -r1.280 bootstrap.inc
--- includes/bootstrap.inc	12 May 2009 18:08:42 -0000	1.280
+++ includes/bootstrap.inc	14 May 2009 23:20:00 -0000
@@ -625,14 +625,16 @@ function variable_init($conf = array()) 
  * @param $name
  *   The name of the variable to return.
  * @param $default
- *   The default value to use if this variable has never been set.
+ *   The default value for dynamic variables. Static variables defaults should
+ *   be declared in hook_variable_info().
  * @return
  *   The value of the variable.
  */
 function variable_get($name, $default = NULL) {
   global $conf;
 
-  return isset($conf[$name]) ? $conf[$name] : $default;
+  $value = isset($conf[$name]) ? $conf[$name] : variable_default($name);
+  return !is_null($value) ? $value : $default;
 }
 
 /**
@@ -643,15 +645,89 @@ function variable_get($name, $default = 
  * @param $value
  *   The value to set. This can be any PHP data type; these functions take care
  *   of serialization as necessary.
+ * @return
+ *   The value of the variable.
  */
 function variable_set($name, $value) {
   global $conf;
 
-  db_merge('variable')->key(array('name' => $name))->fields(array('value' => serialize($value)))->execute();
-
+  // Do not store default values in the database.
+  if ($value === variable_default($name)) {
+    variable_del($name);
+  }
+  else {
+    db_merge('variable')
+      ->key(array('name' => $name))
+      ->fields(array('value' => serialize($value)))
+      ->execute();
+  }
+  // Clear the cache and reset the variable.
   cache_clear_all('variables', 'cache');
 
-  $conf[$name] = $value;
+  return $conf[$name] = $value;
+}
+
+/**
+ * Gets the default value for a given variable.
+ *
+ * @param $name
+ *   The name of the variable in question.
+ * @return
+ *   The default value for that variable, to be used in case no value is set.
+ */
+function variable_default($name) {
+  $defaults = &drupal_static(__FILE__, array());
+  $loaded = &drupal_static(__FILE__ . ':loaded', FALSE);
+  $built = &drupal_static(__FILE__ . ':built', FALSE);
+
+  if (empty($defaults)) {
+    $built = FALSE;
+    // These variables need to be initialized here because they are required to
+    // exist before the database is set up and the variable system initialized.
+    $defaults['cache_inc'] = './includes/cache.inc';
+    $defaults['page_cache_fastpath'] = FALSE;
+    $defaults['blocked_ips'] = NULL;
+    $defaults['session_inc'] = './includes/session.inc';
+    $defaults['dev_query'] = 0;
+    $defaults['reverse_proxy'] = 0;
+    $defaults['reverse_proxy_addresses'] = array();
+    $defaults['cache'] = CACHE_DISABLED;
+    $defaults['cache_flush'] = 0;
+    $defaults['language_count'] = 1;
+    $defaults['session_write_interval'] = 180;
+    $defaults['site_frontpage'] = 'node';
+    $defaults['install_profile_modules'] = array();
+    $defaults['install_locale_batch_components'] = array();
+    $defaults['password_inc'] = './includes/password.inc';
+    $defaults['field_storage_module'] = 'field_sql_storage';
+    $defaults['language_default'] = (object) array('language' => 'en', 'name' => 'English', 'native' => 'English', 'direction' => 0, 'enabled' => 1, 'plurals' => 0, 'formula' => '', 'domain' => '', 'prefix' => '', 'weight' => 0, 'javascript' => '');
+  }
+  // We can only retrieve from the cache if the cache is available.
+  if (($loaded === FALSE) && function_exists('cache_get') && function_exists('db_query')) {
+    // Only try to load from cache once, set $loaded to TRUE.
+    $loaded = TRUE;
+    if (!defined('MAINTENANCE_MODE') && $cache = cache_get('variable_defaults') && !empty($cache->data)) {
+      $defaults = $cache->data;
+    }
+  }
+  // We use function_exists() here, because the registry may not be available early on in the page process.
+  if (($built === FALSE) && !isset($defaults[$name]) && function_exists('module_invoke_all') && function_exists('drupal_alter') && (!defined('MAINTENANCE_MODE') || MAINTENANCE_MODE != 'update')) {
+    // already set $built to prevent loops
+    $built = TRUE;
+
+    // Construct the default variables registry by invoking hook_variable_info() and hook_variable_info_alter().
+    $defaults += module_invoke_all('variable_info');
+    drupal_alter('variable_info', $defaults);
+
+    // We now have the full variables defaults, so save them to the cache, unless we are in maintenaince mode.
+    if (!defined('MAINTENANCE_MODE')) {
+      cache_set('variable_defaults', $defaults, 'cache');
+    }
+  }
+  if (array_key_exists($name, $defaults)) {
+    return $defaults[$name];
+  }
+  return NULL;
 }
 
 /**
Index: includes/password.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/password.inc,v
retrieving revision 1.6
diff -u -p -r1.6 password.inc
--- includes/password.inc	26 Feb 2009 07:30:26 -0000	1.6
+++ includes/password.inc	14 May 2009 23:20:00 -0000
@@ -15,23 +15,6 @@
  */
 
 /**
- * The standard log2 number of iterations for password stretching. This should
- * increase by 1 at least every other Drupal version in order to counteract
- * increases in the speed and power of computers available to crack the hashes.
- */
-define('DRUPAL_HASH_COUNT', 14);
-
-/**
- * The minimum allowed log2 number of iterations for password stretching.
- */
-define('DRUPAL_MIN_HASH_COUNT', 7);
-
-/**
- * The maximum allowed log2 number of iterations for password stretching.
- */
-define('DRUPAL_MAX_HASH_COUNT', 30);
-
-/**
  * Returns a string for mapping an int to the corresponding base 64 character.
  */
 function _password_itoa64() {
Index: modules/aggregator/aggregator.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/aggregator/aggregator.module,v
retrieving revision 1.407
diff -u -p -r1.407 aggregator.module
--- modules/aggregator/aggregator.module	14 May 2009 08:23:14 -0000	1.407
+++ modules/aggregator/aggregator.module	14 May 2009 23:20:01 -0000
@@ -30,6 +30,20 @@ function aggregator_help($path, $arg) {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function aggregator_variable_info() {
+  return array(
+    'aggregator_allowed_html_tags' => '<a> <b> <br> <dd> <dl> <dt> <em> <i> <li> <ol> <p> <strong> <u> <ul>',
+    'aggregator_category_selector' => 'checkboxes',
+    'aggregator_clear' => 9676800,
+    'aggregator_summary_items' => 3,
+    'feed_default_items' => 10,
+    'feed_item_length' => 'teaser',
+  );
+}
+
+/**
  * Implementation of hook_theme().
  */
 function aggregator_theme() {
Index: modules/block/block.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/block/block.module,v
retrieving revision 1.331
diff -u -p -r1.331 block.module
--- modules/block/block.module	14 May 2009 08:23:14 -0000	1.331
+++ modules/block/block.module	14 May 2009 23:20:01 -0000
@@ -88,6 +88,15 @@ function block_help($path, $arg) {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function block_variable_info() {
+  return array(
+    'block_cache' => CACHE_DISABLED,
+  );
+}
+
+/**
  * Implementation of hook_theme().
  */
 function block_theme() {
Index: modules/blogapi/blogapi.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/blogapi/blogapi.module,v
retrieving revision 1.150
diff -u -p -r1.150 blogapi.module
--- modules/blogapi/blogapi.module	9 May 2009 18:28:11 -0000	1.150
+++ modules/blogapi/blogapi.module	14 May 2009 23:20:01 -0000
@@ -21,6 +21,25 @@ function blogapi_help($path, $arg) {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function blogapi_variable_info() {
+  return array(
+    'blogapi_node_types' => blogapi_node_types_default(),
+  );
+}
+
+/**
+ * Returns the default value for the node types listing.
+ */
+function blogapi_node_types_default() {
+  if (node_get_types('type', 'blog')) {
+    return array('blog' => 1);
+  }
+  return array();
+}
+
+/**
  * Implementation of hook_perm().
  */
 function blogapi_perm() {
Index: modules/book/book.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/book/book.module,v
retrieving revision 1.493
diff -u -p -r1.493 book.module
--- modules/book/book.module	9 May 2009 18:28:11 -0000	1.493
+++ modules/book/book.module	14 May 2009 23:20:01 -0000
@@ -164,6 +164,17 @@ function book_menu() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function book_variable_info() {
+  return array(
+    'book_allowed_types' => array('book'),
+    'book_block_mode' => 'all pages',
+    'book_child_type' => 'book',
+  );
+}
+
+/**
  * Menu item access callback - determine if the outline tab is accessible.
  */
 function _book_outline_access($node) {
Index: modules/color/color.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/color/color.module,v
retrieving revision 1.57
diff -u -p -r1.57 color.module
--- modules/color/color.module	20 Apr 2009 20:02:31 -0000	1.57
+++ modules/color/color.module	14 May 2009 23:20:01 -0000
@@ -28,6 +28,19 @@ function color_theme() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function color_variable_info() {
+  return array(
+    'color_screenshot' => NULL,
+    'color_stylesheets' => array(),
+    'color_logo' => NULL,
+    'color_palette' => array(),
+    'color_files' => array(),
+  );
+}
+
+/**
  * Implementation of hook_form_FORM_ID_alter().
  */
 function color_form_system_theme_settings_alter(&$form, &$form_state) {
Index: modules/comment/comment.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/comment/comment.module,v
retrieving revision 1.709
diff -u -p -r1.709 comment.module
--- modules/comment/comment.module	12 May 2009 08:37:44 -0000	1.709
+++ modules/comment/comment.module	14 May 2009 23:20:02 -0000
@@ -214,6 +214,22 @@ function comment_menu() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function comment_variable_info() {
+  return array(
+    'comment_block_count' => 10,
+    'node_cron_comments_scale' => 0,
+    'comment_default_mode' => COMMENT_MODE_THREADED_EXPANDED,
+    'comment_default_per_page' => 50,
+    'comment_anonymous' => COMMENT_ANONYMOUS_MAYNOT_CONTACT,
+    'comment_subject_field' => 1,
+    'comment_preview' => COMMENT_PREVIEW_REQUIRED,
+    'comment_form_location' => COMMENT_FORM_SEPARATE_PAGE,
+  );
+}
+
+/**
  * Implementation of hook_node_type().
  */
 function comment_node_type($op, $info) {
Index: modules/contact/contact.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/contact/contact.module,v
retrieving revision 1.114
diff -u -p -r1.114 contact.module
--- modules/contact/contact.module	10 May 2009 18:24:06 -0000	1.114
+++ modules/contact/contact.module	14 May 2009 23:20:02 -0000
@@ -128,6 +128,18 @@ function _contact_personal_tab_access($a
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function contact_variable_info() {
+  return array(
+    'contact_default_status' => 1,
+    'contact_form_information' => t('You can leave a message using the contact form below.'),
+    'contact_hourly_threshold' => 3,
+  );
+}
+
+
+/**
  * Load the data for a single contact category.
  */
 function contact_load($cid) {
Index: modules/dblog/dblog.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/dblog/dblog.module,v
retrieving revision 1.37
diff -u -p -r1.37 dblog.module
--- modules/dblog/dblog.module	13 Apr 2009 08:48:58 -0000	1.37
+++ modules/dblog/dblog.module	14 May 2009 23:20:02 -0000
@@ -73,6 +73,15 @@ function dblog_menu() {
   return $items;
 }
 
+/**
+ * Implementation of hook_variable_info().
+ */
+function dblog_variable_info() {
+  return array(
+    'dblog_row_limit' => 1000,
+  );
+}
+
 function dblog_init() {
   if (arg(0) == 'admin' && arg(1) == 'reports') {
     // Add the CSS for this module
Index: modules/field/field.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/field.module,v
retrieving revision 1.7
diff -u -p -r1.7 field.module
--- modules/field/field.module	26 Mar 2009 13:31:24 -0000	1.7
+++ modules/field/field.module	14 May 2009 23:20:02 -0000
@@ -606,5 +606,13 @@ function template_preprocess_field(&$var
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function field_variable_info() {
+  return array(
+    'field_storage_module' => 'field_sql_storage',
+  );
+}
+/**
  * @} End of "defgroup field"
  */
\ No newline at end of file
Index: modules/filter/filter.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/filter/filter.module,v
retrieving revision 1.250
diff -u -p -r1.250 filter.module
--- modules/filter/filter.module	14 May 2009 08:23:14 -0000	1.250
+++ modules/filter/filter.module	14 May 2009 23:20:02 -0000
@@ -130,6 +130,19 @@ function filter_menu() {
   return $items;
 }
 
+/**
+ * Implementation of hook_variable_info().
+ */
+function filter_variable_info() {
+  return array(
+    'allowed_html' => '<a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>',
+    'filter_allowed_protocols' => array('ftp', 'http', 'https', 'irc', 'mailto', 'news', 'nntp', 'rtsp', 'sftp', 'ssh', 'telnet', 'webcal'),
+    'filter_default_format' => 1,
+    'filter_html_help' => 1,
+    'filter_html_nofollow' => FALSE,
+  );
+}
+
 function filter_format_load($arg) {
   return filter_formats($arg);
 }
Index: modules/forum/forum.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/forum/forum.module,v
retrieving revision 1.492
diff -u -p -r1.492 forum.module
--- modules/forum/forum.module	9 May 2009 18:28:12 -0000	1.492
+++ modules/forum/forum.module	14 May 2009 23:20:03 -0000
@@ -33,6 +33,21 @@ function forum_help($path, $arg) {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function forum_variable_info() {
+  return array(
+    'forum_block_num_active' => 5,
+    'forum_block_num_new' => 5,
+    'forum_containers' => array(),
+    'forum_hot_topic' => 15,
+    'forum_nav_vocabulary' => '',
+    'forum_order' => 1,
+    'forum_per_page' => 25,
+  );
+}
+
+/**
  * Implementation of hook_theme().
  */
 function forum_theme() {
Index: modules/locale/locale.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/locale/locale.module,v
retrieving revision 1.238
diff -u -p -r1.238 locale.module
--- modules/locale/locale.module	31 Mar 2009 02:02:21 -0000	1.238
+++ modules/locale/locale.module	14 May 2009 23:20:03 -0000
@@ -173,6 +173,15 @@ function locale_menu() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function locale_variable_info() {
+  return array(
+    'locale_cache_strings' => 1,
+  );
+}
+
+/**
  * Wrapper function to be able to set callbacks in locale.inc
  */
 function locale_inc_callback() {
Index: modules/menu/menu.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/menu/menu.module,v
retrieving revision 1.187
diff -u -p -r1.187 menu.module
--- modules/menu/menu.module	14 May 2009 08:23:15 -0000	1.187
+++ modules/menu/menu.module	14 May 2009 23:20:03 -0000
@@ -150,6 +150,16 @@ function menu_theme() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function menu_variable_info() {
+  return array(
+    'menu_default_node_menu' => 'main-menu',
+    'menu_override_parent_selector' => FALSE,
+  );
+}
+
+/**
  * Implementation of hook_enable().
  *
  *  Add a link for each custom menu.
Index: modules/node/node.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.module,v
retrieving revision 1.1047
diff -u -p -r1.1047 node.module
--- modules/node/node.module	14 May 2009 08:23:15 -0000	1.1047
+++ modules/node/node.module	14 May 2009 23:20:03 -0000
@@ -139,6 +139,20 @@ function node_theme() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function node_variable_info() {
+  return array(
+    'default_nodes_main' => 10,
+    'node_access_needs_rebuild' => FALSE,
+    'node_cron_last' => 0,
+    'node_options' => array('status', 'promote'),
+    'node_preview' => 0,
+    'teaser_length' => 600,
+  );
+}
+
+/**
  * Implementation of hook_cron().
  */
 function node_cron() {
Index: modules/profile/profile.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/profile/profile.module,v
retrieving revision 1.253
diff -u -p -r1.253 profile.module
--- modules/profile/profile.module	14 May 2009 08:23:15 -0000	1.253
+++ modules/profile/profile.module	14 May 2009 23:20:04 -0000
@@ -125,6 +125,15 @@ function profile_menu() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function profile_variable_info() {
+  return array(
+    'profile_block_author_fields' => array(),
+  );
+}
+
+/**
  * Implementation of hook_block_list().
  */
 function profile_block_list() {
Index: modules/search/search.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/search/search.module,v
retrieving revision 1.291
diff -u -p -r1.291 search.module
--- modules/search/search.module	14 May 2009 08:23:15 -0000	1.291
+++ modules/search/search.module	14 May 2009 23:20:04 -0000
@@ -139,6 +139,31 @@ function search_theme() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function search_variable_info() {
+  return array(
+    'minimum_word_size' => 3,
+    'overlap_cjk' => TRUE,
+    'search_cron_limit' => 100,
+    'search_tag_weights' => array(
+      'h1' => 25,
+      'h2' => 18,
+      'h3' => 15,
+      'h4' => 12,
+      'h5' => 9,
+      'h6' => 6,
+      'u' => 3,
+      'b' => 3,
+      'i' => 3,
+      'strong' => 3,
+      'em' => 3,
+      'a' => 10,
+    ),
+  );
+}
+
+/**
  * Implementation of hook_perm().
  */
 function search_perm() {
Index: modules/simpletest/simpletest.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/simpletest.module,v
retrieving revision 1.42
diff -u -p -r1.42 simpletest.module
--- modules/simpletest/simpletest.module	14 May 2009 08:23:15 -0000	1.42
+++ modules/simpletest/simpletest.module	14 May 2009 23:20:04 -0000
@@ -64,6 +64,16 @@ function simpletest_perm() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function simpletest_variable_info() {
+  return array(
+    'simpletest_httpauth_pass' => '',
+    'simpletest_httpauth_username' => '',
+  );
+}
+
+/**
  * Implementation of hook_theme().
  */
 function simpletest_theme() {
Index: modules/simpletest/tests/bootstrap.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/bootstrap.test,v
retrieving revision 1.15
diff -u -p -r1.15 bootstrap.test
--- modules/simpletest/tests/bootstrap.test	22 Apr 2009 09:45:03 -0000	1.15
+++ modules/simpletest/tests/bootstrap.test	14 May 2009 23:20:04 -0000
@@ -194,23 +194,31 @@ class BootstrapVariableTestCase extends 
   }
 
   /**
-   * testVariable
+   * Test the variable system.
    */
   function testVariable() {
+    // Retrieving default values for variables.
+    $default_cache = './includes/cache.inc'; // The default anonymous variable from System module.
+    $cache = variable_get('cache_inc');
+    $this->assertIdentical($cache, $default_cache, t('Retrieving default values for variables'));
+
+    // Retrieving default values for variables held in a hook_variable_info() implementation.
+    $name = variable_get('site_name');
+    $this->assertIdentical('Drupal', $name, t('Retrieving default values for variables held in hook_variable_info().'));
+
     // Setting and retrieving values.
     $variable = $this->randomName();
     variable_set('simpletest_bootstrap_variable_test', $variable);
     $this->assertIdentical($variable, variable_get('simpletest_bootstrap_variable_test'), t('Setting and retrieving values'));
 
     // Make sure the variable persists across multiple requests.
-    $this->drupalGet('system-test/variable-get');
-    $this->assertText($variable, t('Variable persists across multiple requests'));
+    $retrieved_variable = $this->drupalGet('system-test/variable-get');
+    $this->assertIdentical($retrieved_variable, $variable, t('Variable persists across multiple requests'));
 
     // Deleting variables.
-    $default_value = $this->randomName();
     variable_del('simpletest_bootstrap_variable_test');
-    $variable = variable_get('simpletest_bootstrap_variable_test', $default_value);
-    $this->assertIdentical($variable, $default_value, t('Deleting variables'));
+    $variable = variable_get('simpletest_bootstrap_variable_test');
+    $this->assertIdentical($variable, NULL, t('Deleting variables'));
   }
 
   /**
Index: modules/simpletest/tests/common.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/common.test,v
retrieving revision 1.37
diff -u -p -r1.37 common.test
--- modules/simpletest/tests/common.test	3 May 2009 07:35:37 -0000	1.37
+++ modules/simpletest/tests/common.test	14 May 2009 23:20:04 -0000
@@ -653,21 +653,21 @@ class DrupalErrorHandlerUnitTest extends
       '%type' => 'Notice',
       '%message' => 'Undefined variable: bananas',
       '%function' => 'system_test_generate_warnings()',
-      '%line' => 194,
+      '%line' => 201,
       '%file' => realpath('modules/simpletest/tests/system_test.module'),
     );
     $error_warning = array(
       '%type' => 'Warning',
       '%message' => 'Division by zero',
       '%function' => 'system_test_generate_warnings()',
-      '%line' => 196,
+      '%line' => 203,
       '%file' => realpath('modules/simpletest/tests/system_test.module'),
     );
     $error_user_notice = array(
       '%type' => 'User notice',
       '%message' => 'Drupal is awesome',
       '%function' => 'system_test_generate_warnings()',
-      '%line' => 198,
+      '%line' => 205,
       '%file' => realpath('modules/simpletest/tests/system_test.module'),
     );
 
@@ -701,14 +701,14 @@ class DrupalErrorHandlerUnitTest extends
       '%type' => 'Exception',
       '%message' => 'Drupal is awesome',
       '%function' => 'system_test_trigger_exception()',
-      '%line' => 207,
+      '%line' => 214,
       '%file' => realpath('modules/simpletest/tests/system_test.module'),
     );
     $error_pdo_exception = array(
       '%type' => 'PDOException',
       '%message' => 'SQLSTATE',
       '%function' => 'system_test_trigger_pdo_exception()',
-      '%line' => 215,
+      '%line' => 222,
       '%file' => realpath('modules/simpletest/tests/system_test.module'),
     );
 
Index: modules/simpletest/tests/system_test.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/system_test.module,v
retrieving revision 1.9
diff -u -p -r1.9 system_test.module
--- modules/simpletest/tests/system_test.module	22 Apr 2009 09:45:03 -0000	1.9
+++ modules/simpletest/tests/system_test.module	14 May 2009 23:20:04 -0000
@@ -47,8 +47,7 @@ function system_test_menu() {
 
   $items['system-test/variable-get'] = array(
     'title' => 'Variable Get',
-    'page callback' => 'variable_get',
-    'page arguments' => array('simpletest_bootstrap_variable_test', NULL),
+    'page callback' => 'simpletest_bootstrap_variable_test',
     'access arguments' => array('access content'),
     'type' => MENU_CALLBACK,
   );
@@ -91,6 +90,14 @@ function system_test_basic_auth_page() {
   return $output;
 }
 
+/**
+ * Menu callback; SimpleTest bootstrap variable test.
+ */
+function simpletest_bootstrap_variable_test() {
+  echo variable_get('simpletest_bootstrap_variable_test');
+  exit;
+}
+
 function system_test_redirect($code) {
   $code = (int)$code;
   if ($code != 200) {
Index: modules/statistics/statistics.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/statistics/statistics.module,v
retrieving revision 1.303
diff -u -p -r1.303 statistics.module
--- modules/statistics/statistics.module	3 May 2009 10:11:35 -0000	1.303
+++ modules/statistics/statistics.module	14 May 2009 23:20:04 -0000
@@ -101,6 +101,22 @@ function statistics_perm() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function statistics_variable_info() {
+  return array (
+    'node_cron_views_scale' => 0,
+    'statistics_block_top_all_num' => 0,
+    'statistics_block_top_day_num' => 0,
+    'statistics_block_top_last_num' => 0,
+    'statistics_count_content_views' => 0,
+    'statistics_day_timestamp' => '',
+    'statistics_enable_access_log' => 0,
+    'statistics_flush_accesslog_timer' => 259200,
+  );
+}
+
+/**
  * Implementation of hook_node_view().
  */
 function statistics_node_view($node, $teaser) {
Index: modules/syslog/syslog.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/syslog/syslog.module,v
retrieving revision 1.22
diff -u -p -r1.22 syslog.module
--- modules/syslog/syslog.module	13 Apr 2009 08:49:01 -0000	1.22
+++ modules/syslog/syslog.module	14 May 2009 23:20:04 -0000
@@ -27,6 +27,15 @@ function syslog_help($path, $arg) {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function syslog_variable_info() {
+  return array(
+    'syslog_facility' => DEFAULT_SYSLOG_FACILITY,
+  );
+}
+
+/**
  * Implementation of hook_form_FORM_ID_alter().
  */
 function syslog_form_system_logging_settings_alter(&$form, &$form_state) {
Index: modules/system/system.api.php
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.api.php,v
retrieving revision 1.33
diff -u -p -r1.33 system.api.php
--- modules/system/system.api.php	14 May 2009 08:23:15 -0000	1.33
+++ modules/system/system.api.php	14 May 2009 23:20:05 -0000
@@ -1690,5 +1690,32 @@ function hook_disable() {
 }
 
 /**
+ * The construction of any default variables associated with the given module.
+ *
+ * @return
+ *   An associative array, where the keys are the names of the variables, and
+ *   the values are the default values to be used if not overridden by the
+ *   administrator.
+ */
+function hook_variable_info() {
+  return array(
+    'upload_max_resolution' => 0,
+    'upload_list_default' => 1,
+    'upload_extensions' => 'jpg jpeg gif png txt doc xls pdf ppt pps odt ods odp',
+    'upload_uploadsize' => 1,
+    'upload_usersize' => 1,
+    'upload' => 1,
+  );
+}
+
+/**
+ * Allows alteration of the default variables created in hook_variable_info().
+ */
+function hook_variable_info_alter(&$variables) {
+  $variables['upload_max_resolution'] = 1024;
+  $variables['upload_usersize'] = 0;
+}
+
+/**
  * @} End of "addtogroup hooks".
  */
Index: modules/system/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.module,v
retrieving revision 1.693
diff -u -p -r1.693 system.module
--- modules/system/system.module	14 May 2009 08:23:15 -0000	1.693
+++ modules/system/system.module	14 May 2009 23:20:05 -0000
@@ -115,6 +115,85 @@ function system_help($path, $arg) {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function system_variable_info() {
+  return array(
+    'actions_max_stack' => 35,
+    'admin_compact_mode' => FALSE,
+    'admin_theme' => 0,
+    'allow_insecure_uploads' => 0,
+    'anonymous' => 'Anonymous',
+    'cache_flush' => 0,
+    'cache_lifetime' => 0,
+    'clean_url' => '0',
+    'configurable_timezones' => 1,
+    'cron_key' => 'drupal',
+    'cron_last' => NULL,
+    'cron_semaphore' => FALSE,
+    'cron_threshold_error' => 1209600,
+    'cron_threshold_warning' => 172800,
+    'css_js_query_string' => '0',
+    'date_default_timezone' => 'UTC',
+    'date_first_day' => 0,
+    'date_format_long' => 'l, F j, Y - H:i',
+    'date_format_long_custom' => '',
+    'date_format_medium' => 'D, m/d/Y - H:i',
+    'date_format_medium_custom' => '',
+    'date_format_short' => 'm/d/Y - H:i',
+    'date_format_short_custom' => '',
+    'drupal_badge_color' => 'powered-blue',
+    'drupal_badge_size' => '80x15',
+    'drupal_http_request_fails' => FALSE,
+    'drupal_private_key' => '',
+    'error_level' => 1,
+    'file_directory_path' => conf_path() . '/files',
+    'file_directory_temp' => NULL,
+    'file_downloads' => FILE_DOWNLOADS_PUBLIC,
+    'forum_block_num_0' => NULL,
+    'forum_block_num_1' => NULL,
+    'image_jpeg_quality' => 75,
+    'image_toolkit' => 'gd',
+    'install_locale_batch_components' => array(),
+    'install_profile' => 'default',
+    'install_profile_modules' => array(),
+    'install_time' => 0,
+    'javascript_parsed' => array(),
+    'language_negotiation' => LANGUAGE_NEGOTIATION_NONE,
+    'locale_custom_strings' => array(),
+    'locale_js_directory' => 'languages',
+    'maintenance_theme' => 'minnelli',
+    'menu_expanded' => array(),
+    'menu_main_menu_source' => 'main-menu',
+    'menu_masks' => array(),
+    'menu_parent_items' => 0,
+    'menu_primary_menu' => 0,
+    'menu_rebuild_needed' => FALSE,
+    'menu_secondary_menu' => 0,
+    'menu_secondary_menu_source' => 'secondary-menu',
+    'node_admin_theme' => 0,
+    'page_compression' => TRUE,
+    'preprocess_css' => FALSE,
+    'preprocess_js' => FALSE,
+    'site_403' => '',
+    'site_404' => '',
+    'site_footer' => '',
+    'site_mail' => FALSE,
+    'site_mission' => '',
+    'site_name' => 'Drupal',
+    'site_offline' => 0,
+    'site_offline_message' => '@site is currently under maintenance. We should be back shortly. Thank you for your patience.',
+    'site_slogan' => '',
+    'smtp_library' => '',
+    'system_update_6043_RC2' => FALSE,
+    'theme_default' => 'garland',
+    'theme_settings' => array(),
+    'update_d6_requirements' => FALSE,
+    'upload_extensions_default' => 'jpg jpeg gif png txt html doc xls pdf ppt pps odt ods odp',
+  );
+}
+
+/**
  * Implementation of hook_theme().
  */
 function system_theme() {
Index: modules/taxonomy/taxonomy.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/taxonomy/taxonomy.module,v
retrieving revision 1.472
diff -u -p -r1.472 taxonomy.module
--- modules/taxonomy/taxonomy.module	3 May 2009 10:44:04 -0000	1.472
+++ modules/taxonomy/taxonomy.module	14 May 2009 23:20:06 -0000
@@ -203,6 +203,15 @@ function taxonomy_menu() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function taxonomy_variable_info() {
+  return array(
+    'taxonomy_override_selector' => FALSE,
+  );
+}
+
+/**
  * Return the vocabulary name given the vocabulary object.
  */
 function taxonomy_admin_vocabulary_title_callback($vocabulary) {
Index: modules/update/update.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/update/update.module,v
retrieving revision 1.33
diff -u -p -r1.33 update.module
--- modules/update/update.module	13 May 2009 18:21:42 -0000	1.33
+++ modules/update/update.module	14 May 2009 23:20:06 -0000
@@ -142,6 +142,19 @@ function update_menu() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function update_variable_info() {
+  return array(
+    'update_check_frequency' => 1,
+    'update_fetch_url' => UPDATE_DEFAULT_URL,
+    'update_last_check' => 0,
+    'update_notify_emails' => array(),
+    'update_notification_threshold' => 'all',
+  );
+}
+
+/**
  * Implementation of the hook_theme() registry.
  */
 function update_theme() {
Index: modules/upload/upload.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/upload/upload.module,v
retrieving revision 1.237
diff -u -p -r1.237 upload.module
--- modules/upload/upload.module	9 May 2009 18:28:13 -0000	1.237
+++ modules/upload/upload.module	14 May 2009 23:20:06 -0000
@@ -103,6 +103,20 @@ function upload_menu() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function upload_variable_info() {
+  return array(
+    'upload' => 1,
+    'upload_extensions' => 'jpg jpeg gif png txt doc xls pdf ppt pps odt ods odp',
+    'upload_list_default' => 1,
+    'upload_max_resolution' => 0,
+    'upload_uploadsize' => 1,
+    'upload_usersize' => 1,
+  );
+}
+
+/**
  * Determine the limitations on files that a given user may upload. The user
  * may be in multiple roles so we select the most permissive limitations from
  * all of their roles.
Index: modules/user/user.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.module,v
retrieving revision 1.986
diff -u -p -r1.986 user.module
--- modules/user/user.module	14 May 2009 08:23:15 -0000	1.986
+++ modules/user/user.module	14 May 2009 23:20:07 -0000
@@ -18,6 +18,23 @@ define('EMAIL_MAX_LENGTH', 64);
 
 
 /**
+ * The standard log2 number of iterations for password stretching. This should
+ * increase by 1 at least every other Drupal version in order to counteract
+ * increases in the speed and power of computers available to crack the hashes.
+ */
+define('DRUPAL_HASH_COUNT', 14);
+
+/**
+ * The minimum allowed log2 number of iterations for password stretching.
+ */
+define('DRUPAL_MIN_HASH_COUNT', 7);
+
+/**
+ * The maximum allowed log2 number of iterations for password stretching.
+ */
+define('DRUPAL_MAX_HASH_COUNT', 30);
+
+/**
  * Invokes hook_user() in every module.
  *
  * We cannot use module_invoke() for this, because the arguments need to
@@ -101,6 +118,34 @@ function user_field_build_modes($obj_typ
   return $modes;
 }
 
+/**
+ * Implementation of hook_variable_info().
+ */
+function user_variable_info() {
+  return array(
+    'password_count_log2' => DRUPAL_HASH_COUNT,
+    'user_block_max_list_count' => 10,
+    'user_block_seconds_online' => 900,
+    'user_block_whois_new_count' => 5,
+    // Use user_mail_notify_status as a fallback for an unknown $op, which will
+    // default to TRUE; however, we don't want mail notifications on by default
+    // with deletions and blockings.
+    'user_mail_notify_status' => TRUE,
+    'user_mail_notify_status_blocked' => FALSE,
+    'user_mail_notify_status_deleted' => FALSE,
+    'user_email_verification' => TRUE,
+    'user_pictures' => 0,
+    'user_picture_default' => '',
+    'user_picture_dimensions' => '85x85',
+    'user_picture_file_size' => 30,
+    'user_picture_guidelines' => '',
+    'user_picture_path' => 'pictures',
+    'user_register' => 1,
+    'user_registration_help' => '',
+    'user_signatures' => 0,
+  );
+}
+
 function user_external_load($authname) {
   $uid = db_query("SELECT uid FROM {authmap} WHERE authname = :authname", array(':authname' => $authname))->fetchField();
 
Index: modules/user/user.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.test,v
retrieving revision 1.36
diff -u -p -r1.36 user.test
--- modules/user/user.test	13 May 2009 17:23:48 -0000	1.36
+++ modules/user/user.test	14 May 2009 23:20:07 -0000
@@ -45,7 +45,7 @@ class UserRegistrationTestCase extends D
     $this->assertEqual($user->status, variable_get('user_register', 1) == 1 ? 1 : 0, t('Correct status field.'));
     $this->assertEqual($user->timezone, variable_get('date_default_timezone'), t('Correct time zone field.'));
     $this->assertEqual($user->language, '', t('Correct language field.'));
-    $this->assertEqual($user->picture, '', t('Correct picture field.'));
+    $this->assertEqual($user->picture, 0, t('Correct picture field.'));
     $this->assertEqual($user->init, $mail, t('Correct init field.'));
 
     // Attempt to login with incorrect password.
