drush_invoke automatically generates callbacks based on the command that is being run, but it is possible to step over drupal's own API.

In Hosting, I have several existing Drupal modules which have their own *.drush.inc files, but in these same modules i also have implementations of Drupal's hook_update. When I try to use drush.php update on the site with the hosting module, it attempts to run the drupal hook_update as if it was part of the drush command. This of course results in a big mess.

The solution to this is to make sure drush commands are in their own namespace, and can't interfere with Drupal's API. My first attempt was to have the format : $commandfile_drush_$command , but i soon realized this caused drush to venture into it's own namespace. For instance, the 'core_drush_help' implementation was thought to be an extension to the drush.php help function.

Now I am working to change the format to : 'drush_$commandfile_$command' , which will ensure that drush_invoke doesn't step over any other namespaces.

I'll post a patch shortly.

CommentFileSizeAuthor
#2 invoke.drush_.inc_.txt1.98 KBadrian

Comments

adrian’s picture

I wrote a drush command which uses the API itself and reflection to find all the possibly afflicted functions, and replace them using sed.
I also did function_exists checks to make sure i'm not messing up any other namespaces. The script also does php -l on the replaced files.

To pick up the new function names, I am going to add a new parameter to drush_commandfile_implements and drush_command_hook called namespace, which defaults to null, but if set, will prepend the namespace to the module name.

Heres the changes across drush, provision and hosting (all the commands I have), but the script should work for any command file (i'll add it to the issue when i've finished it).

Filename: drush/commands/pm/pm.drush.inc
pm_enable => drush_pm_enable
pm_disable => drush_pm_disable
pm_uninstall => drush_pm_uninstall
pm_refresh => drush_pm_refresh
pm_update => drush_pm_update
pm_post_update => drush_pm_post_update
pm_info => drush_pm_info
pm_dl => drush_pm_dl

Filename: drush/commands/pm/updatecode.inc
pm_updatecode => drush_pm_updatecode

Filename: drush/commands/core/core.drush.inc
core_help => drush_core_help
core_cron => drush_core_cron
core_updatedb => drush_core_updatedb
core_status => drush_core_status
core_script => drush_core_script
core_cache_clear => drush_core_cache_clear
core_watchdog_show => drush_core_watchdog_show
core_watchdog_delete => drush_core_watchdog_delete
core_sync => drush_core_sync
core_eval => drush_core_eval

Filename: HEAD/hosting/hosting_help.inc
hosting_help => drush_hosting_help

Filename: HEAD/provision/platform/install.provision.inc
provision_drupal_provision_install_validate => drush_provision_drupal_provision_install_validate
provision_drupal_pre_provision_install => drush_provision_drupal_pre_provision_install
provision_drupal_provision_install => drush_provision_drupal_provision_install
provision_drupal_provision_install_rollback => drush_provision_drupal_provision_install_rollback
provision_drupal_post_provision_install => drush_provision_drupal_post_provision_install

Filename: HEAD/provision/db_server/install.provision.inc
provision_mysql_provision_install_validate => drush_provision_mysql_provision_install_validate
provision_mysql_pre_provision_install => drush_provision_mysql_pre_provision_install
provision_mysql_pre_provision_install_rollback => drush_provision_mysql_pre_provision_install_rollback

Filename: HEAD/provision/web_server/install.provision.inc
provision_apache_pre_provision_install => drush_provision_apache_pre_provision_install
provision_apache_post_provision_install => drush_provision_apache_post_provision_install

Filename: HEAD/provision/dns_server/install.provision.inc
provision_dns_pre_provision_install => drush_provision_dns_pre_provision_install
provision_dns_pre_provision_install_rollback => drush_provision_dns_pre_provision_install_rollback
provision_dns_post_provision_install => drush_provision_dns_post_provision_install

Filename: HEAD/provision/platform/import.provision.inc
provision_drupal_provision_import_validate => drush_provision_drupal_provision_import_validate
provision_drupal_provision_import => drush_provision_drupal_provision_import

Filename: HEAD/provision/platform/backup.provision.inc
provision_drupal_provision_backup_validate => drush_provision_drupal_provision_backup_validate
provision_drupal_provision_backup => drush_provision_drupal_provision_backup
provision_drupal_post_provision_backup => drush_provision_drupal_post_provision_backup

Filename: HEAD/provision/db_server/backup.provision.inc
provision_mysql_pre_provision_backup => drush_provision_mysql_pre_provision_backup
provision_mysql_pre_provision_backup_rollback => drush_provision_mysql_pre_provision_backup_rollback
provision_mysql_post_provision_backup => drush_provision_mysql_post_provision_backup

