? .DS_Store
? 232327-improve-ability-to-handle-orphan-node-types-02.patch
? 232327-improve-ability-to-handle-orphan-node-types-03.patch
? 232327-improve-ability-to-handle-orphan-node-types.patch
? sites/.DS_Store
? sites/default/.DS_Store
? sites/default/files
? sites/default/settings.php
Index: modules/node/node.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.admin.inc,v
retrieving revision 1.97
diff -u -p -r1.97 node.admin.inc
--- modules/node/node.admin.inc	7 Jul 2010 17:56:42 -0000	1.97
+++ modules/node/node.admin.inc	22 Aug 2010 13:18:15 -0000
@@ -90,11 +90,20 @@ function node_filters() {
     );
   }
 
+  $types = node_type_get_names();
+  // If content orphaned by type deletion must be added to the select list
+  // so that the orphaned content can be cleaned up.
+  $items = db_query("SELECT type FROM {node} GROUP BY type")->fetchCol();
+  foreach($items as $item) {
+    if (!array_key_exists($item, $types)) {
+      $types[$item] = $item . t(' [Deleted Content Type]');
+    }
+  }
   $filters['type'] = array(
     'title' => t('type'),
     'options' => array(
       '[any]' => t('any'),
-    ) + node_type_get_names(),
+    ) + $types,
   );
 
   // Language filter if there is a list of languages
@@ -162,6 +171,9 @@ function node_filter_form() {
     }
     else {
       $value = $filters[$type]['options'][$value];
+      if (isset($filters[$type]['options'][$value])) {
+        $value = $filters[$type]['options'][$value];
+      }
     }
     if ($i++) {
       $form['filters']['current'][] = array('#markup' => t('<em>and</em> where <strong>%type</strong> is <strong>%value</strong>', array('%type' => $filters[$type]['title'], '%value' => $value)));
@@ -472,7 +484,7 @@ function node_admin_nodes() {
           '#suffix' => ' ' . theme('mark', array('type' => node_mark($node->nid, $node->changed))),
         ),
       ),
-      'type' => check_plain(node_type_get_name($node)),
+      'type' => node_type_get_name($node) ? check_plain(node_type_get_name($node)) : check_plain($node->type) . t(' [Deleted Content Type]'),
       'author' => theme('username', array('account' => $node)),
       'status' => $node->status ? t('published') : t('not published'),
       'changed' => format_date($node->changed, 'short'),
