You are here

devel.drush8.inc in Devel 8

Same filename and directory in other branches
  1. 8.3 drush/devel.drush8.inc
  2. 8.2 drush/devel.drush8.inc

This file is only used by Drush8. Drush9 discovers its commands via tagged service(s) in devel.services.yml. Also see classes in src/Commands.

File

drush/devel.drush8.inc
View source
<?php

/**
 * @file
 * This file is only used by Drush8. Drush9 discovers its commands via tagged
 * service(s) in devel.services.yml. Also see classes in src/Commands.
 */
use Drupal\Component\Uuid\Php;

/**
 * Implements hook_drush_command().
 */
function devel_drush_command() {
  $items['devel-reinstall'] = array(
    'description' => dt('Uninstall, and Install a list of projects.'),
    'drush dependencies' => array(
      'pm',
    ),
    'arguments' => array(
      'projects' => dt('A space-separated list of project names.'),
    ),
    'allow-additional-options' => array(
      'pm-uninstall',
      'pm-enable',
    ),
    'required-arguments' => 1,
    'aliases' => array(
      'dre',
    ),
  );
  $items['fn-hook'] = array(
    'description' => 'List implementations of a given hook and explore the source of the selected one.',
    'arguments' => array(
      'hook' => 'The name of the hook to explore (e.g. "menu" for hook_menu()).',
    ),
    'examples' => array(
      'fn-hook cron' => 'List implementations of hook_cron().',
    ),
    'allow-additional-options' => array(
      'fn-view',
    ),
    'required-arguments' => 1,
    'aliases' => array(
      'fnh',
      'hook',
    ),
  );
  $items['fn-event'] = array(
    'description' => 'List implementations of a given event and explore source of specified one.',
    'arguments' => array(
      'event' => 'The name of the event to explore. If omitted, a list of events is shown.',
    ),
    'examples' => array(
      'fn-event' => 'Pick a Kernel event, then pick an implementation, and then view its source code.',
      'fn-event kernel.terminate' => 'Pick a terminate subscribers and view its source code.',
    ),
    'allow-additional-options' => array(
      'fn-view',
    ),
    'aliases' => array(
      'fne',
      'event',
    ),
  );
  $items['fn-view'] = array(
    'description' => 'Show the source of specified function or method.',
    'arguments' => array(
      'function' => 'The name of the function or method to view.',
    ),
    'options' => array(
      'pipe' => 'Output just the filename of the function or method',
      'format' => 'Specify how the filename should be printed. Available placeholders are @startline, @endline and @file',
    ),
    'examples' => array(
      'fn-view drupal_set_breadcrumb' => 'View the source code for function "drupal_set_breadcrumb"',
      'vi `drush --pipe fn-view user_access --format=\'+@startline @file\'`' => 'Edit the file that contains the function "user_access"',
      'fn-view NodeController::load' => 'View the source code for method load in the class NodeController',
    ),
    'aliases' => array(
      'fnv',
    ),
    'required-arguments' => 1,
  );
  $items['devel-token'] = array(
    'description' => dt('List available tokens'),
    'aliases' => array(
      'token',
    ),
  );
  $items['devel-container-services'] = array(
    'description' => 'Get a list of available container services.',
    'bootstrap' => DRUSH_BOOTSTRAP_DRUPAL_FULL,
    'core' => array(
      '8+',
    ),
    'aliases' => array(
      'dcs',
    ),
    'options' => array(
      'format' => 'Format to output. Allowed values are: json, export, html.',
    ),
    'arguments' => array(
      'prefix' => 'A prefix to filter the service list by.',
    ),
    'examples' => array(
      'drush container-services' => 'Gets a list of all available container services',
      'drush container-services plugin.manager' => 'Get all services containing "plugin.manager"',
    ),
    'outputformat' => array(
      'default' => 'list',
      'pipe-format' => 'export',
    ),
  );
  $items['devel-generate-uuid'] = array(
    'description' => 'Generate a UUID.',
    'core' => array(
      '8+',
    ),
    'examples' => array(
      "drush devel-generate-uuid" => "Outputs a Universally Unique IDentifier.",
    ),
    'aliases' => array(
      'uuid',
    ),
    'outputformat' => array(
      'default' => 'string',
    ),
  );
  return $items;
}

/**
 * A command callback. This is faster than 3 separate bootstraps.
 */
function drush_devel_reinstall() {
  $projects = func_get_args();
  $args = array_merge(array(
    'pm-uninstall',
  ), $projects);
  call_user_func_array('drush_invoke', $args);
  $args = array_merge(array(
    'pm-enable',
  ), $projects);
  call_user_func_array('drush_invoke', $args);
}

/**
 * Command handler. Show hook implementations.
 */
function drush_devel_fn_hook($hook) {

  // Get implementations in the .install files as well.
  include_once './core/includes/install.inc';
  drupal_load_updates();
  if ($hook_implementations = \Drupal::moduleHandler()
    ->getImplementations($hook)) {
    if ($choice = drush_choice(array_combine($hook_implementations, $hook_implementations), 'Enter the number of the hook implementation you wish to view.')) {
      return drush_devel_fn_view($choice . "_{$hook}");
    }
  }
  else {
    drush_log(dt('No implementations.'), 'ok');
  }
}

