Index: views_bulk_operations.install
===================================================================
RCS file: views_bulk_operations.install
diff -N views_bulk_operations.install
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ views_bulk_operations.install	12 Jun 2009 17:34:04 -0000
@@ -0,0 +1,57 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Installation and update functions.
+ */
+
+/**
+ * Implementation of hook_update_N().
+ *
+ * Replace MD5 hashes with meaningful strings in selected operations arrays.
+ */
+function views_bulk_operations_update_6000() {
+  views_include('cache');
+  $operations = array();
+  foreach (array_keys(views_bulk_operations_get_object_info()) as $object_type) {
+    $hook_name = $object_type .'_operations';
+    foreach (module_invoke_all($hook_name) as $operation) {
+      if (!empty($operation['callback'])) {
+        $key = md5($operation['callback'] . (isset($operation['callback arguments']) ? serialize($operation['callback arguments']) : ''));
+        $operations[$key] = $operation['callback'] . (empty($operation['callback arguments']) ? '' : ':'. serialize($operation['callback arguments']));
+      }
+    }
+  }
+  $result = db_query("SELECT * FROM {actions} WHERE parameters > ''");
+  while ($action = db_fetch_object($result)) {
+    $key = md5($action->aid);
+    $parameters = unserialize($action->parameters);
+    $operations[$key] = $action->callback . (empty($parameters) ? '' : ':'. $action->parameters);
+  }
+  foreach (array_keys(actions_list()) as $callback) {
+    $key = md5($callback);
+    $operations[$key] = $callback;
+  }
+  foreach (views_get_all_views() as $name => $view) {
+    $changed = FALSE;
+    foreach (array_keys($view->display) as $display) {
+      $display_options = &$view->display[$display]->display_options;
+      if (isset($display_options['style_plugin']) && $display_options['style_plugin'] == 'bulk') {
+        $changed = TRUE;
+        $selected_operations = $display_options['style_options']['selected_operations'];
+        $display_options['style_options']['selected_operations'] = array();
+        foreach (array_filter($selected_operations) as $operation) {
+          // If an old operation is identified, replace it.
+          $display_options['style_options']['selected_operations'][] = isset($operations[$operation]) ? $operations[$operation] : $operation;
+        }
+      }
+    }
+    if ($changed) {
+      $view->save();
+      views_object_cache_clear('view', $name);
+    }
+  }
+  cache_clear_all('*', 'cache_views');
+  return array();
+}
Index: views_bulk_operations.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/views_bulk_operations/views_bulk_operations.module,v
retrieving revision 1.29.2.9.2.90
diff -u -p -r1.29.2.9.2.90 views_bulk_operations.module
--- views_bulk_operations.module	9 Jun 2009 21:02:20 -0000	1.29.2.9.2.90
+++ views_bulk_operations.module	12 Jun 2009 17:34:05 -0000
@@ -573,7 +573,7 @@ function _views_bulk_operations_queue_pr
   if (isset($params['view'])) { 
     // We couldn't save the view in $params so we just saved its name and exposed input.
     // We rebuild it here and save it for the duration of the page request.
-    $md5 = md5($params['view']['name'].':'.serialize($params['view']['exposed_input']));
+    $md5 = $params['view']['name'] . (empty($params['view']['exposed_input']) ? '' : ':'. serialize($params['view']['exposed_input']));
     if (!isset($views[$md5])) {
       $view = views_get_view($params['view']['name']);
       $view->set_exposed_input($params['view']['exposed_input']);
@@ -963,7 +963,7 @@ function views_bulk_operation_execute($v
   $view->execute();
   $plugin = $view->style_plugin;
   $operations = $plugin->get_selected_operations();
-  $index = md5($operation_callback);
+  $index = $operation_callback;
   if (!isset($operations[$index])) return;
   $operation = $plugin->get_operation_info($index);
   foreach ($view->result as $result) {
Index: views_bulk_operations_plugin_style.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/views_bulk_operations/Attic/views_bulk_operations_plugin_style.inc,v
retrieving revision 1.1.2.36
diff -u -p -r1.1.2.36 views_bulk_operations_plugin_style.inc
--- views_bulk_operations_plugin_style.inc	10 Jun 2009 05:29:11 -0000	1.1.2.36
+++ views_bulk_operations_plugin_style.inc	12 Jun 2009 17:34:05 -0000
@@ -104,7 +104,7 @@ class views_bulk_operations_plugin_style
 
   function get_selected_operations() {
     $selected = array();
-    foreach (array_filter($this->options['selected_operations']) as $key => $operation) {
+    foreach (array_filter($this->options['selected_operations']) as $key) {
       if (module_exists('actions_permissions')) {
         $perm = actions_permissions_get_perm($this->options['all_operations'][$key]['label'], $this->options['all_operations'][$key]['callback']);
         if (!user_access($perm)) continue;
@@ -151,7 +151,7 @@ class views_bulk_operations_plugin_style
       $hook_name = $object_type .'_operations';
       foreach (module_invoke_all($hook_name) as $operation) {
         if (empty($operation['callback'])) continue;
-        $key = md5($operation['callback'] . (isset($operation['callback arguments']) ? serialize($operation['callback arguments']) : ''));
+        $key = $operation['callback'] . (empty($operation['callback arguments']) ? '' : ':'. serialize($operation['callback arguments']));
         if (!isset($operation['behavior'])) { // assume operations modify nodes by default
           $operation['behavior'] = array('changes_node_property');
         }
@@ -170,7 +170,7 @@ class views_bulk_operations_plugin_style
 
     $action_operations = actions_list() + $this->get_custom_actions();
     foreach ($action_operations as $callback => $operation) {
-      $key = md5($callback);
+      $key = $callback;
       $operations[$key] = array(
         'label'              => $operation['description'],
         'callback'           => $callback,
@@ -211,14 +211,16 @@ class views_bulk_operations_plugin_style
     $static_actions = actions_list();
     $result = db_query("SELECT * FROM {actions} WHERE parameters > ''");
     while ($action = db_fetch_object($result)) {
-      $actions[$action->aid] = array(
+      $parameters = unserialize($action->parameters);
+      $key = $action->callback . (empty($parameters) ? '' : ':'. $action->parameters);
+      $actions[$key] = array(
         'description' => $action->description,
         'type' => $action->type,
         'configurable' => FALSE,
-        'parameters' => unserialize($action->parameters),
+        'parameters' => $parameters,
       );
-      if (isset($static_actions[$action->callback]['behavior'])) $actions[$action->aid]['behavior'] = $static_actions[$action->callback]['behavior'];
-      if (isset($static_actions[$action->callback]['aggregate'])) $actions[$action->aid]['aggregate'] = $static_actions[$action->callback]['aggregate'];
+      if (isset($static_actions[$action->callback]['behavior'])) $actions[$key]['behavior'] = $static_actions[$action->callback]['behavior'];
+      if (isset($static_actions[$action->callback]['aggregate'])) $actions[$key]['aggregate'] = $static_actions[$action->callback]['aggregate'];
     }
     return $actions;
   }
