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	30 Jul 2008 18:03:07 -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/system/system.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.admin.inc,v
retrieving revision 1.82
diff -u -r1.82 system.admin.inc
--- modules/system/system.admin.inc	23 Jul 2008 07:37:06 -0000	1.82
+++ modules/system/system.admin.inc	30 Jul 2008 18:03:07 -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;
@@ -639,8 +639,72 @@
     $extra['enabled'] = (bool) $module->status;
     // If this module has dependencies, add them to the array.
     if (is_array($module->info['dependencies'])) {
-      foreach ($module->info['dependencies'] as $dependency) {
-        if (!isset($files[$dependency])) {
+      foreach ($module->info['dependencies'] as $dependency => $versions) {
+        // 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;
+            }
+          }
+        }
+        
+        if (!$version_check_pass) {
+          sort($versions);
+          $extra['dependencies'][$dependency] = drupal_ucfirst($dependency) . ' ' . implode('/', $versions) . t(' (<span class="admin-missing">missing</span>)');
+          $extra['disabled'] = TRUE;
+        }
+        else if (!isset($files[$dependency])) {
           $extra['dependencies'][$dependency] = drupal_ucfirst($dependency) . t(' (<span class="admin-missing">missing</span>)');
           $extra['disabled'] = TRUE;
         }
@@ -871,7 +935,7 @@
       }
       // If we're not coming from a confirmation form,
       // search dependencies. Otherwise, the user will have already
-      // approved of the depdent modules being enabled.
+      // approved of the dependent modules being enabled.
       if (empty($form_state['storage'])) {
         foreach ($form['modules'][$module['group']][$name]['#dependencies'] as $dependency => $string) {
           if (!isset($dependencies[$name])) {
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	30 Jul 2008 18:03:07 -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: 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	30 Jul 2008 18:03:07 -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: includes/module.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/module.inc,v
retrieving revision 1.121
diff -u -r1.121 module.inc
--- includes/module.inc	23 Jul 2008 07:34:34 -0000	1.121
+++ includes/module.inc	30 Jul 2008 18:03:07 -0000
@@ -160,7 +160,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;
@@ -170,15 +170,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');
@@ -189,7 +189,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	30 Jul 2008 18:03:07 -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;
