Index: drush_pm/drush_pm.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/drush/drush_pm/drush_pm.module,v
retrieving revision 1.15
diff -r1.15 drush_pm.module
51a52,67
> 
>   $items['pm enable'] = array(
>     'callback' => 'drush_pm_enable_module',
>     'description' => 'Enables the given modules'
>   ); 
> 
>   $items['pm disable'] = array(
>     'callback' => 'drush_pm_disable_module',
>     'description' => 'Disable the given modules'
>   ); 
> 
>   $items['pm dot'] = array(
>     'callback' => 'drush_pm_dot',
>     'description' => 'Generates a dot file of all modules'
>   ); 
>   
62a79,131
> function drush_pm_dot() {
>   require_once "drush_pm.inc";
>   global $_drush_pm_module_info;
>   _drush_pm_get_modules_info();
> 
>   
>   _drush_pm_generate_dot($_drush_pm_module_info);
> }
> /**
>  * enables the given modules
>  * 
>  * If all modules are present the are enabled
>  */
> function drush_pm_enable_module() {
>   $modules = func_get_args();
> 
>   if (empty($modules)) {
>     drush_die(t("No modules specified.\n\nRun drush help pm install for more information."));
>   }
> 
>   require_once "drush_pm.inc";
> 
>   $result= _drush_pm_get_module_list( $modules);
>   
>   drush_verbose(t("The following modules will be enabled: '!modules'" , array( "!modules"=> implode( ", ", $result))));
> 
>   if( !DRUSH_SIMULATE){
>     drush_die(t("Enabling modules needs some more testing."));
>     //module_enable( $result);
>   }
> }
> 
> function drush_pm_disable_module() {
>   $modules = func_get_args();
> 
>   if (empty($modules)) {
>     drush_die(t("No modules specified.\n\nRun drush help pm install for more information."));
>   }
> 
>   require_once "drush_pm.inc";
> 
>   $result= _drush_pm_get_module_list( $modules);
>   $result= array_reverse( $result);
>   drush_verbose(t("The following modules will be disabled: '!modules'" , array( "!modules"=> implode( ", ", $result))));
> 
>   if( !DRUSH_SIMULATE){
>     drush_die(t("Disabling modules needs some more testing."));
>     // TODO: doing an enable uc_ups and then a disable makes troubles
>     // This is probably due to the forward direction of the graph.
>     //module_disable( $result);
>   }
> }
> 
Index: .project
===================================================================
RCS file: .project
diff -N .project
0a1,11
> <?xml version="1.0" encoding="UTF-8"?>
> <projectDescription>
> 	<name>drush</name>
> 	<comment></comment>
> 	<projects>
> 	</projects>
> 	<buildSpec>
> 	</buildSpec>
> 	<natures>
> 	</natures>
> </projectDescription>
Index: drush_pm/drush_pm.inc
===================================================================
RCS file: drush_pm/drush_pm.inc
diff -N drush_pm/drush_pm.inc
0a1,207
> <?php
> 
> /**
>  * Get all folder from the given directory
>  * 
>  * from php.net
>  * - getRecursiveFolderList
>  */
> function _drush_pm_get_recursive_folder_list($curDir, $currentA=false) {                   
>   $dirs = glob($curDir . '/*', GLOB_ONLYDIR);    
>   $cur = 0;
>   foreach($dirs as $dir) {
>     $currentA[$cur]['path'] = $dir;
>     $currentA[$cur] = _drush_pm_get_recursive_folder_list($dir, $currentA[$cur]);
>     ++$cur;
>   }
>   return $currentA;
> }
> 
> /**
>  * collect info from each *.info file found
>  * 
>  * This is a callback function
>  */
> function _drush_pm_get_module_info($item, $key){
>   global $_drush_pm_module_info;
>   foreach( glob( $item .'/*.info') as $file){
>     $base_name= basename( $file, '.info');
> 
>     $module_info[ $base_name ]['count']++;
> 
>     $lines= explode( "\n", file_get_contents( $file));
>     $_drush_pm_module_info[ $base_name]['name']= _drush_pm_get_named_value( 'name', $lines);
>     $_drush_pm_module_info[ $base_name]['package']= _drush_pm_get_named_value( 'package', $lines);
>     $_drush_pm_module_info[ $base_name]['description']= _drush_pm_get_named_value( 'description', $lines);
>     
>     $dependencies = _drush_pm_get_named_value( 'dependencies', $lines);
>     if( count($dependencies)){
>       // one line should do ... get first
>       $deps= array_pop(explode("=", $dependencies));
>       foreach( explode(" ", $deps) as $depends){
>         if( strlen( $depends)>0){
>           // NOTE : some modules have faulty dependencies
>           // This makes a corrupt dot file.
>           $_drush_pm_module_info[ $base_name]['depends'][]=$depends;
>         }
>       }
>     }
>   }
> }
> 
> function _drush_pm_get_named_value( $name, $lines){
>   $result = preg_grep("/$name/", $lines);
>   if( count( $result)){
>     // get first matching line only
>     $result = array_shift( $result);
>     // return only value
>     return array_pop(explode("=",$result));
>   }
>   return;
> }
> 
> function _drush_pm_generate_dot( $modules_info){
>   // print_r( $modules_info);
>   echo "digraph {\n";
>   
>   foreach( $modules_info as $key=>$value){
>     if( isset( $value['depends'])){
>       foreach( $value['depends'] as $dep){
>         echo "  \"$key\" -> \"$dep\" \n";
>       }
>     } else {
>       echo "  \"$key\" \n";
>     }
>   }
>   echo "}";
> }
> 
> function _drush_pm_get_modules_info(){
>   // storage for all module info
>   global $_drush_pm_module_info;
>   $_drush_pm_module_info= array();
> 
>   foreach( $paths= _drush_pm_get_module_paths() as $path){
>     $tree = _drush_pm_get_recursive_folder_list( $path);
>     array_walk_recursive( $tree, '_drush_pm_get_module_info');
>   }
>   
>   
>   $result= db_query("SELECT name, status FROM {system} WHERE type = 'module'");
>   while( $module= db_fetch_object($result)){
>   	$_drush_pm_module_info[$module->name]['status']= $module->status;
>   }
> }
> 
> function _drush_pm_get_module_list( $modules){
>   global $_drush_pm_module_info;
>   _drush_pm_get_modules_info();
>   //print_r( $_drush_pm_module_info);
>   
>   $missing_modules= array();
>   foreach( $modules as $module){
>     if( !array_key_exists( $module, $_drush_pm_module_info)){
>       $missing_modules[]= $module;
>     }
>   }
>   
>   if( count( $missing_modules)){
>     drush_die(t("The following modules where not found. '!modules'" , array( "!modules"=> implode( ", ", $missing_modules))));
>   }
>   
>   // now fill in the list
>   $modules_to_enable = array();
>   foreach( $modules as $module){
>     // check all modules asked for
>     if( array_key_exists( $module, $_drush_pm_module_info)){
>       $modules_to_enable[$module]= $_drush_pm_module_info[$module];
>     }
>   }
> 
>   // add more dependencies
>   $more= TRUE;
>   while( $more){
>     $more= FALSE;
>     foreach( $modules_to_enable as $key=>$module){
>       // add all depends to the list
>       foreach( $module['depends'] as $depend){
>         if( !array_key_exists( $depend, $modules_to_enable)){
>           $modules_to_enable[$depend]= $_drush_pm_module_info[$depend];
> 		  $more= TRUE;
>         }
>       }
>     }
>   }  
>   
>   // build graph
>   $graph= array();
>   foreach($modules_to_enable as $key => $module){
>     foreach( $module['depends'] as $depend){
>       $graph[$key][$depend]++;
>     }
>   }
>   $result= _drush_pm_graph_tsl( $graph);
>   // merge independant modules into the result.
>   return array_merge( $result, $modules);
> 
> }
> 
> function _drush_pm_get_module_paths(){
>   $paths = array();
>   
>   if (DRUSH_URI) {
>     $path = conf_path();
>     $paths['site'] = DRUSH_DRUPAL_ROOT .'/'. $path .'/modules/';
>   }
>   
>   if (file_exists(DRUSH_DRUPAL_ROOT .'/sites/all/modules/')) {
>     $paths['all'] = DRUSH_DRUPAL_ROOT .'/sites/all/modules/';
>   }
>   
>   $paths['core'] = DRUSH_DRUPAL_ROOT .'/modules/';
>   
>   return $paths;
> }
> 
> /**
>  * Generares a topological sorted list
>  * 
>  * @param $graph
>  *   the graph to get a TSL
>  */
> function _drush_pm_graph_tsl( $graph){
>   $result= array();
>   
>   $reset = TRUE;
>   foreach( $graph as $key=>$value){
>     $result= _drush_pm_graph_df($graph, $key, $reset);
>     $reset= FALSE;
>   }
> 
>   return $result;
> }
> 
> /**
>  * do a depth first search
>  * 
>  * Each node is visited
>  */
> function _drush_pm_graph_df( $graph, $node, $reset=false){
>   static $visited;
>   static $result;
>   
>   if( !isset( $visited) || $reset){
>     $visited= array();
>     $result= array();
>   }
>   
>   if( !isset($visited[$node])){
>     $visited[$node]=TRUE;
>     foreach( $graph[$node] as $key=> $_node){
>       _drush_pm_graph_df( $graph, $key);
>     }
>     array_push($result, $node);
>   }
>   
>   return $result;
> }
