Index: versioncontrol.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/versioncontrol/versioncontrol.module,v
retrieving revision 1.76
diff -u -r1.76 versioncontrol.module
--- versioncontrol.module	9 Nov 2007 20:23:25 -0000	1.76
+++ versioncontrol.module	10 Dec 2007 16:28:12 -0000
@@ -2095,6 +2095,42 @@
 }
 
 /**
+ * Retrieve general statistics about what happened in a single commit. For more granular
+ * details about what happened in a single commit, use versioncontrol_get_commit_actions.
+ *
+ * @param $commit
+ *   The commit to retrieve statistics about
+ *
+ * @param $commit_actions
+ *   The actions of the commit. Can be passed by the caller if the caller already has the actions,
+ *   or can be left absent and they will be automatically obtained.
+ *
+ * @return
+ *  A structured array containing general statistics about this commit. The array will consist
+ *  of elements with the following keys:
+ *
+ *   - 'lines_added': Total number of lines added during this commit
+ *   - 'lines_removed': Total number of lines removed during this commit
+ *   - 'action_count': Total number of actions within this commit
+ *   - 'per_action_statistics': An array containing statistics on individual actions. Array keys are
+ *        the current/new paths (just as with versioncontrol_get_commit_actions). The corresponding
+ *        array values are again structured arrays and consist of elements with the following keys:
+ *   
+ *   - 'lines_added': Number of lines added in this action
+ *   - 'lines_removed': Number of lines removed in this action
+ *
+ *   These values are designed so that statistics from several commits can be combined, hence why totals
+ *   are given rather than averages. A real-life example of such a result array can be found in the FakeVCS 
+ *   example module.
+ *   
+ */
+function versioncontrol_get_commit_statistics($commit, $commit_actions = NULL) {
+  return _versioncontrol_call_backend(
+    $commit['repository']['vcs'], 'get_commit_statistics', array($commit, $commit_actions)
+  );
+}
+
+/**
  * Return the 'current item' of a commit action if there is one,
  * or the first (only) one of the 'source items' if the file has been deleted.
  * As this function is also being used within access checks, it also works
Index: commitlog/commitlog.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/versioncontrol/commitlog/commitlog.module,v
retrieving revision 1.26
diff -u -r1.26 commitlog.module
--- commitlog/commitlog.module	8 Nov 2007 02:58:36 -0000	1.26
+++ commitlog/commitlog.module	10 Dec 2007 16:28:13 -0000
@@ -490,8 +490,11 @@
   $variables['id'] = theme('commitlog_commit_identifier', $commit, $format);
   $variables['repository_name'] = theme('commitlog_repository', $commit['repository'], $format);
   $variables['time'] = format_date($commit['date'], 'custom', 'H:i');
+  
+  $statistics = versioncontrol_get_commit_statistics($commit, $commit_actions);
 
   $variables['actions'] = theme('commitlog_commit_actions', $commit, $commit_actions, $format);
+  $variables['statistics'] = theme('commitlog_commit_statistics', $commit, $statistics, $format);
   $variables['message'] = theme('commitlog_commit_message', $commit, $format);
   $variables['branches'] = theme('commitlog_commit_branches', $commit, $format);
 
@@ -511,6 +514,7 @@
     '!name' => $variables['username'],
     '!time' => $variables['time'],
   ));
+  $output .= ' ('. $variables['statistics'] .')';
   $output .= "</div>\n"; // class "title"
 
   $output .= '<div class="actions">'. $variables['actions'] .'</div>'."\n";
@@ -652,6 +656,14 @@
   return implode(', ', $branches);
 }
 
+function theme_commitlog_commit_statistics($commit, $commit_statistics, $format = 'html') {
+  $lines = array();
+  
+  $lines[] = t('@line_count added', array('@line_count' => format_plural($commit_statistics['lines_added'], '1 line', '@count lines')));
+  $lines[] = t('@line_count removed', array('@line_count' => format_plural($commit_statistics['lines_removed'], '1 line', '@count lines')));
+  
+  return implode(", ", $lines);
+}
 
 function theme_commitlog_commit_actions($commit, $commit_actions, $format = 'html') {
   if (empty($commit_actions)) {
Index: versioncontrol_fakevcs/versioncontrol_fakevcs.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/versioncontrol/versioncontrol_fakevcs/versioncontrol_fakevcs.module,v
retrieving revision 1.37
diff -u -r1.37 versioncontrol_fakevcs.module
--- versioncontrol_fakevcs/versioncontrol_fakevcs.module	2 Nov 2007 13:39:12 -0000	1.37
+++ versioncontrol_fakevcs/versioncontrol_fakevcs.module	10 Dec 2007 16:28:14 -0000
@@ -389,6 +389,97 @@
 }
 
 /**
+ * Implementation of [versioncontrol_backend]_get_commit_statistics():
+ * Retrieve general statistics about what happened in a single commit. For more granular
+ * details about what happened in a single commit, use versioncontrol_get_commit_actions.
+ *
+ * @param $commit
+ *   The commit to retrieve statistics about
+ *
+ * @return
+ *  A structured array containing general statistics about this commit. The array will consist
+ *  of elements with the following keys:
+ *
+ *   - 'lines_added': Total number of lines added during this commit
+ *   - 'lines_removed': Total number of lines removed during this commit
+ *   - 'action_count': Total number of actions within this commit
+ *   - 'per_action_statistics': An array containing statistics on individual actions. Array keys are
+ *        the current/new paths (just as with versioncontrol_get_commit_actions). The corresponding
+ *        array values are again structured arrays and consist of elements with the following keys:
+ *   
+ *   - 'lines_added': Number of lines added in this action
+ *   - 'lines_removed': Number of lines removed in this action
+ */
+function versioncontrol_fakevcs_get_commit_statistics($commit, $commit_actions = NULL) {
+  // Assuming $commit is a single commit array that looks like this:
+  $commit = array(
+    // The commit id, a simple running number. Doesn't have any specific
+    // meaning, but is necessary for indexing and joining tables.
+    'commit_id' => 2345,
+    // The repository that was affected by this commit.
+    'repository' => $affected_repository,
+    // The time when the commit was executed, in Unix timestamp format.
+    'date' => time(),
+    // User id of the committer's Drupal user account.
+    // 0 if no corresponding account exists.
+    'uid' => $user->uid,
+    // The committer's username known to the repository itself. In most cases
+    // this will probably be the name of the committer's Unix user account.
+    'username' => 'jpetso',
+    // The deepest-level directory in the repository that is common to
+    // all the changed items in this commit.
+    'directory' => '/',
+    // The commit message, which is expected to span one or more lines.
+    'message' => 'All kinds of demonstrative changes.',
+    // The revision identifier of the commit, in the VCS's proprietary format -
+    // running number, SHA-1 hash, or whatever. If there is no single revision
+    // identifier for the whole commit (which should only be the case for CVS)
+    // then the value for this key is set to NULL.
+    'revision' => '404', // for this commit, let's assume this is an SVN repository
+  );
+  
+  return array(
+    'lines_added' => 30, // 15 + 5 + 7 + 3
+    'lines_removed' => 20, // 3 + 17
+    'action_count' => 8,
+    'per_action_statistics' => array(
+      '/trunk/contributions/modules/versioncontrol/versioncontrol.module' => array(
+        'lines_added' => 15,
+        'lines_removed' => 0,
+      ),
+      '/trunk/contributions/modules/versioncontrol/versioncontrol.install' => array(
+        'lines_added' => 5,
+        'lines_removed' => 3,
+      ),
+      '/branches/sandbox/jpetso/versioncontrol-notes.txt' => array(
+        'lines_added' => 0,
+        'lines_removed' => 17,
+      ),
+      '/trunk/contributions/modules/versioncontrol/versioncontrol.info' => array(
+        'lines_added' => 0,
+        'lines_removed' => 0,
+      ),
+      '/trunk/contributions/modules/versioncontrol/README.txt' => array(
+        'lines_added' => 7,
+        'lines_removed' => 0,
+      ),
+      '/trunk/contributions/modules/versioncontrol/versioncontrol_fakevcs/versioncontrol_fakevcs.module' => array(
+        'lines_added' => 0,
+        'lines_removed' => 0,
+      ),
+      '/branches/5.x-1.x/contributions/modules/cvslog' => array(
+        'lines_added' => 3,
+        'lines_removed' => 0,
+      ),
+      '/trunk/contributions/modules/versioncontrol/versioncontrol_fakevcs' => array(
+        'lines_added' => 0,
+        'lines_removed' => 0,
+      ),
+    ),
+  );
+}
+
+/**
  * Implementation of [versioncontrol_backend]_get_directory_item():
  * Retrieve the item of the deepest-level directory in the repository that is
  * common to all the changed/branched/tagged items in a commit, branch or
