Index: role_delegation.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/role_delegation/role_delegation.module,v
retrieving revision 1.14.2.4
diff -u -r1.14.2.4 role_delegation.module
--- role_delegation.module	12 Jan 2010 20:37:27 -0000	1.14.2.4
+++ role_delegation.module	23 Nov 2010 01:02:00 -0000
@@ -160,6 +160,61 @@
 
 
 /**
+ * Implementation of hook_form_user_admin_role_alter().
+ */
+function role_delegation_form_user_admin_role_alter(&$form, $form_state)
+{
+  // Put our submit function in line ahead of user_admin_role_submit(),
+  // so that it can make use of the old role name before it's changed to the new
+  array_unshift($form['#submit'], 'role_delegation_form_user_admin_role_submit');
+}
+
+/**
+ * Submit function for the user_admin_role form:
+ * When a role is renamed or deleted, rename or delete the permission
+ * to assign that role.
+ */
+function role_delegation_form_user_admin_role_submit($form, &$form_state) {
+  $op = $form_state['values']['op'];
+  if ($op != t('Save role') && $op != t('Delete role')) {
+    return;
+  }
+  $rid = $form_state['values']['rid'];
+  $oldrole = db_result(db_query('SELECT name FROM {role} WHERE rid = %d', $rid));
+  $newrole = $form_state['values']['name'];
+  if ($op == t('Save role') && $oldrole == $newrole) {
+    return;
+  }
+  // Role is being renamed or deleted.
+  // Loop through permission lists for all roles, renaming or deleting the
+  // 'assign' permission for this role.
+  $oldperm = _role_delegation_make_perm($oldrole);
+  $result = db_query('SELECT * FROM {permission}');
+  while ($row = db_fetch_object($result)) {
+    $perms = explode(', ', $row->perm);
+    for ($i = 0; $i < count($perms); ++$i) {
+      if ($perms[$i] == $oldperm) {
+        switch ($op) {
+          case t('Save role'):
+            $perms[$i] = _role_delegation_make_perm($newrole);
+            break;
+          case t('Delete role'):
+            unset($perms[$i]);
+            break;
+        }
+        if (count($perms)) {
+          db_query("UPDATE {permission} SET perm = '%s' WHERE pid = %d",
+            implode(', ', $perms), $row->pid);
+        } else {
+          db_query("DELETE FROM {permission} WHERE pid = %d", $row->pid);
+        }
+        break;
+      }
+    }
+  }
+}
+
+/**
  * Implementation of hook_user().
  */
 function role_delegation_user($op, &$edit, &$account, $category = NULL) {
