protected function execute(InputInterface $input, OutputInterface $output) { $projectRoot = $this->getProjectRoot(); if (!$projectRoot) { throw new RootNotFoundException(); } $projectConfig = LocalProject::getProjectConfig($projectRoot); $current_group = isset($projectConfig['alias-group']) ? $projectConfig['alias-group'] : $projectConfig['id']; if ($input->getOption('pipe')) { $output->writeln($current_group); return 0; } $project = $this->getCurrentProject(); $new_group = ltrim($input->getOption('group'), '@'); $homeDir = $this->getHomeDir(); $drushHelper = new DrushHelper($output); $drushHelper->ensureInstalled(); $drushHelper->setHomeDir($homeDir); $aliases = $drushHelper->getAliases($current_group); if ($new_group && $new_group != $current_group || !$aliases || $input->getOption('recreate')) { $new_group = $new_group ?: $current_group; $this->stdErr->writeln("Creating Drush aliases in the group <info>@{$new_group}</info>"); $questionHelper = $this->getHelper('question'); if ($new_group != $current_group) { $existing = $drushHelper->getAliases($new_group); if ($existing && $new_group != $current_group) { $question = "The Drush alias group <info>@{$new_group}</info> already exists. Overwrite?"; if (!$questionHelper->confirm($question, $input, $output, false)) { return 1; } } LocalProject::writeCurrentProjectConfig('alias-group', $new_group, $projectRoot); } $environments = $this->getEnvironments($project, true, false); $drushHelper->createAliases($project, $projectRoot, $environments, $current_group); if ($new_group != $current_group) { $drushDir = $homeDir . '/.drush'; $oldFile = $drushDir . '/' . $current_group . '.aliases.drushrc.php'; if (file_exists($oldFile)) { if ($questionHelper->confirm("Delete old Drush alias group <info>@{$current_group}</info>?", $input, $this->stdErr)) { unlink($oldFile); } } } // Clear the Drush cache now that the aliases have been updated. $drushHelper->clearCache(); // Read the new aliases. $aliases = $drushHelper->getAliases($new_group); } if ($aliases) { $this->stdErr->writeln("Drush aliases for <info>{$project->title}</info> ({$project->id}):"); foreach (explode("\n", $aliases) as $alias) { $output->writeln(' @' . $alias); } } return 0; }
/** * Get the current environment if the user is in a project directory. * * @param Project $expectedProject The expected project. * @param bool|null $refresh Whether to refresh the environments or projects * cache. * * @return Environment|false The current environment. */ public function getCurrentEnvironment(Project $expectedProject = null, $refresh = null) { if (!($projectRoot = $this->getProjectRoot()) || !($project = $this->getCurrentProject()) || $expectedProject !== null && $expectedProject->id !== $project->id) { return false; } $gitHelper = $this->getHelper('git'); $gitHelper->setDefaultRepositoryDir($this->getProjectRoot()); $config = $this->localProject->getProjectConfig($projectRoot); // Check if there is a manual mapping set for the current branch. if (!empty($config['mapping']) && ($currentBranch = $gitHelper->getCurrentBranch()) && !empty($config['mapping'][$currentBranch])) { $environment = $this->api()->getEnvironment($config['mapping'][$currentBranch], $project, $refresh); if ($environment) { $this->debug('Found mapped environment for branch ' . $currentBranch . ': ' . $environment->id); return $environment; } else { unset($config['mapping'][$currentBranch]); $this->localProject->writeCurrentProjectConfig($config, $projectRoot); } } // Check whether the user has a Git upstream set to a remote environment // ID. $upstream = $gitHelper->getUpstream(); if ($upstream && strpos($upstream, '/') !== false) { list(, $potentialEnvironment) = explode('/', $upstream, 2); $environment = $this->api()->getEnvironment($potentialEnvironment, $project, $refresh); if ($environment) { $this->debug('Selected environment ' . $potentialEnvironment . ', based on Git upstream: ' . $upstream); return $environment; } } // There is no Git remote set. Fall back to trying the current branch // name. if (!empty($currentBranch) || ($currentBranch = $gitHelper->getCurrentBranch())) { $environment = $this->api()->getEnvironment($currentBranch, $project, $refresh); if (!$environment) { // Try a sanitized version of the branch name too. $currentBranchSanitized = Environment::sanitizeId($currentBranch); $environment = $this->api()->getEnvironment($currentBranchSanitized, $project, $refresh); } if ($environment) { $this->debug('Selected environment ' . $environment->id . ' based on branch name: ' . $currentBranch); return $environment; } } return false; }
/** * @param string $sourceDir * * @return string */ protected function createDummyProject($sourceDir) { if (!is_dir($sourceDir)) { throw new \InvalidArgumentException("Not a directory: {$sourceDir}"); } $projectRoot = $this->createTempSubDir('project'); // Set up the project. $fsHelper = new FilesystemHelper(); $fsHelper->copyAll($sourceDir, $projectRoot); // @todo perhaps make some of these steps unnecessary $local = new LocalProject(); $cwd = getcwd(); chdir($projectRoot); exec('git init'); chdir($cwd); $local->ensureGitRemote($projectRoot, 'testProjectId'); $local->writeCurrentProjectConfig(['id' => 'testProjectId'], $projectRoot); return $projectRoot; }
/** * Set a value in the project configuration. * * @param string $key * @param mixed $value * @param string $projectRoot */ protected function setProjectConfig($key, $value, $projectRoot) { unset(self::$projectConfig[$projectRoot]); LocalProject::writeCurrentProjectConfig($key, $value, $projectRoot); }
protected function execute(InputInterface $input, OutputInterface $output) { $project = $this->getCurrentProject(); if (!$project) { throw new \Exception('This can only be run from inside a project directory'); } $projectRoot = $this->getProjectRoot(); $projectConfig = LocalProject::getProjectConfig($projectRoot); $current_group = isset($projectConfig['alias-group']) ? $projectConfig['alias-group'] : $project['id']; if ($input->getOption('pipe') || !$this->isTerminal($output)) { $output->writeln($current_group); return 0; } $new_group = ltrim($input->getOption('group'), '@'); $homeDir = $this->getHelper('fs')->getHomeDirectory(); $drushHelper = new DrushHelper($output); $drushHelper->ensureInstalled(); $drushHelper->setHomeDir($homeDir); if ($new_group && $new_group != $current_group) { $questionHelper = $this->getHelper('question'); $existing = $drushHelper->getAliases($new_group); if ($existing) { if (!$questionHelper->confirm("The alias group <info>@{$new_group}</info> already exists. Overwrite?", $input, $output, false)) { return 1; } } $project['alias-group'] = $new_group; LocalProject::writeCurrentProjectConfig('alias-group', $new_group, $projectRoot); $output->write("Creating Drush aliases in the group <info>@{$new_group}</info>..."); $environments = $this->getEnvironments($project, true, false); $drushHelper->createAliases($project, $projectRoot, $environments); $output->writeln(" done"); $drushDir = $homeDir . '/.drush'; $oldFile = $drushDir . '/' . $current_group . '.aliases.drushrc.php'; if (file_exists($oldFile)) { if ($questionHelper->confirm("Delete old alias group <info>@{$current_group}</info>?", $input, $output)) { unlink($oldFile); } } // Clear the Drush cache now that the aliases have been updated. $drushHelper->clearCache(); $current_group = $new_group; } elseif ($input->getOption('recreate')) { $output->write("Recreating Drush aliases..."); $environments = $this->getEnvironments($project, true, false); $drushHelper->createAliases($project, $projectRoot, $environments); $drushHelper->clearCache(); $output->writeln(' done'); } // Don't run expensive drush calls if they are not needed. if ($input->getOption('quiet')) { return 0; } $aliases = $drushHelper->getAliases($current_group); if ($aliases) { $output->writeln("Aliases for <info>{$project['name']}</info> ({$project['id']}):"); foreach (explode("\n", $aliases) as $alias) { $output->writeln(' @' . $alias); } } return 0; }