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 > > > drush > > > > > > > > Index: drush_pm/drush_pm.inc =================================================================== RCS file: drush_pm/drush_pm.inc diff -N drush_pm/drush_pm.inc 0a1,207 > > /** > * 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; > }