Index: diff.module =================================================================== --- diff.module (revision 5497) +++ diff.module (working copy) @@ -60,24 +60,49 @@ 'access arguments' => array(1), 'tab_parent' => 'node/%/revisions/list', ); + $items['node/%node/revisions/view/%'] = array( + 'title' => 'Diff with predecessor', + 'page callback' => 'diff_predecessor', + 'page arguments' => array(1, 4), + 'type' => MENU_LOCAL_TASK, + 'access arguments' => array('access content'), + 'tab_parent' => 'node/%/revisions/list', + ); $items['node/%node/revisions/view/latest'] = array( 'title' => 'Show latest diff', 'page callback' => 'diff_latest', 'page arguments' => array(1), 'type' => MENU_LOCAL_TASK, - 'access callback' => '_node_revision_access', - 'access arguments' => array(1), + 'access arguments' => array('access content'), 'tab_parent' => 'node/%/revisions/view', ); return $items; } +// Menu callback - show diff between specified version and predecessor for a given node. +function diff_predecessor($node, $vid) { + $revisions = node_revision_list($node); + if (isset($revisions[$vid])) { + $keys = array_keys($revisions); + $key_indices = array_flip($keys); + $predecessor = $revisions[$keys[$key_indices[$vid]+1]]; + if ($predecessor) { + drupal_goto("node/$node->nid/revisions/view/$predecessor->vid/$vid"); + } + } + + drupal_goto("node/$node->nid"); +} // Menu callback - show latest diff for a given node. function diff_latest($node) { $revisions = node_revision_list($node); - $new = array_shift($revisions); - $old = array_shift($revisions); - drupal_goto("node/$node->nid/revisions/view/$old->vid/$new->vid"); + if (count($revisions) > 1) { + $new = array_shift($revisions); + $old = array_shift($revisions); + drupal_goto("node/$node->nid/revisions/view/$old->vid/$new->vid"); + } + + drupal_goto("node/$node->nid"); } /**