? change_how_roles_are_granted_and_deleted.patch
Index: og_user_roles.pages.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/og_user_roles/og_user_roles.pages.inc,v
retrieving revision 1.5
diff -u -p -r1.5 og_user_roles.pages.inc
--- og_user_roles.pages.inc	6 Dec 2009 19:26:37 -0000	1.5
+++ og_user_roles.pages.inc	1 Jan 2010 17:45:24 -0000
@@ -140,13 +140,20 @@ function og_user_roles_page_form_submit(
   $gid = $form['#node']->nid;
 
   foreach ($form_state['values']['user_roles'] as $uid => $new_roles) {
-    foreach ($form['#assignable_roles'] as $rid => $name) {
-      if (empty($new_roles[$rid])) {
-        og_user_roles_role_delete($gid, $uid, $rid);
-      }
-      else {
-        og_user_roles_role_add($gid, $uid, $rid);
-      }
+    $orginal_roles = $form['user_roles'][$uid]['roles']['#default_value'];
+    
+    // Determine which roles need to be granted to the user.
+    $granted_roles = array_filter(array_diff($new_roles, $orginal_roles));
+    
+    // Determine which roles need to be deleted from the user.
+    $deleted_roles = array_diff($orginal_roles, $new_roles);
+    
+    foreach ($granted_roles as $rid => $checked) {
+      og_user_roles_role_add($gid, $uid, $rid);
+    }
+    
+    foreach ($deleted_roles as $rid => $checked) {
+      og_user_roles_role_delete($gid, $uid, $rid);
     }
   }
 
