? actions.kpf
? actions.patch
? search.patch
? sites/actions
Index: modules/actions/actions.info
===================================================================
RCS file: /cvs/drupal/drupal/modules/actions/actions.info,v
retrieving revision 1.1
diff -u -p -r1.1 actions.info
--- modules/actions/actions.info	29 Jun 2007 18:06:50 -0000	1.1
+++ modules/actions/actions.info	3 Sep 2007 22:33:32 -0000
@@ -1,6 +1,6 @@
 ; $Id: actions.info,v 1.1 2007/06/29 18:06:50 dries Exp $
 name = Actions
-description = Enables triggerable Drupal actions.
+description = Enables actions to be fired on certain events
 package = Core - optional
 version = VERSION
 core = 6.x
Index: modules/actions/actions.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/actions/actions.module,v
retrieving revision 1.3
diff -u -p -r1.3 actions.module
--- modules/actions/actions.module	29 Aug 2007 14:57:49 -0000	1.3
+++ modules/actions/actions.module	3 Sep 2007 22:33:33 -0000
@@ -14,17 +14,17 @@ function actions_help($path, $arg) {
   $output = '';
   $explanation = t('Actions are functions that Drupal can execute when certain events happen, such as when a post is added or a user logs in.');
   switch ($path) {
-    case 'admin/build/actions/assign/comment':
+    case 'admin/build/actions/comment':
       $output = '<p>'. $explanation .' '. t('Below you can assign actions to run when certain comment-related operations happen. For example, you could promote a post to the front page when a comment is added.') .'</p>';
       break;
-    case 'admin/build/actions/assign/node':
+    case 'admin/build/actions/node':
       $output = '<p>'. $explanation .' '. t('Below you can assign actions to run when certain post-related operations happen. For example, you could remove a post from the front page when the post is updated. Note that if you are running actions that modify the characteristics of a post (such as making a post sticky or removing a post from the front page), you will need to add the %node_save action to save the changes.', array('%node_save' => t('Save post'))) .'</p>';
       break;
-    case 'admin/build/actions/assign/user':
+    case 'admin/build/actions/user':
       $output = '<p>'. $explanation .' '. t("Below you can assign actions to run when certain user-related operations happen. For example, you could block a user when the user's account is edited by assigning the %block_user action to the user %update operation.", array('%block_user' => t('Block user'), '%update' => t('update'))) .'</p>';
       break;
-    case 'admin/build/actions/assign/cron':
-      $output = '<p>'. t('Actions are functions that Drupal can execute when certain events happen, such as when a post is added or a user logs in. Below you can assign actions to run when cron runs.') .'</p>';
+    case 'admin/build/actions/cron':
+      $output = '<p>'. $explanation .' '. t('Below you can assign actions to run when cron runs.') .'</p>';
       break;
   }
 
@@ -35,25 +35,30 @@ function actions_help($path, $arg) {
  * Implementation of hook_menu().
  */
 function actions_menu() {
-  $items['admin/build/actions/assign'] = array(
-    'title' => 'Assign actions',
+  $items['admin/build/actions'] = array(
+    'title' => 'Actions',
     'description' => 'Tell Drupal when to execute actions.',
     'page callback' => 'actions_assign',
-    'type' => MENU_LOCAL_TASK,
+    'access callback' => 'actions_access_check',
+    'access arguments' => array('node'),
   );
-  $items['admin/build/actions/assign/node'] = array(
+  // We don't use a menu wildcard here because these are tabs, 
+  // not invisible items
+  $items['admin/build/actions/node'] = array(
     'title' => 'Content',
     'page callback' => 'actions_assign',
     'page arguments' => array('node'),
+    'access arguments' => array('node'),
     'type' => MENU_LOCAL_TASK,
   );
-  $items['admin/build/actions/assign/user'] = array(
+  $items['admin/build/actions/user'] = array(
     'title' => 'User',
     'page callback' => 'actions_assign',
     'page arguments' => array('user'),
+    'access arguments' => array('user'),
     'type' => MENU_LOCAL_TASK,
   );
-  $items['admin/build/actions/assign/comment'] = array(
+  $items['admin/build/actions/comment'] = array(
     'title' => 'Comment',
     'page callback' => 'actions_assign',
     'page arguments' => array('comment'),
@@ -61,18 +66,20 @@ function actions_menu() {
     'access arguments' => array('comment'),
     'type' => MENU_LOCAL_TASK,
   );
-  $items['admin/build/actions/assign/taxonomy'] = array(
+  $items['admin/build/actions/taxonomy'] = array(
     'title' => 'Taxonomy',
     'page callback' => 'actions_assign',
     'page arguments' => array('taxonomy'),
     'access callback' => 'actions_access_check',
     'access arguments' => array('taxonomy'),
+    'access arguments' => array('taxonomy'),
     'type' => MENU_LOCAL_TASK,
   );
-  $items['admin/build/actions/assign/cron'] = array(
+  $items['admin/build/actions/cron'] = array(
     'title' => 'Cron',
     'page callback' => 'actions_assign',
     'page arguments' => array('cron'),
+    'access arguments' => array('cron'),
     'type' => MENU_LOCAL_TASK,
   );
 
@@ -80,20 +87,22 @@ function actions_menu() {
   // their hooks and have actions assignable to them.
   $hooks = module_invoke_all('hook_info');
   foreach ($hooks as $module => $hook) {
+    // We've already done these
     if (in_array($module, array('node', 'comment', 'user', 'system', 'taxonomy'))) {
       continue;
     }
     $info = db_result(db_query("SELECT info FROM {system} WHERE name = '%s'", $module));
     $info = unserialize($info);
     $nice_name = $info['name'];
-    $items["admin/build/actions/assign/$module"] = array(
+    $items["admin/build/actions/$module"] = array(
       'title' => $nice_name,
       'page callback' => 'actions_assign',
       'page arguments' => array($module),
+      'access arguments' => array($module),
       'type' => MENU_LOCAL_TASK,
     );
   }
-  $items['admin/build/actions/assign/remove'] = array(
+  $items['admin/build/actions/remove'] = array(
     'title' => 'Unassign',
     'description' => 'Remove an action assignment.',
     'page callback' => 'drupal_get_form',
@@ -112,7 +121,6 @@ function actions_access_check($module) {
 }
 
 
-
 /**
  * Get the actions that have already been defined for this
  * type-hook-op combination.
@@ -213,7 +221,7 @@ function actions_assign_form($form_state
   foreach ($actions as $aid => $description) {
     $form[$op]['assigned']['#value'][$aid] = array(
       'description' => $description,
-      'link' => l(t('remove'), "admin/build/actions/assign/remove/$hook/$op/". md5($aid))
+      'link' => l(t('remove'), "admin/build/actions/remove/$hook/$op/". md5($aid)),
     );
   }
 
@@ -316,7 +324,7 @@ function actions_assign($type = NULL) {
   // If no type is specified we default to node actions, since they
   // are the most common.
   if (!isset($type)) {
-    drupal_goto('admin/build/actions/assign/node');
+    drupal_goto('admin/build/actions/node');
   }
   if ($type == 'node') {
     $type = 'nodeapi';
@@ -345,7 +353,7 @@ function actions_assign($type = NULL) {
  */
 function actions_unassign($form_state, $hook = NULL, $op = NULL, $aid = NULL) {
   if (!($hook && $op && $aid)) {
-    drupal_goto('admin/build/actions/assign');
+    drupal_goto('admin/build/actions');
   }
 
   $form['hook'] = array(
@@ -364,7 +372,7 @@ function actions_unassign($form_state, $
   $action = actions_function_lookup($aid);
   $actions = actions_get_all_actions();
 
-  $destination = 'admin/build/actions/assign/'. ($hook == 'nodeapi' ? 'node' : $hook);
+  $destination = 'admin/build/actions/'. ($hook == 'nodeapi' ? 'node' : $hook);
 
   return confirm_form($form,
     t('Are you sure you want to remove the action %title?', array('%title' => $actions[$action]['description'])),
@@ -383,7 +391,7 @@ function actions_unassign_submit($form, 
     watchdog('actions', 'Action %action has been unassigned.',  array('%action' => check_plain($actions[$aid]['description'])));
     drupal_set_message(t('Action %action has been unassigned.', array('%action' => $actions[$aid]['description'])));
     $hook = $form_values['hook'] == 'nodeapi' ? 'node' : $form_values['hook'];
-    $form_state['redirect'] = 'admin/build/actions/assign/'. $hook;
+    $form_state['redirect'] = 'admin/build/actions/'. $hook;
   }
   else {
     drupal_goto('admin/build/actions');
Index: modules/comment/comment.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/comment/comment.module,v
retrieving revision 1.579
diff -u -p -r1.579 comment.module
--- modules/comment/comment.module	2 Sep 2007 14:56:18 -0000	1.579
+++ modules/comment/comment.module	3 Sep 2007 22:33:33 -0000
@@ -324,28 +324,28 @@ function comment_new_page_count($num_com
   $mode = _comment_get_display_setting('mode');
   $order = _comment_get_display_setting('sort');
   $pagenum = NULL;
-  $flat = in_array($mode, array(COMMENT_MODE_FLAT_COLLAPSED, COMMENT_MODE_FLAT_EXPANDED)); 
+  $flat = in_array($mode, array(COMMENT_MODE_FLAT_COLLAPSED, COMMENT_MODE_FLAT_EXPANDED));
   if ($num_comments <= $comments_per_page || ($flat && $order == COMMENT_ORDER_NEWEST_FIRST)) {
     // Only one page of comments or flat forum and newest first.
     // First new comment will always be on first page.
     $pageno = 0;
-  } 
+  }
   else {
-    if ($flat) { 
+    if ($flat) {
       // Flat comments and oldest first.
       $count = $num_comments - $new_replies;
-    } 
+    }
     else {
       // Threaded comments. See the documentation for comment_render().
-      if ($order == COMMENT_ORDER_NEWEST_FIRST) { 
+      if ($order == COMMENT_ORDER_NEWEST_FIRST) {
         // Newest first: find the last thread with new comment
         $result = db_query('(SELECT thread FROM {comments} WHERE nid = %d  AND status = 0 ORDER BY timestamp DESC LIMIT %d) ORDER BY thread DESC LIMIT 1', $nid, $new_replies);
         $thread = db_result($result);
         $result_count = db_query("SELECT COUNT(*) FROM {comments} WHERE nid = %d AND status = 0 AND thread > '" . $thread . "'", $nid);
-      } 
-      else { 
+      }
+      else {
         // Oldest first: find the first thread with new comment
-        $result = db_query('(SELECT thread FROM {comments} WHERE nid = %d  AND status = 0 ORDER BY timestamp DESC LIMIT %d) ORDER BY SUBSTRING(thread, 1, (LENGTH(thread) - 1)) LIMIT 1', $nid, $new_replies);  
+        $result = db_query('(SELECT thread FROM {comments} WHERE nid = %d  AND status = 0 ORDER BY timestamp DESC LIMIT %d) ORDER BY SUBSTRING(thread, 1, (LENGTH(thread) - 1)) LIMIT 1', $nid, $new_replies);
         $thread = substr(db_result($result), 0, -1);
         $result_count = db_query("SELECT COUNT(*) FROM {comments} WHERE nid = %d AND status = 0 AND SUBSTRING(thread, 1, (LENGTH(thread) - 1)) < '" . $thread . "'", $nid);
       }
@@ -2166,9 +2166,6 @@ function comment_action_info() {
       'description' => t('Unpublish comment'),
       'type' => 'comment',
       'configurable' => FALSE,
-      'hooks' => array(
-        'comment' => array('insert', 'update', 'view'),
-      )
     ),
     'comment_unpublish_by_keyword_action' => array(
       'description' => t('Unpublish comment containing keyword(s)'),
Index: modules/node/node.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.module,v
retrieving revision 1.877
diff -u -p -r1.877 node.module
--- modules/node/node.module	2 Sep 2007 14:42:30 -0000	1.877
+++ modules/node/node.module	3 Sep 2007 22:33:33 -0000
@@ -2337,8 +2337,8 @@ function node_action_info() {
       'description' => t('Publish post'),
       'configurable' => FALSE,
       'hooks' => array(
-        'nodeapi' => array('presave','insert','update', 'view'),
-        'comment' => array('delete','insert','update', 'view'),
+        'nodeapi' => array('presave', 'insert', 'update', 'view'),
+        'comment' => array('insert', 'update'),
       ),
     ),
     'node_unpublish_action' => array(
@@ -2346,8 +2346,8 @@ function node_action_info() {
       'description' => t('Unpublish post'),
       'configurable' => FALSE,
       'hooks' => array(
-        'nodeapi' => array('presave','insert','update', 'view'),
-        'comment' => array('delete','insert','update', 'view'),
+        'nodeapi' => array('presave', 'insert', 'update', 'view'),
+        'comment' => array('delete', 'insert', 'update'),
       ),
     ),
     'node_make_sticky_action' => array(
@@ -2355,8 +2355,8 @@ function node_action_info() {
       'description' => t('Make post sticky'),
       'configurable' => FALSE,
       'hooks' => array(
-        'nodeapi' => array('presave','insert','update', 'view'),
-        'comment' => array('delete','insert','update', 'view'),
+        'nodeapi' => array('presave', 'insert', 'update', 'view'),
+        'comment' => array('insert', 'update'),
       ),
     ),
     'node_make_unsticky_action' => array(
@@ -2364,8 +2364,8 @@ function node_action_info() {
       'description' => t('Make post unsticky'),
       'configurable' => FALSE,
       'hooks' => array(
-        'nodeapi' => array('presave','insert','update', 'view'),
-        'comment' => array('delete','insert','update', 'view'),
+        'nodeapi' => array('presave', 'insert', 'update', 'view'),
+        'comment' => array('delete', 'insert', 'update'),
       ),
     ),
     'node_promote_action' => array(
@@ -2373,9 +2373,8 @@ function node_action_info() {
       'description' => t('Promote post to front page'),
       'configurable' => FALSE,
       'hooks' => array(
-        'nodeapi' => array('presave','insert','update', 'view'),
-        'comment' => array('delete','insert','update', 'view'),
-        'user' => array('login'),
+        'nodeapi' => array('presave', 'insert', 'update', 'view'),
+        'comment' => array('insert', 'update'),
       ),
     ),
     'node_unpromote_action' => array(
@@ -2383,8 +2382,8 @@ function node_action_info() {
       'description' => t('Remove post from front page'),
       'configurable' => FALSE,
       'hooks' => array(
-        'nodeapi' => array('presave','insert','update', 'view'),
-        'comment' => array('delete','insert','update', 'view'),
+        'nodeapi' => array('presave', 'insert', 'update', 'view'),
+        'comment' => array('delete', 'insert', 'update'),
       ),
     ),
     'node_assign_owner_action' => array(
@@ -2393,8 +2392,8 @@ function node_action_info() {
       'configurable' => TRUE,
       'hooks' => array(
         'any' => TRUE,
-        'nodeapi' => array('presave','insert','update', 'view'),
-        'comment' => array('delete','insert','update', 'view'),
+        'nodeapi' => array('presave', 'insert', 'update', 'view'),
+        'comment' => array('delete', 'insert', 'update'),
       ),
     ),
     'node_save_action' => array(
@@ -2402,9 +2401,8 @@ function node_action_info() {
       'description' => t('Save post'),
       'configurable' => FALSE,
       'hooks' => array(
-        'nodeapi' => array('delete','insert','update', 'view'),
-        'comment' => array('delete','insert','update', 'view'),
-        'user' => array('login'),
+        'nodeapi' => array('insert', 'update', 'view'),
+        'comment' => array('delete', 'insert', 'update'),
       ),
     ),
     'node_unpublish_by_keyword_action' => array(
@@ -2412,8 +2410,7 @@ function node_action_info() {
       'description' => t('Unpublish post containing keyword(s)'),
       'configurable' => TRUE,
       'hooks' => array(
-        'nodeapi' => array('presave','insert','update', 'view'),
-        'comment' => array('delete','insert','update', 'view'),
+        'nodeapi' => array('presave', 'insert', 'update'),
       ),
     ),
   );
@@ -2494,38 +2491,18 @@ function node_assign_owner_action(&$node
 
 function node_assign_owner_action_form($context) {
   $description = t('The username of the user to which you would like to assign ownership.');
-  $count = db_result(db_query("SELECT COUNT(*) FROM {users}"));
   $owner_name = '';
   if (isset($context['owner_uid'])) {
     $owner_name = db_result(db_query("SELECT name FROM {users} WHERE uid = %d", $context['owner_uid']));
   }
 
-  // Use dropdown for fewer than 200 users; textbox for more than that.
-  if (intval($count) < 200) {
-    $options = array();
-    $result = db_query("SELECT uid, name FROM {users} WHERE uid > 0 ORDER BY name");
-    while ($data = db_fetch_object($result)) {
-      $options[$data->name] = $data->name;
-    }
-    $form['owner_name'] = array(
-      '#type' => 'select',
-      '#title' => t('Username'),
-      '#default_value' => $owner_name,
-      '#options' => $options,
-      '#description' => $description,
-    );
-  }
-  else {
-    $form['owner_name'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Username'),
-      '#default_value' => $owner_name,
-      '#autocomplete_path' => 'user/autocomplete',
-      '#size' => '6',
-      '#maxlength' => '7',
-      '#description' => $description,
-    );
-  }
+  $form['owner_name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Username'),
+    '#default_value' => $owner_name,
+    '#autocomplete_path' => 'user/autocomplete',
+    '#description' => $description,
+  );
   return $form;
 }
 
Index: modules/system/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.module,v
retrieving revision 1.526
diff -u -p -r1.526 system.module
--- modules/system/system.module	1 Sep 2007 14:41:21 -0000	1.526
+++ modules/system/system.module	3 Sep 2007 22:33:34 -0000
@@ -52,13 +52,13 @@ function system_help($path, $arg) {
       return $output;
     case 'admin/build/modules/uninstall':
       return '<p>'. t('The uninstall process removes all data related to a module. To uninstall a module, you must first disable it. Not all modules support this feature.') .'</p>';
-    case 'admin/build/actions':
-    case 'admin/build/actions/manage':
+    case 'admin/settings/actions':
+    case 'admin/settings/actions/manage':
       $explanation = t('Actions are functions that Drupal can execute when certain events happen, such as when a post is added or a user logs in.');
       $output = '<p>'. $explanation .' '. t('A module, such as the actions module, may assign these actions to the specific events that will trigger them.') .'</p>';
       $output .= '<p>'. t('This page lists all actions that are available. Simple actions that do not require any configuration are listed automatically. Advanced actions that need to be configured are listed in the dropdown below. To add an advanced action, select the action and click the <em>Configure</em> button. After completing the configuration form, the action will be available for use by Drupal.') .'</p>';
       return $output;
-    case 'admin/build/actions/config':
+    case 'admin/settings/actions/config':
       return '<p>'. t('This is where you configure a certain action that will be performed at some time in the future. For example, you might configure an action to send email to your friend Joe. You would modify the description field, below, to read %send to remind you of that. The description you provide will be used to identify this action; for example, when assigning an action to a Drupal event such as a new comment being posted.', array('%send' => t('Send email to Joe'))) .'</p>';
     case 'admin/logs/status':
       return '<p>'. t("Here you can find a short overview of your Drupal site's parameters as well as any problems detected with your installation. It is useful to copy/paste this information when you need support.") .'</p>';
@@ -272,40 +272,38 @@ function system_menu() {
     'type' => MENU_CALLBACK,
   );
 
-  // Actions:
-  $items['admin/build/actions'] = array(
+  // Settings:
+  $items['admin/settings/actions'] = array(
     'title' => 'Actions',
     'description' => 'Manage the actions defined for your site.',
     'access arguments' => array('administer actions'),
     'page callback' => 'system_actions_manage'
   );
-  $items['admin/build/actions/manage'] = array(
+  $items['admin/settings/actions/manage'] = array(
     'title' => 'Manage actions',
     'description' => 'Manage the actions defined for your site.',
     'page callback' => 'system_actions_manage',
     'type' => MENU_DEFAULT_LOCAL_TASK,
     'weight' => -2,
   );
-  $items['admin/build/actions/config'] = array(
+  $items['admin/settings/actions/config'] = array(
     'title' => 'Configure an action',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('system_actions_configure'),
     'type' => MENU_CALLBACK,
   );
-  $items['admin/build/actions/delete/%actions'] = array(
+  $items['admin/settings/actions/delete/%actions'] = array(
     'title' => 'Delete action',
     'description' => 'Delete an action.',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('system_actions_delete_form', 4),
     'type' => MENU_CALLBACK,
   );
-  $items['admin/build/actions/orphan'] = array(
+  $items['admin/settings/actions/orphan'] = array(
     'title' => 'Remove orphans',
     'page callback' => 'system_actions_remove_orphans',
     'type' => MENU_CALLBACK,
   );
-
-  // Settings:
   $items['admin/settings/site-information'] = array(
     'title' => 'Site information',
     'description' => 'Change basic site information, such as the site name, slogan, e-mail address, mission, front page and more.',
@@ -1101,6 +1099,17 @@ function system_action_info() {
         'taxonomy' => array('insert', 'update', 'delete'),
       ),
     ),
+    'system_watchdog_action' => array(
+      'type' => 'system',
+      'description' => t('Send a message to the log'),
+      'configurable' => TRUE,
+      'hooks' => array(
+        'nodeapi' => array('view', 'insert', 'update', 'delete'),
+        'comment' => array('view', 'insert', 'update', 'delete'),
+        'user' => array('view', 'insert', 'update', 'delete', 'login'),
+        'taxonomy' => array('insert', 'update', 'delete'),
+      ),
+    ),
     'system_send_email_action' => array(
       'description' => t('Send e-mail'),
       'type' => 'system',
@@ -1158,8 +1167,8 @@ function system_actions_manage() {
     $row[] = array(
       array('data' => $action->type),
       array('data' => $action->description),
-      array('data' => $action->parameters ? l(t('configure'), "admin/build/actions/config/$action->aid") : ''),
-      array('data' => $action->parameters ? l(t('delete'), "admin/build/actions/delete/$action->aid") : '')
+      array('data' => $action->parameters ? l(t('configure'), "admin/settings/actions/config/$action->aid") : ''),
+      array('data' => $action->parameters ? l(t('delete'), "admin/settings/actions/delete/$action->aid") : '')
     );
   }
 
@@ -1209,7 +1218,7 @@ function system_actions_manage_form($for
 
 function system_actions_manage_form_submit($form, &$form_state) {
   if ($form_state['values']['action']) {
-    $form_state['redirect'] = 'admin/build/actions/config/'. $form_state['values']['action'];
+    $form_state['redirect'] = 'admin/settings/actions/config/'. $form_state['values']['action'];
   }
 }
 
@@ -1230,7 +1239,7 @@ function system_actions_manage_form_subm
  */
 function system_actions_configure($form_state, $action = NULL) {
   if ($action === NULL) {
-    drupal_goto('admin/build/actions');
+    drupal_goto('admin/settings/actions');
   }
 
   $actions_map = actions_actions_map(actions_list());
@@ -1318,7 +1327,7 @@ function system_actions_configure_submit
   actions_save($function, $form_state['values']['actions_type'], $params, $form_state['values']['actions_description'], $aid);
   drupal_set_message(t('The action has been successfully saved.'));
 
-  $form_state['redirect'] = 'admin/build/actions/manage';
+  $form_state['redirect'] = 'admin/settings/actions/manage';
 }
 
 /**
@@ -1335,7 +1344,7 @@ function system_actions_delete_form($for
   );
   return confirm_form($form,
     t('Are you sure you want to delete the action %action?', array('%action' => $action->description)),
-    'admin/build/actions/manage',
+    'admin/settings/actions/manage',
     t('This cannot be undone.'),
     t('Delete'), t('Cancel')
   );
@@ -1351,7 +1360,7 @@ function system_actions_delete_form_subm
   $description = check_plain($action->description);
   watchdog('user', 'Deleted action %aid (%action)', array('%aid' => $aid, '%action' => $description));
   drupal_set_message(t('Action %action was deleted', array('%action' => $description)));
-  $form_state['redirect'] = 'admin/build/actions/manage';
+  $form_state['redirect'] = 'admin/settings/actions/manage';
 }
 /**
  * Post-deletion operations for deleting action orphans.
@@ -1368,7 +1377,7 @@ function system_action_delete_orphans_po
  */
 function system_actions_remove_orphans() {
   actions_synchronize(actions_list(), TRUE);
-  drupal_goto('admin/build/actions/manage');
+  drupal_goto('admin/settings/actions/manage');
 }
 
 /**
@@ -1602,6 +1611,116 @@ function system_message_action(&$object,
   drupal_set_message($context['message']);
 }
 
+
+function system_watchdog_action_form($context) {
+  $form['message'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Message'),
+    '#default_value' => isset($context['message']) ? $context['message'] : '',
+    '#required' => TRUE,
+    '#rows' => '8',
+    '#description' => t('The message to be logged.  You may include the following variables: %site_name, %username, %node_url, %node_type, %title, %teaser, %body. Not all variables will be available in all contexts.'),
+  );
+  $form['severity'] = array(
+    '#type' => 'select',
+    '#title' => t('Severity'),
+    '#default_value' => isset($context['severity']) ? $context['severity'] : 6,
+    '#description' => t('The severity of the message to be logged.'),
+    '#options' => array(
+      0 => 'Emergency: system is unusable',
+      1 => 'Alert: action must be taken immediately',
+      2 => 'Critical: critical conditions',
+      3 => 'Error: error conditions',
+      4 => 'Warning: warning conditions',
+      5 => 'Notice: normal but significant condition',
+      6 => 'Informational: informational messages',
+      7 => 'Debug: debug-level messages',
+    ),
+  );
+  $form['type'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Type'),
+    '#default_value' => isset($context['type']) ? $context['type'] : '',
+    '#description' => t('The "type" of the message.  Can be anything (for example, content, taxonomy, or user).'),
+    '#size' => 40,
+    '#maxlength' => 255,
+  );
+  
+  return $form;
+}
+
+function system_watchdog_action_submit($form, $form_state) {
+  return array(
+    'message'  => $form_state['values']['message'],
+    'severity' => $form_state['values']['severity'],
+    'type'     => $form_state['values']['type'],
+  );
+}
+
+/**
+ * A configurable Drupal action. Logs a message in watchdog
+ */
+function system_watchdog_action(&$object, $context = array()) {
+  global $user;
+  $variables = array(
+    '%site_name' => variable_get('site_name', 'Drupal'),
+    '%username' => $user->name ? $user->name : variable_get('anonymous', t('Anonymous')),
+  );
+  $url = $title = NULL;
+
+  // This action can be called in any context, but if placeholders
+  // are used a node object must be present to be the source
+  // of substituted text.
+  switch ($context['hook']) {
+    case 'nodeapi':
+      // Because this is not an action of type 'node' the node
+      // will not be passed as $object, but it will still be available
+      // in $context.
+      $node = $context['node'];
+      $url = url('node/'. $node->nid, array('absolute' => TRUE));
+      $title = $node->title;
+      break;
+    // The comment hook also provides the node, in context.
+    case 'comment':
+      $comment = $context['comment'];
+      $node = node_load($comment->nid);
+      $url = url('node/'. $comment->nid, array('fragment' => 'comment-'. $comment->cid, 'absolute' => TRUE));
+      $title = $comment->title;
+      break;
+    case 'taxonomy':
+      $vocabulary = taxonomy_vocabulary_load($object->vid);
+      $variables = array_merge($variables, array(
+        '%term_name' => $object->name,
+        '%term_description' => $object->description,
+        '%term_id' => $object->tid,
+        '%vocabulary_name' => $vocabulary->name,
+        '%vocabulary_description' => $vocabulary->description,
+        '%vocabulary_id' => $vocabulary->vid,
+        )
+      );
+      $url = url('taxonomy/term/'. $object->tid, array('absolute' => TRUE));
+      $title = $object->name;
+      break;
+    default:
+      // We are being called directly.
+      $node = $object;
+  }
+
+  if (isset($node) && is_object($node)) {
+    $variables = array_merge($variables, array(
+      '%uid' => $node->uid,
+      '%node_url' => url('node/'. $node->nid, array('absolute' => TRUE)),
+      '%node_type' => check_plain(node_get_types('name', $node)),
+      '%title' => filter_xss($node->title),
+      '%teaser' => filter_xss($node->teaser),
+      '%body' => filter_xss($node->body),
+      )
+    );
+  }
+  $context['message'] = strtr($context['message'], $variables);
+  watchdog($context['type'], $context['message'], array(), $context['severity'], l($title, $url));
+}
+
 /**
  * Implementation of a configurable Drupal action. Redirect user to a URL.
  */
Index: modules/user/user.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.module,v
retrieving revision 1.839
diff -u -p -r1.839 user.module
--- modules/user/user.module	2 Sep 2007 12:46:21 -0000	1.839
+++ modules/user/user.module	3 Sep 2007 22:33:34 -0000
@@ -3418,21 +3418,11 @@ function user_action_info() {
       'description' => t('Block current user'),
       'type' => 'user',
       'configurable' => FALSE,
-      'hooks' => array(
-        'nodeapi' => array('presave', 'delete', 'insert', 'update', 'view'),
-        'comment' => array('view', 'insert', 'update', 'delete'),
-        'user' => array('logout'),
-        ),
-      ),
+    ),
     'user_block_ip_action' => array(
       'description' => t('Ban IP address of current user'),
       'type' => 'user',
       'configurable' => FALSE,
-      'hooks' => array(
-        'nodeapi' => array('presave', 'delete', 'insert', 'update', 'view'),
-        'comment' => array('view', 'insert', 'update', 'delete'),
-        'user' => array('logout'),
-      )
     ),
   );
 }
