? drush_pm
? drush_pm_cvs
? drush_pm_svn
? drush_pm_wget
? drush_simpletest
? drush_sql
? drush_tools
? drushrc.php
? drushrc.phpe
? example.drushrc.phpe
? services
? commands/alias
? commands/site
? commands/pm/handler
? includes/table.inc
Index: drush.php
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/drush/drush.php,v
retrieving revision 1.75
diff -u -p -r1.75 drush.php
--- drush.php	27 Oct 2009 23:59:37 -0000	1.75
+++ drush.php	2 Nov 2009 19:46:23 -0000
@@ -64,12 +64,14 @@ function drush_verify_cli() {
  */
 function drush_main() {
   $phases = _drush_bootstrap_phases();
-
+  $completed_phases = array();
+  
   $return = '';
   $command_found = FALSE;
 
   foreach ($phases as $phase) {
     if (drush_bootstrap($phase)) {
+      $completed_phases[$phase] = TRUE;
       $command = drush_parse_command();
       
       // Process a remote command if 'remote-host' option is set.
@@ -79,7 +81,7 @@ function drush_main() {
       }
 
       if (is_array($command)) {
-        if ($command['bootstrap'] == $phase && empty($command['bootstrap_errors'])) {
+        if (array_key_exists($command['bootstrap'], $completed_phases) && empty($command['bootstrap_errors'])) {
           drush_log(dt("Found command: !command", array('!command' => $command['command'])), 'bootstrap');
           $command_found = TRUE;
           // Dispatch the command(s).
Index: commands/core/sitealias.drush.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/drush/commands/core/sitealias.drush.inc,v
retrieving revision 1.2
diff -u -p -r1.2 sitealias.drush.inc
--- commands/core/sitealias.drush.inc	27 Oct 2009 23:59:38 -0000	1.2
+++ commands/core/sitealias.drush.inc	2 Nov 2009 19:46:23 -0000
@@ -24,12 +24,13 @@ function sitealias_drush_command() {
       'site' => 'Site specification alias to print',
     ),
     'options' => array(
-      '--full' => 'Print the full alias record for each site',
-      '--long' => 'Print the long-form site specification for each site',
-      '--short' => 'Print only the site alias name (default)',
-      '--db' => 'Include the databases structure in the full alias record',
-      '--db-url' => 'Include the short-form db-url in the full alias record',
-      '--no-db' => 'Do not include the database record in the full alias record (default)',
+      '--full' => 'Print the full alias record for each site.',
+      '--long' => 'Print the long-form site specification for each site.',
+      '--short' => 'Print only the site alias name (default).',
+      '--with-db' => 'Include the databases structure in the full alias record.',
+      '--with-db-url' => 'Include the short-form db-url in the full alias record.',
+      '--no-db' => 'Do not include the database record in the full alias record (default).',
+      '--with-optional' => 'Include optional default items.',
     ),
     'aliases' => array('sa'),
     'examples' => array(
@@ -180,13 +181,19 @@ function drush_sitealias_get_site_specif
 function _drush_sitealias_print_record($site_alias) {
   $output_db = drush_get_option('with-db');
   $output_db_url = drush_get_option('with-db-url');
-
+  $output_optional_items = drush_get_option('with-optional');
+  
   // Get the alias record for the specified site alias.
   // If the user wants database information included in
   // the record, then try to fetch that info from the
   // remote site.
   $alias_record = drush_sitealias_get_record($site_alias, isset($output_db) | isset($output_db_url));
   
+  // Include the optional items, if requested
+  if ($output_optional_items) {
+    _drush_sitealias_add_transient_defaults($alias_record);
+  }
+  
   // If the user specified --with-db-url, then leave the
   // 'db-url' entry in the alias record (unless it is not
   // set, in which case we will leave the 'databases' record instead).
Index: includes/environment.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/drush/includes/environment.inc,v
retrieving revision 1.50
diff -u -p -r1.50 environment.inc
--- includes/environment.inc	30 Oct 2009 21:12:21 -0000	1.50
+++ includes/environment.inc	2 Nov 2009 19:46:23 -0000
@@ -527,7 +527,7 @@ function _drush_bootstrap_drupal_site_va
   $uri = 'http://'. $current;
 
   $drush_uri = drush_bootstrap_value('drush_uri', drush_get_option(array('l', 'uri'), $uri));
-
+  
   // Fake the necessary HTTP headers that Drupal needs:
   if ($drush_uri) {
     $drupal_base_url = parse_url($drush_uri);
@@ -555,26 +555,24 @@ function _drush_bootstrap_drupal_site_va
   $_SERVER['REQUEST_METHOD']  = NULL;
   $_SERVER['SERVER_SOFTWARE'] = NULL;
   $_SERVER['HTTP_USER_AGENT'] = NULL;
-  
+
   $site = drush_bootstrap_value('site', $_SERVER['HTTP_HOST']);
- 
-  $conf_path = drush_bootstrap_value('conf_path', conf_path());
+  
+  $conf_path = drush_bootstrap_value('conf_path', conf_path(TRUE, TRUE));
   $conf_file = "./$conf_path/settings.php";
   if (!file_exists($conf_file)) {
     return drush_bootstrap_error('DRUPAL_SITE_SETTINGS_NOT_FOUND', dt("Could not find a Drupal settings.php file at !file.",
        array('!file' => $conf_file)));
   }
-
+ 
   return TRUE;
 }
 
 /**
- * Initialize a site on the Drupal root.
- *
- * We now set various contexts that we determined and confirmed to be valid.
- * Additionaly we load an optional drushrc.php file in the site directory.
+ * Called by _drush_bootstrap_drupal_site to do the main work
+ * of the drush srupal site bootstrap.
  */
-function _drush_bootstrap_drupal_site() {
+function _drush_bootstrap_do_drupal_site() {
   $drush_uri = drush_set_context('DRUSH_URI', drush_bootstrap_value('drush_uri')); 
   $site = drush_set_context('DRUSH_DRUPAL_SITE', drush_bootstrap_value('site'));
   $conf_path = drush_set_context('DRUSH_DRUPAL_SITE_ROOT', drush_bootstrap_value('conf_path'));
@@ -585,6 +583,56 @@ function _drush_bootstrap_drupal_site() 
   drush_log(dt("Initialized Drupal site !site at !site_root", array('!site' => $site, '!site_root' => $conf_path)));
   drush_load_config('site');
 }
+ 
+/**
+ * Initialize a site on the Drupal root.
+ *
+ * We now set various contexts that we determined and confirmed to be valid.
+ * Additionaly we load an optional drushrc.php file in the site directory.
+ */
+function _drush_bootstrap_drupal_site() {
+  _drush_bootstrap_do_drupal_site();
+  _drush_bootstrap_redo_drupal_site();
+}
+
+/**
+ * Re-do the drupal site bootstrap (and possibly the
+ * drupal root bootstrap) if a site alias was processed
+ * after the site bootstrap phase completed.  This will
+ * happen when processing "drush sitealias command" for
+ * a site alias defined in a drushrc.php file in the
+ * default site's drush configuration directory.
+ */
+function _drush_bootstrap_redo_drupal_site() {
+  // If drush_load_config defined a site alias that did not
+  // exist before, then sitealias check arg might now match
+  // against one of those aliases.
+  if (drush_sitealias_check_arg() === TRUE) {
+    $remote_host = drush_get_option('remote-host');
+    if (!isset($remote_host)) {         
+      // Check to see if the drupal root changed.
+      $sitealias_drupal_root = drush_get_option(array('r', 'root'));
+      if (($sitealias_drupal_root != null) && (DRUPAL_ROOT != $sitealias_drupal_root)) {
+	// We cannot simply call _drush_bootstrap_drupal_root_validate()
+	// and _drush_bootstrap_drupal_root() again, because these
+	// functions include files from the Drupal installation, and
+	// including the same file twice would cause PHP errors.
+        // we cannot return drush_bootstrap_error("DRUSH_DRUPAL_REDO_BOOTSTRAP_ERROR")
+	// because we are not called from _validate.
+	drush_print(dt("Error: cannot use a site alias from a Drush config file located in a Drupal site folder unless it is inside the same Drupal root.  To define site aliases for sites with alternate drupal roots, use \$HOME/.drushrc.php, or the drushrc.php file at the Drush installation directory."));
+	exit(1);
+      }
+
+      // If we set an alias, then we need to bootstrap the
+      // drupal site once again.  It is possible to re-bootstrap
+      // the site at this point because settings.php has not
+      // been included yet.
+      drush_log(dt("re-bootstrap drupal site"));
+      _drush_bootstrap_drupal_site_validate();
+      _drush_bootstrap_do_drupal_site();
+    }
+  }
+}
 
 /**
  * Initialize and load the Drupal configuration files.
Index: includes/sitealias.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/drush/includes/sitealias.inc,v
retrieving revision 1.3
diff -u -p -r1.3 sitealias.inc
--- includes/sitealias.inc	28 Oct 2009 11:57:56 -0000	1.3
+++ includes/sitealias.inc	2 Nov 2009 19:46:23 -0000
@@ -16,9 +16,7 @@ function drush_sitealias_check_arg() {
   if (_drush_sitealias_set_context_by_name($args[0])) {
     array_shift($args);
     // We only need to expand the site specification
-    // once, then we are done.  (Should we set a flag indicating
-    // that we already did this?  Otherwise 'drush alias1 alias2 command'
-    // would behave strangely.)
+    // once, then we are done.
     drush_set_arguments($args);
     return TRUE;
   }
@@ -189,7 +187,12 @@ function _drush_sitealias_add_static_def
 function _drush_sitealias_add_transient_defaults(&$alias_record) {
   if (isset($alias_record['path-aliases'])) {
     if (!array_key_exists('!drush', $alias_record['path-aliases'])) {
-      $alias_record['path-aliases']['!drush'] = dirname(DRUSH_COMMAND);
+      if (array_key_exists('!drush-script', $alias_record['path-aliases'])) {
+        $alias_record['path-aliases']['!drush'] = dirname($alias_record['path-aliases']['!drush-script']);
+      }
+      else {
+        $alias_record['path-aliases']['!drush'] = dirname(DRUSH_COMMAND);
+      }
     }
   }
 }
