Index: modules/poll/poll.pages.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/poll/poll.pages.inc,v
retrieving revision 1.3
diff -u -r1.3 poll.pages.inc
--- modules/poll/poll.pages.inc	26 Nov 2007 16:36:43 -0000	1.3
+++ modules/poll/poll.pages.inc	29 Nov 2007 06:21:12 -0000
@@ -33,14 +33,14 @@
   $output = t('This table lists all the recorded votes for this poll. If anonymous users are allowed to vote, they will be identified by the IP address of the computer they used when they voted.');
 
   $header[] = array('data' => t('Visitor'), 'field' => 'u.name');
-  $header[] = array('data' => t('Vote'), 'field' => 'pv.chorder');
+  $header[] = array('data' => t('Vote'), 'field' => 'pc.weight');
 
-  $result = pager_query("SELECT pv.chorder, pv.uid, pv.hostname, u.name FROM {poll_votes} pv LEFT JOIN {users} u ON pv.uid = u.uid WHERE pv.nid = %d". tablesort_sql($header), 20, 0, NULL, $node->nid);
+  $result = pager_query("SELECT pv.chid, pv.uid, pv.hostname, u.name FROM {poll_votes} pv INNER JOIN {poll_choices} pc ON pv.chid = pc.chid LEFT JOIN {users} u ON pv.uid = u.uid WHERE pv.nid = %d". tablesort_sql($header), 20, 0, NULL, $node->nid);
   $rows = array();
   while ($vote = db_fetch_object($result)) {
     $rows[] = array(
       $vote->name ? theme('username', $vote) : check_plain($vote->hostname),
-      check_plain($node->choice[$vote->chorder]['chtext']));
+      check_plain($node->choice[$vote->chid]['chtext']));
   }
   $output .= theme('table', $header, $rows);
   $output .= theme('pager', NULL, 20, 0);
Index: modules/poll/poll.css
===================================================================
RCS file: /cvs/drupal/drupal/modules/poll/poll.css,v
retrieving revision 1.5
diff -u -r1.5 poll.css
--- modules/poll/poll.css	17 Oct 2007 12:34:16 -0000	1.5
+++ modules/poll/poll.css	29 Nov 2007 06:21:12 -0000
@@ -33,3 +33,11 @@
 .node-form #edit-poll-more {
   margin: 0;
 }
+.node-form #poll-choice-table .form-text {
+  display: inline;
+  width: auto;
+}
+.node-form #poll-choice-table td.choice-number {
+  white-space: nowrap;
+  width: 4em;
+}
Index: modules/poll/poll.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/poll/poll.module,v
retrieving revision 1.250
diff -u -r1.250 poll.module
--- modules/poll/poll.module	26 Nov 2007 11:44:03 -0000	1.250
+++ modules/poll/poll.module	29 Nov 2007 06:21:12 -0000
@@ -222,11 +222,23 @@
   );
 
   // Add the current choices to the form.
-  for ($delta = 0; $delta < $choice_count; $delta++) {
-    $text = isset($node->choice[$delta]['chtext']) ? $node->choice[$delta]['chtext'] : '';
-    $votes = isset($node->choice[$delta]['chvotes']) ? $node->choice[$delta]['chvotes'] : 0;
+  $delta = 0;
+  $weight = 0;
+  if (isset($node->choice)) {
+    $delta = count($node->choice);
+    $weight = -$delta;
+    foreach ($node->choice as $chid => $choice) {
+      $key = 'chid:'. $chid;
+      $form['choice_wrapper']['choice'][$key] = _poll_choice_form($key, $choice['chid'], $choice['chtext'], $choice['chvotes'], $choice['weight'], $choice_count);
+      $weight = ($choice['weight'] > $weight) ? $choice['weight'] : $weight;
+    }
+  }
 
-    $form['choice_wrapper']['choice'][$delta] = _poll_choice_form($delta, $text, $votes);
+  // Add initial or additional choices.
+  $existing_delta = $delta;
+  for ($delta; $delta < $choice_count; $delta++) {
+    $key = 'new:'. ($delta - $existing_delta);
+    $form['choice_wrapper']['choice'][$key] = _poll_choice_form($key, NULL, '', 0, $weight, $choice_count);
   }
 
   // We name our button 'poll_more' to avoid conflicts with other modules using
@@ -246,30 +258,30 @@
   );
 
   // Poll attributes
