* added execute() wrapper to generalize command execution in downloader

* added Composer\Util\Svn::doAuthDance() to ask for credentials in interactive sessions
main
till 12 years ago
parent 059bde1adb
commit c7dc49fe10

@ -21,6 +21,11 @@ use Composer\Util\Svn as SvnUtil;
*/ */
class SvnDownloader extends VcsDownloader class SvnDownloader extends VcsDownloader
{ {
/**
* @var bool $useAuth
*/
protected $useAuth = false;
/** /**
* @var \Composer\Util\Svn $util * @var \Composer\Util\Svn $util
*/ */
@ -39,7 +44,7 @@ class SvnDownloader extends VcsDownloader
$command = $util->getCommand("svn co", sprintf("%s/%s", $url, $ref), $path); $command = $util->getCommand("svn co", sprintf("%s/%s", $url, $ref), $path);
$this->io->write(" Checking out ".$package->getSourceReference()); $this->io->write(" Checking out ".$package->getSourceReference());
$this->process->execute($command); $this->execute($command, $util);
} }
/** /**
@ -54,7 +59,7 @@ class SvnDownloader extends VcsDownloader
$command = $util->getCommand("svn switch", sprintf("%s/%s", $url, $ref)); $command = $util->getCommand("svn switch", sprintf("%s/%s", $url, $ref));
$this->io->write(" Checking out " . $ref); $this->io->write(" Checking out " . $ref);
$this->process->execute(sprintf('cd %s && %s', $path, $command)); $this->execute(sprintf('cd %s && %s', $path, $command), $util);
} }
/** /**
@ -68,6 +73,49 @@ class SvnDownloader extends VcsDownloader
} }
} }
/**
* Wrap {@link \Composer\Util\ProcessExecutor::execute().
*
* @param string $cmd
* @param SvnUtil $util
*
* @return string
*/
protected function execute($command, SvnUtil $util)
{
$status = $this->process->execute($command, $output);
if ($status == 0) {
return $output;
}
// this could be any failure, since SVN exits with 1 always
if (empty($output)) {
$output = $this->process->getErrorOutput();
}
if (!$this->io->isInteractive()) {
return $output;
}
// the error is not auth-related
if (strpos($output, 'authorization failed:') === false) {
return $output;
}
// no authorization has been detected so far
if (!$this->useAuth) {
$this->useAuth = $util->doAuthDance()->hasAuth();
$credentials = $util->getCredentialString();
// restart the process
$output = $this->execute($command . ' ' . $credentials, $util);
} else {
$this->io->write("Authorization failed: {$command}");
}
return $output;
}
/** /**
* This is heavy - recreating Util often. * This is heavy - recreating Util often.
* *

Loading…
Cancel
Save