1
0
Fork 0
composer/src/Composer/IO/ConsoleIO.php

225 lines
6.1 KiB
PHP
Raw Normal View History

<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer\IO;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Helper\HelperSet;
2012-01-17 22:07:33 +00:00
/**
* The Input/Output helper.
*
* @author François Pluchino <francois.pluchino@opendisplay.com>
* @author Jordi Boggiano <j.boggiano@seld.be>
*/
class ConsoleIO implements IOInterface
{
protected $input;
protected $output;
protected $helperSet;
protected $authentications = array();
protected $lastMessage;
/**
* Constructor.
*
2012-01-17 09:29:54 +00:00
* @param InputInterface $input The input instance
* @param OutputInterface $output The output instance
* @param HelperSet $helperSet The helperSet instance
*/
2012-01-17 09:29:54 +00:00
public function __construct(InputInterface $input, OutputInterface $output, HelperSet $helperSet)
{
$this->input = $input;
$this->output = $output;
$this->helperSet = $helperSet;
}
/**
* {@inheritDoc}
*/
public function isInteractive()
{
return $this->input->isInteractive();
}
2012-04-26 12:54:34 +00:00
/**
* {@inheritDoc}
*/
public function isDecorated()
{
return $this->output->isDecorated();
}
/**
* {@inheritDoc}
*/
public function isVerbose()
{
2012-11-02 17:12:08 +00:00
return $this->output->getVerbosity() === OutputInterface::VERBOSITY_VERBOSE;
}
/**
* {@inheritDoc}
*/
2012-01-17 22:07:33 +00:00
public function write($messages, $newline = true)
{
2012-01-17 22:07:33 +00:00
$this->output->write($messages, $newline);
$this->lastMessage = join($newline ? "\n" : '', (array) $messages);
}
/**
* {@inheritDoc}
*/
public function overwrite($messages, $newline = true, $size = null)
{
// messages can be an array, let's convert it to string anyway
$messages = join($newline ? "\n" : '', (array) $messages);
// since overwrite is supposed to overwrite last message...
if (!isset($size)) {
// removing possible formatting of lastMessage with strip_tags
$size = strlen(strip_tags($this->lastMessage));
}
// ...let's fill its length with backspaces
$this->write(str_repeat("\x08", $size), false);
// write the new message
2012-01-18 09:35:02 +00:00
$this->write($messages, false);
$fill = $size - strlen(strip_tags($messages));
if ($fill > 0) {
// whitespace whatever has left
$this->write(str_repeat(' ', $fill), false);
// move the cursor back
$this->write(str_repeat("\x08", $fill), false);
}
if ($newline) {
2012-01-18 09:35:02 +00:00
$this->write('');
}
$this->lastMessage = $messages;
}
/**
* {@inheritDoc}
*/
public function ask($question, $default = null)
{
return $this->helperSet->get('dialog')->ask($this->output, $question, $default);
}
/**
* {@inheritDoc}
*/
public function askConfirmation($question, $default = true)
{
return $this->helperSet->get('dialog')->askConfirmation($this->output, $question, $default);
}
2012-01-17 22:07:33 +00:00
/**
* {@inheritDoc}
*/
public function askAndValidate($question, $validator, $attempts = false, $default = null)
{
return $this->helperSet->get('dialog')->askAndValidate($this->output, $question, $validator, $attempts, $default);
}
/**
* {@inheritDoc}
*/
public function askAndHideAnswer($question)
{
// handle windows
2012-01-22 19:21:14 +00:00
if (defined('PHP_WINDOWS_VERSION_BUILD')) {
2012-04-01 18:59:50 +00:00
$exe = __DIR__.'\\hiddeninput.exe';
2012-04-01 18:59:50 +00:00
// handle code running from a phar
if ('phar:' === substr(__FILE__, 0, 5)) {
$tmpExe = sys_get_temp_dir().'/hiddeninput.exe';
copy($exe, $tmpExe);
$exe = $tmpExe;
}
$this->write($question, false);
2012-04-01 18:59:50 +00:00
$value = rtrim(shell_exec($exe));
$this->write('');
2012-04-01 19:34:09 +00:00
// clean up
if (isset($tmpExe)) {
unlink($tmpExe);
}
return $value;
}
if (file_exists('/usr/bin/env')) {
// handle other OSs with bash/zsh/ksh/csh if available to hide the answer
$test = "/usr/bin/env %s -c 'echo OK' 2> /dev/null";
foreach (array('bash', 'zsh', 'ksh', 'csh') as $sh) {
if ('OK' === rtrim(shell_exec(sprintf($test, $sh)))) {
$shell = $sh;
break;
}
}
if (isset($shell)) {
$this->write($question, false);
$readCmd = ($shell === 'csh') ? 'set mypassword = $<' : 'read -r mypassword';
$command = sprintf("/usr/bin/env %s -c 'stty -echo; %s; stty echo; echo \$mypassword'", $shell, $readCmd);
$value = rtrim(shell_exec($command));
$this->write('');
return $value;
}
}
2012-04-01 18:47:31 +00:00
// not able to hide the answer, proceed with normal question handling
return $this->ask($question);
}
/**
* {@inheritDoc}
*/
public function getAuthentications()
{
return $this->authentications;
}
/**
* {@inheritDoc}
*/
public function hasAuthentication($repositoryName)
{
$auths = $this->getAuthentications();
2012-01-17 13:53:50 +00:00
return isset($auths[$repositoryName]);
}
/**
* {@inheritDoc}
*/
public function getAuthentication($repositoryName)
{
$auths = $this->getAuthentications();
return isset($auths[$repositoryName]) ? $auths[$repositoryName] : array('username' => null, 'password' => null);
}
/**
* {@inheritDoc}
*/
public function setAuthentication($repositoryName, $username, $password = null)
{
$this->authentications[$repositoryName] = array('username' => $username, 'password' => $password);
}
}