-  $_duration = array(0 => t('Unlimited')) + drupal_map_assoc(array(86400, 172800, 345600, 604800, 1209600, 2419200, 4838400, 9676800, 31536000), "format_interval");
-  $_active = array(0 => t('Closed'), 1 => t('Active'));
+  $duration = array(0 => t('Unlimited')) + drupal_map_assoc(array(86400, 172800, 345600, 604800, 1209600, 2419200, 4838400, 9676800, 31536000), "format_interval");
+  $active = array(0 => t('Closed'), 1 => t('Active'));
 
-  if ($admin) {
-    $form['settings'] = array(
-      '#type' => 'fieldset',
-      '#collapsible' => TRUE,
-      '#title' => t('Poll settings'),
-      '#weight' => -3,
-    );
+  $form['settings'] = array(
+    '#type' => 'fieldset',
+    '#collapsible' => TRUE,
+    '#title' => t('Poll settings'),
+    '#weight' => -3,
+    '#access' => $admin,
+  );
 
-    $form['settings']['active'] = array(
-      '#type' => 'radios',
-      '#title' => t('Poll status'),
-      '#default_value' => isset($node->active) ? $node->active : 1,
-      '#options' => $_active,
-      '#description' => t('When a poll is closed, visitors can no longer vote for it.')
-    );
-  }
+  $form['settings']['active'] = array(
+    '#type' => 'radios',
+    '#title' => t('Poll status'),
+    '#default_value' => isset($node->active) ? $node->active : 1,
+    '#options' => $active,
+    '#description' => t('When a poll is closed, visitors can no longer vote for it.'),
+    '#access' => $admin,
+  );
   $form['settings']['runtime'] = array(
     '#type' => 'select',
     '#title' => t('Poll duration'),
     '#default_value' => isset($node->runtime) ? $node->runtime : 0,
-    '#options' => $_duration,
+    '#options' => $duration,
     '#description' => t('After this period, the poll will be closed automatically.'),
   );
 
@@ -291,32 +303,40 @@
   }
 }
 