Filename: HEAD/provision/platform/enable.provision.inc
provision_drupal_provision_enable_validate => drush_provision_drupal_provision_enable_validate
provision_drupal_post_provision_enable => drush_provision_drupal_post_provision_enable

Filename: HEAD/provision/web_server/enable.provision.inc
provision_apache_provision_enable => drush_provision_apache_provision_enable

Filename: HEAD/provision/platform/disable.provision.inc
provision_drupal_provision_disable_validate => drush_provision_drupal_provision_disable_validate
provision_drupal_pre_provision_disable => drush_provision_drupal_pre_provision_disable
provision_drupal_post_provision_disable => drush_provision_drupal_post_provision_disable

Filename: HEAD/provision/web_server/disable.provision.inc
provision_apache_provision_disable => drush_provision_apache_provision_disable

Filename: HEAD/provision/platform/verify.provision.inc
provision_drupal_provision_verify_validate => drush_provision_drupal_provision_verify_validate
provision_drupal_provision_verify => drush_provision_drupal_provision_verify
provision_drupal_post_provision_verify => drush_provision_drupal_post_provision_verify

Filename: HEAD/provision/db_server/verify.provision.inc
provision_mysql_provision_verify_validate => drush_provision_mysql_provision_verify_validate
provision_mysql_provision_verify => drush_provision_mysql_provision_verify
provision_mysql_post_provision_verify => drush_provision_mysql_post_provision_verify

Filename: HEAD/provision/web_server/verify.provision.inc
provision_apache_provision_verify => drush_provision_apache_provision_verify
provision_apache_post_provision_verify => drush_provision_apache_post_provision_verify

Filename: HEAD/provision/platform/restore.provision.inc
provision_drupal_provision_restore_validate => drush_provision_drupal_provision_restore_validate
provision_drupal_pre_provision_restore => drush_provision_drupal_pre_provision_restore
provision_drupal_pre_provision_restore_rollback => drush_provision_drupal_pre_provision_restore_rollback
provision_drupal_provision_restore => drush_provision_drupal_provision_restore
provision_drupal_provision_restore_rollback => drush_provision_drupal_provision_restore_rollback
provision_drupal_post_provision_restore => drush_provision_drupal_post_provision_restore

Filename: HEAD/provision/db_server/restore.provision.inc
provision_mysql_provision_restore_validate => drush_provision_mysql_provision_restore_validate
provision_mysql_pre_provision_restore => drush_provision_mysql_pre_provision_restore
provision_mysql_pre_provision_restore_rollback => drush_provision_mysql_pre_provision_restore_rollback
provision_mysql_provision_restore => drush_provision_mysql_provision_restore
provision_mysql_post_provision_restore => drush_provision_mysql_post_provision_restore

Filename: HEAD/provision/web_server/restore.provision.inc
provision_apache_pre_provision_restore => drush_provision_apache_pre_provision_restore
provision_apache_pre_provision_restore_rollback => drush_provision_apache_pre_provision_restore_rollback
provision_apache_post_provision_restore => drush_provision_apache_post_provision_restore
provision_apache_post_provision_restore_rollback => drush_provision_apache_post_provision_restore_rollback

Filename: HEAD/provision/dns_server/restore.provision.inc
provision_dns_pre_provision_restore => drush_provision_dns_pre_provision_restore
provision_dns_pre_provision_restore_rollback => drush_provision_dns_pre_provision_restore_rollback
provision_dns_post_provision_restore => drush_provision_dns_post_provision_restore
provision_dns_post_provision_restore_rollback => drush_provision_dns_post_provision_restore_rollback

Filename: HEAD/provision/platform/deploy.provision.inc
provision_drupal_provision_deploy_validate => drush_provision_drupal_provision_deploy_validate
provision_drupal_pre_provision_deploy => drush_provision_drupal_pre_provision_deploy
provision_drupal_pre_provision_deploy_rollback => drush_provision_drupal_pre_provision_deploy_rollback
provision_drupal_provision_deploy => drush_provision_drupal_provision_deploy
provision_drupal_post_provision_deploy => drush_provision_drupal_post_provision_deploy

Filename: HEAD/provision/db_server/deploy.provision.inc
provision_mysql_provision_deploy_validate => drush_provision_mysql_provision_deploy_validate
provision_mysql_provision_deploy => drush_provision_mysql_provision_deploy
provision_mysql_provision_deploy_rollback => drush_provision_mysql_provision_deploy_rollback
provision_mysql_post_provision_deploy => drush_provision_mysql_post_provision_deploy