Index: modules/node/node.pages.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.pages.inc,v
retrieving revision 1.130
diff -u -p -r1.130 node.pages.inc
--- modules/node/node.pages.inc	20 Aug 2010 01:23:43 -0000	1.130
+++ modules/node/node.pages.inc	22 Aug 2010 13:18:15 -0000
@@ -13,7 +13,15 @@
 function node_page_edit($node) {
   $type_name = node_type_get_name($node);
   drupal_set_title(t('<em>Edit @type</em> @title', array('@type' => $type_name, '@title' => $node->title)), PASS_THROUGH);
-  return drupal_get_form($node->type . '_node_form', $node);
+  if ($type_name) {
+    return drupal_get_form($node->type . '_node_form', $node);
+  }
+  else {
+    $page = array();
+    $types_link = user_access('administer content types') ? l(t(' Edit content types.'), 'admin/structure/types') : '';
+    drupal_set_message(t('This content cannot be edited because the content type %type has been disabled or removed.', array('%type' => $node->type)) . $types_link, 'error');
+    return $page;
+  }
 }
 
 function node_add_page() {
@@ -486,50 +494,59 @@ function node_delete_confirm_submit($for
  */
 function node_revision_overview($node) {
   drupal_set_title(t('Revisions for %title', array('%title' => $node->title)), PASS_THROUGH);
-
-  $header = array(t('Revision'), array('data' => t('Operations'), 'colspan' => 2));
-
-  $revisions = node_revision_list($node);
-
-  $rows = array();
-  $revert_permission = FALSE;
-  if ((user_access('revert revisions') || user_access('administer nodes')) && node_access('update', $node)) {
-    $revert_permission = TRUE;
-  }
-  $delete_permission = FALSE;
-  if ((user_access('delete revisions') || user_access('administer nodes')) && node_access('delete', $node)) {
-    $delete_permission = TRUE;
-  }
-  foreach ($revisions as $revision) {
-    $row = array();
-    $operations = array();
-
-    if ($revision->current_vid > 0) {
-      $row[] = array('data' => t('!date by !username', array('!date' => l(format_date($revision->timestamp, 'short'), "node/$node->nid"), '!username' => theme('username', array('account' => $revision))))
-                               . (($revision->log != '') ? '<p class="revision-log">' . filter_xss($revision->log) . '</p>' : ''),
-                     'class' => array('revision-current'));
-      $operations[] = array('data' => drupal_placeholder(t('current revision')), 'class' => array('revision-current'), 'colspan' => 2);
+  
+  $type_name = node_type_get_name($node);
+  if ($type_name) {
+    $header = array(t('Revision'), array('data' => t('Operations'), 'colspan' => 2));
+
+    $revisions = node_revision_list($node);
+
+    $rows = array();
+    $revert_permission = FALSE;
+    if ((user_access('revert revisions') || user_access('administer nodes')) && node_access('update', $node)) {
+      $revert_permission = TRUE;
+    }
+    $delete_permission = FALSE;
+    if ((user_access('delete revisions') || user_access('administer nodes')) && node_access('delete', $node)) {
+      $delete_permission = TRUE;
     }
-    else {
-      $row[] = t('!date by !username', array('!date' => l(format_date($revision->timestamp, 'short'), "node/$node->nid/revisions/$revision->vid/view"), '!username' => theme('username', array('account' => $revision))))
-               . (($revision->log != '') ? '<p class="revision-log">' . filter_xss($revision->log) . '</p>' : '');
-      if ($revert_permission) {
-        $operations[] = l(t('revert'), "node/$node->nid/revisions/$revision->vid/revert");
+    foreach ($revisions as $revision) {
+      $row = array();
+      $operations = array();
+
+      if ($revision->current_vid > 0) {
+        $row[] = array('data' => t('!date by !username', array('!date' => l(format_date($revision->timestamp, 'short'), "node/$node->nid"), '!username' => theme('username', array('account' => $revision))))
+                                 . (($revision->log != '') ? '<p class="revision-log">' . filter_xss($revision->log) . '</p>' : ''),
+                       'class' => array('revision-current'));
+        $operations[] = array('data' => drupal_placeholder(t('current revision')), 'class' => array('revision-current'), 'colspan' => 2);
       }
-      if ($delete_permission) {
-        $operations[] = l(t('delete'), "node/$node->nid/revisions/$revision->vid/delete");
+      else {
+        $row[] = t('!date by !username', array('!date' => l(format_date($revision->timestamp, 'short'), "node/$node->nid/revisions/$revision->vid/view"), '!username' => theme('username', array('account' => $revision))))
+                 . (($revision->log != '') ? '<p class="revision-log">' . filter_xss($revision->log) . '</p>' : '');
+        if ($revert_permission) {
+          $operations[] = l(t('revert'), "node/$node->nid/revisions/$revision->vid/revert");
+        }
+        if ($delete_permission) {
+          $operations[] = l(t('delete'), "node/$node->nid/revisions/$revision->vid/delete");
+        }
       }
+      $rows[] = array_merge($row, $operations);
     }
-    $rows[] = array_merge($row, $operations);
-  }
 
-  $build['node_revisions_table'] = array(
-    '#theme' => 'table',
-    '#rows' => $rows,
-    '#header' => $header,
-  );
+    $build['node_revisions_table'] = array(
+      '#theme' => 'table',
+      '#rows' => $rows,
+      '#header' => $header,
+    );
 
-  return $build;
+    return $build;
+  }
+  else {
+    $page = array();
+    $types_link = user_access('administer content types') ? l(t(' Edit content types.'), 'admin/structure/types') : '';
+    drupal_set_message(t('This content cannot be reverted to a previous revision because the content type %type has been disabled or removed.', array('%type' => $node->type)) . $types_link, 'error');
+    return $page;
+  }
 }
 
 /**
Index: modules/node/node.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.test,v
retrieving revision 1.92
diff -u -p -r1.92 node.test
--- modules/node/node.test	8 Aug 2010 13:02:37 -0000	1.92
+++ modules/node/node.test	22 Aug 2010 13:18:17 -0000
@@ -298,6 +298,14 @@ class PageEditTestCase extends DrupalWeb
     $first_node_version = node_load($node->nid, $node->vid);
     $second_node_version = node_load($node->nid, $revised_node->vid);
     $this->assertNotIdentical($first_node_version->revision_uid, $second_node_version->revision_uid, 'Each revision has a distinct user.');
+
+    // Ensure that the node edit screen throws a message when type no longer exists.
+    module_enable(array('poll'));
+    $this->drupalLogin($this->admin_user);
+    $node = $this->drupalCreateNode(array('type' => 'poll'));
+    module_disable(array('poll'));
+    $this->drupalGet("node/$node->nid/edit");
+    $this->assertRaw(t('This content cannot be edited because the content type %type has been disabled or removed.', array('%type' => $node->type)), 'Nodes cannot be edited if their type no longer exists.');
   }
 
   /**
