Index: modules/system/system.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.admin.inc,v
retrieving revision 1.78
diff -u -r1.78 system.admin.inc
--- modules/system/system.admin.inc	1 Jul 2008 20:36:40 -0000	1.78
+++ modules/system/system.admin.inc	4 Jul 2008 18:22:00 -0000
@@ -577,7 +577,7 @@
     return TRUE;
   }
   // Recursively traverse the dependencies, looking for incompatible modules
-  foreach ($file->info['dependencies'] as $dependency) {
+  foreach ($file->info['dependencies'] as $dependency => $versions) {
     if (isset($files[$dependency]) && _system_is_incompatible($incompatible, $files, $files[$dependency])) {
       $incompatible[$file->name] = TRUE;
       return TRUE;
@@ -671,10 +671,78 @@
     $dependencies = array();
     // Check for missing dependencies.
     if (is_array($file->info['dependencies'])) {
-      foreach ($file->info['dependencies'] as $dependency) {
+      foreach ($file->info['dependencies'] as $dependency => $versions) {
         if (!isset($files[$dependency]) || !$files[$dependency]->status) {
           if (isset($files[$dependency])) {
-            $dependencies[] = $files[$dependency]->info['name'] . t(' (<span class="admin-disabled">disabled</span>)');
+            
+            // Get the version of the module we're currently checking.
+            $module_version = explode('-', $files[$dependency]->info['version']);
+            // Handle versions like 6.x-1.x-dev.
+            if (count($module_version) == 3) {
+              $curr_module_version = $module_version[1];
+            }
+            else if (count($module_version) == 2) {
+              // Handle versions like 6.x-1.2.
+              if (is_numeric($module_version[1])) {
+                $curr_module_version = $module_version[1];
+              }
+              // Handle versions like 6.x-dev.
+              else {
+                $curr_module_version = $module_version[0];
+              }
+            }
+            
+            $module_version_parts = explode('.', $curr_module_version);
+            
+            // Check every version condition.
+            $version_check_pass = FALSE;
+            if (!is_array($versions)) {
+              $versions = array($versions);
+            }
+            foreach ($versions as $version) {
+              // Support 'all' versions
+              if ($version == 'all') {
+                $version_check_pass = TRUE;
+              }
+              else {
+                $version_parts = explode('.', $version);
+                // Support up-to-and-including version, but within same branch.
+                if(preg_match('/\-$/', $version)) {
+                  if ($module_version_parts[0] == $version_parts[0] &&
+                      $module_version_parts[1] <= $version_parts[1]) {
+                    $version_check_pass = TRUE;
+                  }
+                }
+                // Support from-and-after version, but within same branch.
+                else if(preg_match('/\+$/', $version)) {
+                  if ($module_version_parts[0] == $version_parts[0] &&
+                      $module_version_parts[1] >= $version_parts[1]) {
+                    $version_check_pass = TRUE;
+                  }
+                }
+                // Support entire branches.
+                else if(preg_match('/\d+\.x$/', $version)) {
+                  if ($module_version_parts[0] == $version_parts[0]) {
+                    $version_check_pass = TRUE;
+                  }
+                }
+                // Support specific versions.
+                else if ($module_version == $version) {
+                  $version_check_pass = TRUE;
+                }
+              }
+            }
+            
+            // Print out module status.
+            if ($version_check_pass) {
+              $dependencies[] = $files[$dependency]->info['name'] . t(' (<span class="admin-disabled">disabled</span>)');
+              $disabled[] = $filename;
+            }
+            else {
+              $dependencies[] = $files[$dependency]->info['name'] . t(' (<span class="admin-missing">unsupported version</span>)');
+              $disabled[] = $filename;
+              $form['disabled_modules']['#value'][$filename] = FALSE;
+            }
           }
           else {
             $dependencies[] = drupal_ucfirst($dependency) . t(' (<span class="admin-missing">missing</span>)');
@@ -940,7 +1008,7 @@
     foreach ($modules as $name => $module) {
       // If the module is disabled, will be switched on and it has dependencies.
       if (!$module->status && $form_values['status'][$name] && isset($module->info['dependencies'])) {
-        foreach ($module->info['dependencies'] as $dependency) {
+        foreach ($module->info['dependencies'] as $dependency => $versions) {
           if (!$form_values['status'][$dependency] && isset($modules[$dependency])) {
             if (!isset($dependencies[$name])) {
               $dependencies[$name] = array();
Index: modules/translation/translation.info
===================================================================
RCS file: /cvs/drupal/drupal/modules/translation/translation.info,v
retrieving revision 1.3
diff -u -r1.3 translation.info
--- modules/translation/translation.info	6 May 2008 12:18:51 -0000	1.3
+++ modules/translation/translation.info	4 Jul 2008 18:22:00 -0000
@@ -1,7 +1,7 @@
 ; $Id: translation.info,v 1.3 2008/05/06 12:18:51 dries Exp $
 name = Content translation
 description = Allows content to be translated into different languages.
-dependencies[] = locale
+dependencies[locale] = all
 package = Core - optional
 version = VERSION
 core = 7.x
Index: modules/forum/forum.info
===================================================================
RCS file: /cvs/drupal/drupal/modules/forum/forum.info,v
retrieving revision 1.8
diff -u -r1.8 forum.info
--- modules/forum/forum.info	6 May 2008 12:18:47 -0000	1.8
+++ modules/forum/forum.info	4 Jul 2008 18:21:55 -0000
@@ -1,8 +1,8 @@
 ; $Id: forum.info,v 1.8 2008/05/06 12:18:47 dries Exp $
 name = Forum
 description = Enables threaded discussions about general topics.
-dependencies[] = taxonomy
-dependencies[] = comment
+dependencies[taxonomy] = all
+dependencies[comment] = all
 package = Core - optional
 version = VERSION
 core = 7.x
Index: modules/tracker/tracker.info
===================================================================
RCS file: /cvs/drupal/drupal/modules/tracker/tracker.info,v
retrieving revision 1.7
diff -u -r1.7 tracker.info
--- modules/tracker/tracker.info	6 May 2008 12:18:51 -0000	1.7
+++ modules/tracker/tracker.info	4 Jul 2008 18:22:00 -0000
@@ -1,7 +1,7 @@
 ; $Id: tracker.info,v 1.7 2008/05/06 12:18:51 dries Exp $
 name = Tracker
 description = Enables tracking of recent posts for users.
-dependencies[] = comment
+dependencies[comment] = all
 package = Core - optional
 version = VERSION
 core = 7.x
Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.776
diff -u -r1.776 common.inc
--- includes/common.inc	2 Jul 2008 19:36:52 -0000	1.776
+++ includes/common.inc	4 Jul 2008 18:21:52 -0000
@@ -3478,7 +3478,7 @@
       $parent[$last] = $value;
     }
   }
-
+  
   return $info;
 }
 
Index: includes/module.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/module.inc,v
retrieving revision 1.120
diff -u -r1.120 module.inc
--- includes/module.inc	13 May 2008 17:38:42 -0000	1.120
+++ includes/module.inc	4 Jul 2008 18:21:55 -0000
@@ -169,7 +169,7 @@
       // We will modify this object (module A, see doxygen for module A, B, C).
       $file = &$files[$filename];
       if (isset($file->info['dependencies']) && is_array($file->info['dependencies'])) {
-        foreach ($file->info['dependencies'] as $dependency_name) {
+        foreach ($file->info['dependencies'] as $dependency_name => $dependency_versions) {
           // This is a nonexistent module.
           if ($dependency_name == '-circular-' || !isset($files[$dependency_name])) {
             continue;
@@ -179,15 +179,15 @@
           $dependency = $files[$dependency_name];
           if (isset($dependency->info['dependencies']) && is_array($dependency->info['dependencies'])) {
             // Let's find possible C modules.
-            foreach ($dependency->info['dependencies'] as $candidate) {
-              if (array_search($candidate, $file->info['dependencies']) === FALSE) {
+            foreach ($dependency->info['dependencies'] as $candidate => $candidate_versions) {
+              if (!isset($file->info['dependencies'][$candidate])) {
                 // Is this a circular dependency?
                 if ($candidate == $filename) {
                   // As a module name can not contain dashes, this makes
                   // impossible to switch on the module.
                   $candidate = '-circular-';
                   // Do not display the message or add -circular- more than once.
-                  if (array_search($candidate, $file->info['dependencies']) !== FALSE) {
+                  if (isset($file->info['dependencies'][$candidate])) {
                     continue;
                   }
                   drupal_set_message(t('%module is part of a circular dependency. This is not supported and you will not be able to switch it on.', array('%module' => $file->info['name'])), 'error');
@@ -198,7 +198,7 @@
                   // deeper dependencies.
                   $new_dependency = TRUE;
                 }
-                $file->info['dependencies'][] = $candidate;
+                $file->info['dependencies'][$candidate] = $candidate_versions;
               }
             }
           }
Index: includes/install.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/install.inc,v
retrieving revision 1.62
diff -u -r1.62 install.inc
--- includes/install.inc	26 May 2008 17:12:54 -0000	1.62
+++ includes/install.inc	4 Jul 2008 18:21:54 -0000
@@ -368,7 +368,7 @@
     foreach ($module_list as $module => $weight) {
       $file = $files[$module];
       if (isset($file->info['dependencies']) && is_array($file->info['dependencies'])) {
-        foreach ($file->info['dependencies'] as $dependency) {
+        foreach ($file->info['dependencies'] as $dependency => $versions) {
           if (isset($module_list[$dependency]) && $module_list[$module] < $module_list[$dependency] +1) {
             $module_list[$module] = $module_list[$dependency] +1;
             $moved = TRUE;