Filename: HEAD/provision/web_server/deploy.provision.inc
provision_apache_post_provision_deploy => drush_provision_apache_post_provision_deploy
provision_apache_post_provision_deploy_rollback => drush_provision_apache_post_provision_deploy_rollback

Filename: HEAD/provision/platform/migrate.provision.inc
provision_drupal_provision_migrate_validate => drush_provision_drupal_provision_migrate_validate
provision_drupal_pre_provision_migrate => drush_provision_drupal_pre_provision_migrate
provision_drupal_pre_provision_migrate_rollback => drush_provision_drupal_pre_provision_migrate_rollback
provision_drupal_provision_migrate => drush_provision_drupal_provision_migrate
provision_drupal_post_provision_migrate => drush_provision_drupal_post_provision_migrate

Filename: HEAD/provision/platform/delete.provision.inc
provision_drupal_provision_delete_validate => drush_provision_drupal_provision_delete_validate
provision_drupal_pre_provision_delete => drush_provision_drupal_pre_provision_delete
provision_drupal_provision_delete => drush_provision_drupal_provision_delete

Filename: HEAD/provision/db_server/delete.provision.inc
provision_mysql_provision_delete_validate => drush_provision_mysql_provision_delete_validate
provision_mysql_provision_delete => drush_provision_mysql_provision_delete

Filename: HEAD/provision/web_server/delete.provision.inc
provision_apache_provision_delete => drush_provision_apache_provision_delete

Filename: HEAD/provision/dns_server/delete.provision.inc
provision_dns_provision_delete => drush_provision_dns_provision_delete

Filename: HEAD/hosting/task.hosting.inc
hosting_hosting_task_validate => drush_hosting_hosting_task_validate
hosting_hosting_task => drush_hosting_hosting_task
hosting_hosting_task_rollback => drush_hosting_hosting_task_rollback
hosting_post_hosting_task => drush_hosting_post_hosting_task

Filename: HEAD/hosting/web_server/hosting_web_server.drush.inc
hosting_web_server_pre_hosting_task => drush_hosting_web_server_pre_hosting_task

Filename: HEAD/hosting/site/hosting_site.drush.inc
hosting_site_pre_hosting_task => drush_hosting_site_pre_hosting_task

Filename: HEAD/hosting/platform/hosting_platform.drush.inc
hosting_platform_pre_hosting_task => drush_hosting_platform_pre_hosting_task

Filename: HEAD/hosting/package/hosting_package.drush.inc
hosting_package_pre_hosting_task => drush_hosting_package_pre_hosting_task

Filename: HEAD/hosting/migrate/hosting_migrate.drush.inc
hosting_migrate_pre_hosting_task => drush_hosting_migrate_pre_hosting_task

Filename: HEAD/hosting/db_server/hosting_db_server.drush.inc
hosting_db_server_pre_hosting_task => drush_hosting_db_server_pre_hosting_task

Filename: HEAD/hosting/client/hosting_client.drush.inc
hosting_client_pre_hosting_task => drush_hosting_client_pre_hosting_task

Filename: HEAD/hosting/alias/hosting_alias.drush.inc
hosting_alias_pre_hosting_task => drush_hosting_alias_pre_hosting_task
adrian’s picture

Status: Active » Fixed
StatusFileSize
new1.98 KB

fixed in http://drupal.org/cvs?commit=208468

Attached is the drush commandfile to help with conversion. It needs to bootstrap to drupal_full, so you should run it on an active site / drupal dir.
Copy the file to ~/.drush/invoke.drush.inc

# generate the list of output
drush.php invokefind  

if you find any files you want to exclude, it accepts the --exclude option, which is a comma separated list of basenames , ie:

drush.php invokefind   --exclude='hosting_help.inc'

Once you're happy, the --pipe option will generate a shell script for you :

drush.php invokefind   --exclude='hosting_help.inc'  -p > ~/invoke.sh ;
chmod +x ~/invoke.sh;
~/invoke.sh;

Of course your mileage may vary, but this worked for hosting and provision (which is a _lot_ of drush code).

moshe weitzman’s picture

Thats a pretty nifty use of drush and drush_print_pipe() and sed. wow - nice.

adrian’s picture

Yeah, i sure as hell wasn't going to edit it all by hand.

the pattern should be re-usable too.

Status: Fixed » Closed (fixed)

Automatically closed -- issue fixed for 2 weeks with no activity.