-function _poll_choice_form($delta, $value = '', $votes = 0) {
-  $admin = user_access('administer nodes');
-
+function _poll_choice_form($key, $chid = NULL, $value = '', $votes = 0, $weight = 0, $size = 10) {
   $form = array(
     '#tree' => TRUE,
   );
 
   // We'll manually set the #parents property of these fields so that
   // their values appear in the $form_state['values']['choice'] array.
+  $form['chid'] = array(
+    '#type' => 'value',
+    '#value' => $chid,
+    '#parents' => array('choice', $key,'chid'),
+  );
+
   $form['chtext'] = array(
     '#type' => 'textfield',
-    '#title' => t('Choice @n', array('@n' => ($delta + 1))),
     '#default_value' => $value,
-    '#parents' => array('choice', $delta,'chtext'),
+    '#parents' => array('choice', $key,'chtext'),
   );
 
-  if ($admin) {
-    $form['chvotes'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Votes for choice @n', array('@n' => ($delta + 1))),
-      '#default_value' => $votes,
-      '#size' => 5,
-      '#maxlength' => 7,
-      '#parents' => array('choice', $delta, 'chvotes'),
-    );
-  }
+  $form['chvotes'] = array(
+    '#type' => 'textfield',
+    '#default_value' => $votes,
+    '#size' => 5,
+    '#maxlength' => 7,
+    '#parents' => array('choice', $key, 'chvotes'),
+    '#access' => user_access('administer nodes'),
+  );
+
+  $form['weight'] = array(
+    '#type' => 'weight',
+    '#default_value' => $weight,
+    '#delta' => $size,
+    '#parents' => array('choice', $key, 'weight'),
+  );
 
   return $form;
 }
@@ -325,17 +345,37 @@
  * Menu callback for AHAH additions.
  */
 function poll_choice_js() {
+  // Add the new element to the stored form state. Without adding the element
+  // to the form, Drupal is not aware of this new elements existence and will
+  // not process it. We retreive the cached form, add the element, and resave.
+  $cache = cache_get('form_'. $_POST['form_build_id'], 'cache_form');
+
   $delta = count($_POST['choice']);
+  $key = isset($cache->data['#node']->choice) ? 'new:'. ($delta - count($cache->data['#node']->choice)) : 'new:'. $delta;
+
+  // Match the new choice at the current greatest weight.
+  $weight = 0;
+  foreach ($_POST['choice'] as $choice) {
+    $weight = $choice['weight'] > $weight ? $choice['weight'] : $weight;
+  }
 
   // Build our new form element.
-  $form_element = _poll_choice_form($delta);
+  $form_element = _poll_choice_form($key, NULL, NULL, NULL, $weight, $delta + 1);
   drupal_alter('form', $form_element, array(), 'poll_choice_js');
 
-  // Add the new element to the stored form state. Without adding the element
-  // to the form, Drupal is not aware of this new elements existence and will
-  // not process it. We retreive the cached form, add the element, and resave.
-  $cache = cache_get('form_'. $_POST['form_build_id'], 'cache_form');
-  $cache->data['choice_wrapper']['choice'][$delta] = $form_element;
+  // Dynamically increase the delta of the weight field for every field added.
+  foreach(element_children($cache->data['choice_wrapper']['choice']) as $n) {
+    $cache->data['choice_wrapper']['choice'][$n]['weight']['#delta'] = $delta + 1;
+  }
+
+  // Add the new poll choice.
+  $cache->data['choice_wrapper']['choice'][$key] = $form_element;
+
+  // Reorder the form to use the same order as post.
+  $order = array_flip(array_keys($_POST['choice']));
+  $cache->data['choice_wrapper']['choice'] = array_merge($order, $cache->data['choice_wrapper']['choice']);
+
+  // Resave the cache.
   cache_set('form_'. $_POST['form_build_id'], $cache->data, 'cache_form', $cache->expire);
 
   // Build the new form.
@@ -349,9 +389,10 @@
 
   // Render the new output.
   $choice_form = $form['choice_wrapper']['choice'];
-  unset($choice_form['#prefix'], $choice_form['#suffix']); // Prevent duplicate wrappers.
-  $choice_form[$delta]['#attributes']['class'] = empty($choice_form[$delta]['#attributes']['class']) ? 'ahah-new-content' : $choice_form[$delta]['#attributes']['class'] .' ahah-new-content';
-  $choice_form[$delta]['chvotes']['#value'] = 0;
+  // Prevent duplicate wrappers.
+  unset($choice_form['#prefix'], $choice_form['#suffix']);
+  $choice_form[$key]['#attributes']['class'] = empty($choice_form[$key]['#attributes']['class']) ? 'ahah-new-content' : $choice_form[$key]['#attributes']['class'] .' ahah-new-content';
+  $choice_form[$key]['chvotes']['#value'] = 0;
   $output = theme('status_messages') . drupal_render($choice_form);
 
   drupal_json(array('status' => TRUE, 'data' => $output));
@@ -399,22 +440,22 @@
   // Load the appropriate choices into the $node object
   $poll = db_fetch_object(db_query("SELECT runtime, active FROM {poll} WHERE nid = %d", $node->nid));
 
-  $result = db_query("SELECT chtext, chvotes, chorder FROM {poll_choices} WHERE nid = %d ORDER BY chorder", $node->nid);
+  $result = db_query("SELECT chid, chtext, chvotes, weight FROM {poll_choices} WHERE nid = %d ORDER BY weight", $node->nid);
   while ($choice = db_fetch_array($result)) {
-    $poll->choice[$choice['chorder']] = $choice;
+    $poll->choice[$choice['chid']] = $choice;
   }
 
   // Determine whether or not this user is allowed to vote
   $poll->allowvotes = FALSE;
   if (user_access('vote on polls') && $poll->active) {
     if ($user->uid) {
-      $result = db_fetch_object(db_query('SELECT chorder FROM {poll_votes} WHERE nid = %d AND uid = %d', $node->nid, $user->uid));
+      $result = db_fetch_object(db_query('SELECT chid FROM {poll_votes} WHERE nid = %d AND uid = %d', $node->nid, $user->uid));
     }
     else {
-      $result = db_fetch_object(db_query("SELECT chorder FROM {poll_votes} WHERE nid = %d AND hostname = '%s'", $node->nid, ip_address()));
+      $result = db_fetch_object(db_query("SELECT chid FROM {poll_votes} WHERE nid = %d AND hostname = '%s'", $node->nid, ip_address()));
     }
-    if (isset($result->chorder)) {
-      $poll->vote = $result->chorder;
+    if (isset($result->chid)) {
+      $poll->vote = $result->chid;
     }
     else {
       $poll->vote = -1;
@@ -438,10 +479,9 @@
 
   db_query("INSERT INTO {poll} (nid, runtime, active) VALUES (%d, %d, %d)", $node->nid, $node->runtime, $node->active);
 
-  $i = 0;
   foreach ($node->choice as $choice) {
     if ($choice['chtext'] != '') {
-      db_query("INSERT INTO {poll_choices} (nid, chtext, chvotes, chorder) VALUES (%d, '%s', %d, %d)", $node->nid, $choice['chtext'], $choice['chvotes'], $i++);
+      db_query("INSERT INTO {poll_choices} (nid, chtext, chvotes, weight) VALUES (%d, '%s', %d, %d)", $node->nid, $choice['chtext'], $choice['chvotes'], $choice['weight']);
     }
   }
 }
@@ -452,16 +492,14 @@
 function poll_update($node) {
   db_query('UPDATE {poll} SET runtime = %d, active = %d WHERE nid = %d', $node->runtime, $node->active, $node->nid);
 
-  db_query('DELETE FROM {poll_choices} WHERE nid = %d', $node->nid);
-  db_query('DELETE FROM {poll_votes} WHERE nid = %d', $node->nid);
-
-  $i = 0;
-  foreach ($node->choice as $choice) {
-    $chvotes = (int)$choice['chvotes'];
-    $chtext = $choice['chtext'];
-
-    if ($chtext != '') {
-      db_query("INSERT INTO {poll_choices} (nid, chtext, chvotes, chorder) VALUES (%d, '%s', %d, %d)", $node->nid, $chtext, $chvotes, $i++);
+  foreach ($node->choice as $key => $choice) {
+    if ($choice['chtext'] != '') {
+      if (isset($choice['chid'])) {
+        db_query("UPDATE {poll_choices} SET chtext = '%s', chvotes = %d, weight = %d WHERE chid = %d", $choice['chtext'], (int)$choice['chvotes'], $choice['weight'], $choice['chid']);
+      }
+      else {
+        db_query("INSERT INTO {poll_choices} (nid, chtext, chvotes, weight) VALUES (%d, '%s', %d, %d)", $node->nid, $choice['chtext'], (int)$choice['chvotes'], $choice['weight']);
+      }
     }
   }
 }
@@ -576,14 +614,14 @@
 
   global $user;
   if ($user->uid) {
-    db_query('INSERT INTO {poll_votes} (nid, chorder, uid) VALUES (%d, %d, %d)', $node->nid, $choice, $user->uid);
+    db_query('INSERT INTO {poll_votes} (nid, chid, uid) VALUES (%d, %d, %d)', $node->nid, $choice, $user->uid);
   }
   else {
-    db_query("INSERT INTO {poll_votes} (nid, chorder, hostname) VALUES (%d, %d, '%s')", $node->nid, $choice, ip_address());
+    db_query("INSERT INTO {poll_votes} (nid, chid, hostname) VALUES (%d, %d, '%s')", $node->nid, $choice, ip_address());
   }
 
   // Add one to the votes.
-  db_query("UPDATE {poll_choices} SET chvotes = chvotes + 1 WHERE nid = %d AND chorder = %d", $node->nid, $choice);
+  db_query("UPDATE {poll_choices} SET chvotes = chvotes + 1 WHERE chid = %d", $choice);
 
   cache_clear_all();
   drupal_set_message(t('Your vote was recorded.'));
@@ -631,40 +669,56 @@
   return theme('poll_results', $node->title, $poll_results, $total_votes, isset($node->links) ? $node->links : array(), $block, $node->nid, isset($node->vote) ? $node->vote : NULL);
 }
 
-
 /**
  * Theme the admin poll form for choices.
  */
 function theme_poll_choices($form) {
-  // Change the button title to reflect the behavior when using JavaScript.
-  drupal_add_js('if (Drupal.jsEnabled) { $(document).ready(function() { $("#edit-poll-more").val("'. t('Add another choice') .'"); }); }', 'inline');
+  // Add two custom behaviors to the page:
+  // 1. Change the button title to reflect the behavior when using JavaScript.
+  // 2. Reorder the choice count when table rows are swapped.
+  drupal_add_js('if (Drupal.jsEnabled) {
+    $(document).ready(function() {
+      $("#edit-poll-more").val("'. t('Add another choice') .'");
+      Drupal.tableDrag["poll-choice-table"].row.prototype.onSwap = function() {
+        $("#poll-choice-table span.choice-number").each(function(n) { $(this).text((n+1) + ".") });
+      };
+    });
+  }', 'inline');
+
+  drupal_add_tabledrag('poll-choice-table', 'order', 'sibling', 'poll-weight', NULL, NULL, FALSE);
 
+  $delta = 0;
   $rows = array();
   $headers = array(
+    '',
     t('Choice'),
     t('Vote count'),
+    t('Weight'),
   );
 
   foreach (element_children($form) as $key) {
-    // No need to print the field title every time.
-    unset($form[$key]['chtext']['#title'], $form[$key]['chvotes']['#title']);
+    $delta++;
+    // Set special classes for drag and drop updating.
+    $form[$key]['weight']['#attributes']['class'] = 'poll-weight';
 
     // Build the table row.
     $row = array(
       'data' => array(
-        array('data' => drupal_render($form[$key]['chtext']), 'class' => 'poll-chtext'),
-        array('data' => drupal_render($form[$key]['chvotes']), 'class' => 'poll-chvotes'),
+        array('data' => '<span class="choice-number">'. $delta .'.</span>', 'class' => 'choice-number'),
+        drupal_render($form[$key]['chtext']),
+        drupal_render($form[$key]['chvotes']),
+        drupal_render($form[$key]['weight']),
       ),
+      'class' => 'draggable',
     );
 
-    // Add additional attributes to the row, such as a class for this row.
-    if (isset($form[$key]['#attributes'])) {
-      $row = array_merge($row, $form[$key]['#attributes']);
-    }
+    // Add any additional classes set on the row.
+    $row['class'] .= isset($form[$key]['#attributes']['class']) ? ' '. $form[$key]['#attributes']['class'] : '';
+
     $rows[] = $row;
   }
 
-  $output = theme('table', $headers, $rows);
+  $output = theme('table', $headers, $rows, array('id' => 'poll-choice-table'));
   $output .= drupal_render($form);
   return $output;
 }
@@ -748,7 +802,7 @@
   }
 
   // Subtract from the votes.
-  db_query("UPDATE {poll_choices} SET chvotes = chvotes - 1 WHERE nid = %d AND chorder = %d", $node->nid, $node->vote);
+  db_query("UPDATE {poll_choices} SET chvotes = chvotes - 1 WHERE chid = %d", $node->vote);
 }
 
 /**
Index: modules/poll/poll.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/poll/poll.install,v
retrieving revision 1.12
diff -u -r1.12 poll.install
--- modules/poll/poll.install	21 Oct 2007 18:59:02 -0000	1.12
+++ modules/poll/poll.install	29 Nov 2007 06:21:12 -0000
@@ -24,108 +24,109 @@
   $schema['poll'] = array(
     'description' => t('Stores poll-specific information for poll nodes.'),
     'fields' => array(
-      'nid'     => array(
+      'nid' => array(
         'type' => 'int',
         'unsigned' => TRUE,
         'not null' => TRUE,
         'default' => 0,
         'description' => t("The poll's {node}.nid.")
-        ),
+      ),
       'runtime' => array(
         'type' => 'int',
         'not null' => TRUE,
         'default' => 0,
         'description' => t('The number of seconds past {node}.created during which the poll is open.')
-        ),
+      ),
       'active'  => array(
         'type' => 'int',
         'unsigned' => TRUE,
         'not null' => TRUE,
         'default' => 0,
         'description' => t('Boolean indicating whether or not the poll is open.'),
-        ),
       ),
+    ),
     'primary key' => array('nid'),
-    );
+  );
 
   $schema['poll_choices'] = array(
     'description' => t('Stores information about all choices for all {poll}s.'),
     'fields' => array(
-      'chid'    => array(
+      'chid' => array(
         'type' => 'serial',
         'unsigned' => TRUE,
         'not null' => TRUE,
         'description' => t('Unique identifier for a poll choice.'),
-        ),
-      'nid'     => array(
+      ),
+      'nid' => array(
         'type' => 'int',
         'unsigned' => TRUE,
         'not null' => TRUE,
         'default' => 0,
         'description' => t('The {node}.nid this choice belongs to.'),
-        ),
-      'chtext'  => array(
+      ),
+      'chtext' => array(
         'type' => 'varchar',
         'length' => 128,
         'not null' => TRUE,
         'default' => '',
         'description' => t('The text for this choice.'),
-        ),
+      ),
       'chvotes' => array(
         'type' => 'int',
         'not null' => TRUE,
         'default' => 0,
         'description' => t('The total number of votes this choice has received by all users.'),
-        ),
-      'chorder' => array(
+      ),
+      'weight' => array(
         'type' => 'int',
         'not null' => TRUE,
         'default' => 0,
         'description' => t('The sort order of this choice among all choices for the same node.'),
-        )
       ),
+    ),
     'indexes' => array(
       'nid' => array('nid')
-      ),
+    ),
     'primary key' => array('chid'),
-    );
+  );
 
   $schema['poll_votes'] = array(
     'description' => t('Stores per-{users} votes for each {poll}.'),
     'fields' => array(
-      'nid'      => array(
+      'chid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'description' => t("The {users}'s vote for this poll."),
+      ),
+      'nid' => array(
         'type' => 'int',
         'unsigned' => TRUE,
         'not null' => TRUE,
         'description' => t('The {poll} node this vote is for.'),
-        ),
-      'uid'      => array(
+      ),
+      'uid' => array(
         'type' => 'int',
         'unsigned' => TRUE,
         'not null' => TRUE,
         'default' => 0,
         'description' => t('The {users}.uid this vote is from unless the voter was anonymous.'),
-        ),
-      'chorder'  => array(
-        'type' => 'int',
-        'not null' => TRUE,
-        'default' => -1,
-        'description' => t("The {users}'s vote for this poll."),
-        ),
+      ),
       'hostname' => array(
         'type' => 'varchar',
         'length' => 128,
         'not null' => TRUE,
         'default' => '',
         'description' => t('The IP address this vote is from unless the voter was logged in.'),
-        ),
       ),
+    ),
     'indexes' => array(
-      'hostname' => array('hostname'),
+      'chid'     => array('chid'),
       'nid'      => array('nid'),
-      'uid'      => array('uid')
-      ),
-    );
+      'uid'      => array('uid'),
+      'hostname' => array('hostname'),
+    ),
+  );
 
   return $schema;
 }
Index: modules/system/system.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.install,v
retrieving revision 1.196
diff -u -r1.196 system.install
--- modules/system/system.install	26 Nov 2007 19:55:15 -0000	1.196
+++ modules/system/system.install	29 Nov 2007 06:21:14 -0000
@@ -2734,6 +2734,24 @@
   return $ret;
 }
 
+/**
+ * Use the poll_choice primary key to record votes in poll_votes rather than
+ * the choice order. Rename chorder to weight.
+ */
+function system_update_6040() {
+  $ret = array();
+  // Add chid column and convert existing votes.
+  db_add_field($ret, 'poll_votes', 'chid', array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0));
+  db_add_index($ret, 'poll_votes', 'chid', array('chid'));
+  $ret[] = update_sql("UPDATE {poll_votes} v SET chid = (SELECT chid FROM {poll_choices} c WHERE v.chorder = c.chorder AND v.nid = c.nid)");
+
+  // Remove old chorder column.
+  db_drop_field($ret, 'poll_votes', 'chorder');
+
+  // Change the chorder column to weight in poll_choices.
+  db_change_field($ret, 'poll_choices', 'chorder', 'weight', array('type' => 'int', 'not null' => TRUE, 'default' => 0));
+  return $ret;
+}
 
 /**
  * @} End of "defgroup updates-5.x-to-6.x"