/**
 * Command handler. Show hook implementations.
 */
function drush_devel_fn_event($event = NULL) {
  $dispatcher = Drupal::service('event_dispatcher');
  if (empty($event)) {
    $events = array(
      'kernel.controller',
      'kernel.exception',
      'kernel.request',
      'kernel.response',
      'kernel.terminate',
      'kernel.view',
    );
    $events = array_combine($events, $events);
    if (!($event = drush_choice($events, 'Enter the event you wish to explore.'))) {
      return drush_user_abort();
    }
  }
  if ($implementations = $dispatcher
    ->getListeners($event)) {
    foreach ($implementations as $implementation) {
      $callable = get_class($implementation[0]) . '::' . $implementation[1];
      $choices[$callable] = $callable;
    }
    if ($choice = drush_choice($choices, 'Enter the number of the implementation you wish to view.')) {
      return drush_devel_fn_view($choice);
    }
  }
  else {
    drush_log(dt('No implementations.'), 'ok');
  }
}

/**
 * Command handler.  Show source code of specified function or method.
 */
function drush_devel_fn_view($function_name) {

  // Get implementations in the .install files as well.
  include_once './core/includes/install.inc';
  drupal_load_updates();
  if (strpos($function_name, '::') === FALSE) {
    if (!function_exists($function_name)) {
      return drush_set_error(dt('Function not found'));
    }
    $reflect = new ReflectionFunction($function_name);
  }
  else {
    list($class, $method) = explode('::', $function_name);
    if (!method_exists($class, $method)) {
      return drush_set_error(dt('Method not found'));
    }
    $reflect = new ReflectionMethod($class, $method);
  }
  $func_info = array(
    '@file' => $reflect
      ->getFileName(),
    '@startline' => $reflect
      ->getStartLine(),
    '@endline' => $reflect
      ->getEndLine(),
  );
  $format = drush_get_option('format', '@file');
  drush_print_pipe(dt($format, $func_info));
  drush_print(dt("// file: @file, lines @startline-@endline", $func_info));
  _drush_devel_print_function($reflect
    ->getFileName(), $reflect
    ->getStartLine(), $reflect
    ->getEndLine());
}

/**
 * Command callback. List available tokens.
 */
function drush_devel_token() {
  $rows[] = array(
    dt('Group'),
    dt('Token'),
    dt('Name'),
  );
  $all = \Drupal::token()
    ->getInfo();
  foreach ($all['tokens'] as $group => $tokens) {
    foreach ($tokens as $key => $token) {
      $rows[] = array(
        $group,
        $key,
        $token['name'],
      );
    }
  }
  drush_print_table($rows, TRUE);
}

/**
 * Command callback. Outputs a UUID.
 *
 * @return string
 *   A freshly generated UUID.
 */
function drush_devel_generate_uuid() {
  $uuid = new Php();
  return $uuid
    ->generate();
}

/**
 * Print the specified function, including any
 * doxygen-style comments that come before it.
 */
function _drush_devel_print_function($file, $start_line, $end_line) {
  $line_num = 0;
  $doxygen = NULL;
  $fp = fopen($file, 'r');
  while (!feof($fp) && $line_num < $start_line - 1) {
    $line = fgets($fp);
    ++$line_num;
    if (substr($line, 0, 3) == '/**') {
      $doxygen = $line;
    }
    elseif (isset($doxygen)) {
      $doxygen .= $line;
      if ($line_num + 1 == $start_line) {
        drush_print(rtrim($doxygen));
      }
      if (strstr($line, '*/') !== FALSE) {
        $doxygen = NULL;
      }
    }
  }
  while (!feof($fp) && $line_num < $end_line) {
    $line = fgets($fp);
    ++$line_num;
    drush_print(rtrim($line));
  }
}

/**
 * Command callback to list available container services.
 */
function drush_devel_container_services($prefix = NULL) {
  $container = Drupal::getContainer();
  if (empty($container)) {
    return drush_set_error(dt('No container was found.'));
  }

  // Get a list of all available service IDs.
  $services = $container
    ->getServiceIds();

  // If there is a prefix, try to find matches.
  if (isset($prefix)) {
    $services = preg_grep("/{$prefix}/", $services);
  }
  if (empty($services)) {
    return drush_log(dt('No container services found.'), 'ok');
  }
  sort($services);
  return $services;
}

Functions

Namesort descending Description
devel_drush_command Implements hook_drush_command().
drush_devel_container_services Command callback to list available container services.
drush_devel_fn_event Command handler. Show hook implementations.
drush_devel_fn_hook Command handler. Show hook implementations.
drush_devel_fn_view Command handler. Show source code of specified function or method.
drush_devel_generate_uuid Command callback. Outputs a UUID.
drush_devel_reinstall A command callback. This is faster than 3 separate bootstraps.
drush_devel_token Command callback. List available tokens.
_drush_devel_print_function Print the specified function, including any doxygen-style comments that come before it.