diff -Naur diff.orig/diff.module diff/diff.module
--- diff.orig/diff.module	2005-05-05 21:20:37.000000000 +0300
+++ diff/diff.module	2007-01-29 11:59:48.000000000 +0200
@@ -1,4 +1,4 @@
-<?php
+<?php // -*-php-*-
 // $Id: diff.module,v 1.2.2.3 2005/05/05 18:20:37 weitzman Exp $
 
 /*
@@ -6,7 +6,8 @@
  * Copyright (c) 2005 Mohammed Sameer.
  * Significantly updated and maintained by Moshe Weitzman <weitzman [at] tejasa DOT com>
  * This module is distributed under the GPL.
-*/
+ * 4.7 port by Mohammed Sameer for eglug.org
+ */
 
 include_once 'Text/Diff.php';
 include_once 'Text/Diff/Renderer.php';
@@ -36,21 +37,23 @@
 
   if (!$may_cache) {
     if (arg(0) == 'node' && is_numeric(arg(1))) {
-      $node = node_load(array('nid' => arg(1)));
+      $node = node_load(arg(1));
       if ($node->nid) {
-        if ($node->revisions) {
-           $items[] = array('path' => 'node/'. arg(1) .'/diff', 'title' => t('diff'),
-           'callback' => 'diff_page',
-           'callback arguments' => arg(1),
-           'access' => user_access('access diff'),
-           'weight' => 6,
-           'type' => MENU_LOCAL_TASK);
+        if ($node->vid > 1) {
+           $items[] = array('path' => 'node/'. arg(1) .'/diff',
+			    'title' => t('diff'),
+			    'callback' => 'diff_page',
+			    'callback arguments' => arg(1),
+			    'access' => user_access('access diff'),
+			    'weight' => 6,
+			    'type' => MENU_LOCAL_TASK);
         }
       }
     }
-    $path = drupal_get_path('module', 'diff');
     $style = "<link type=\"text/css\" rel=\"stylesheet\" href=\"$path/diff.css\" />";
     drupal_set_html_head($style);
+    //    $path = drupal_get_path('module', 'diff');
+    //    drupal_add_css($path.'/diff.css');
   }
   return $items;
 }
@@ -69,11 +72,11 @@
 
 
 function _diff_show_revision($nid, $rid1, $rid2 = NULL) {
-  $r1 = node_load(array('nid' => $nid), $rid1);
-  $r2 = node_load(array('nid' => $nid), $rid2);
+  $r1 = node_load($nid, $rid1);
+  $r2 = node_load($nid, $rid2);
   $source = explode("\n", diff_node_render($r2));
   $target = explode("\n", diff_node_render($r1));
-  $diff = &new Text_Diff($target, $source);
+  $diff = &new Text_Diff($source, $target);
   $renderer = &new Text_Diff_Renderer_inline();
   $node = $r1;
   $node->body = $renderer->render($diff);
@@ -81,21 +84,32 @@
 }
 
 function _diff_show_page($nid) {
-  $node = node_load(array('nid' => $nid));
+  $node = node_load($nid);
   drupal_set_title($node->title);
 
+  $revisions = array_reverse(node_revision_list($node));
+
   $header = array(t('Older revisions'), array('data' => t('Operations'), 'colspan' => 3));
-  // $last_key = count($node->revisions) - 1;
-  foreach ($node->revisions as $key => $revision) {
+
+  foreach ($revisions as $key => $revision) {
+    $vid = $revision->vid;
     if ($key != 0) {
-      $prev = l(t('previous'), "node/$node->nid/diff/$key/".($key-1));
-      $first = l(t('first'), "node/$node->nid/diff/$key/0");
+      $prev = l(t('previous'), "node/$node->nid/diff/$vid/".( $revisions[$key-1]->vid ));
+      $first = l(t('first'), "node/$node->nid/diff/$vid/" .($revisions[0]->vid));
     }
-    $current = l(t('current'), "node/$node->nid/diff/$key");
-    $rows[] = array(t('revision #%r revised by %u on %d', array('%r' => $key, '%u' => format_name(user_load(array('uid' => $revision['uid']))), '%d' => format_date($revision['timestamp'], 'small'))) . ($revision['history'] ? '<br /><small>'. $revision['history'] .'</small>' : ''), $prev, $first, $current);
+    $current = l(t('current'), "node/$node->nid/diff/$vid");
+    $rows[] = array(
+		    t('revision %r (%v) revised by %u on %d',
+		      array(
+			    '%r' => 1 + $key,
+			    '%v' => $vid,
+			    '%u' => theme('username', user_load(array('uid' => $revision->uid))),
+			    '%d' => format_date($revision->timestamp, 'small')
+			    )
+		      ) . ($revision->history ? '<br /><small>'. $revision->history .'</small>' : ''),
+		    $prev, $first, $current);
   }
-  $output .= theme('table', $header, $rows);
-  return $output;
+  return theme('table', $header, $rows);
 }
 
 // Get node *body* output (filtered and with module-specific fields). Modified from node_update_index()
