Changeset View
Changeset View
Standalone View
Standalone View
src/applications/diffusion/protocol/DiffusionCommandEngine.php
- This file was added.
| <?php | |||||
| abstract class DiffusionCommandEngine extends Phobject { | |||||
| private $repository; | |||||
| private $protocol; | |||||
| private $credentialPHID; | |||||
| private $argv; | |||||
| private $passthru; | |||||
| public static function newCommandEngine(PhabricatorRepository $repository) { | |||||
| $engines = self::newCommandEngines(); | |||||
| foreach ($engines as $engine) { | |||||
| if ($engine->canBuildForRepository($repository)) { | |||||
| return id(clone $engine) | |||||
| ->setRepository($repository); | |||||
| } | |||||
| } | |||||
| throw new Exception( | |||||
| pht( | |||||
| 'No registered command engine can build commands for this '. | |||||
| 'repository ("%s").', | |||||
| $repository->getDisplayName())); | |||||
| } | |||||
| private static function newCommandEngines() { | |||||
| return id(new PhutilClassMapQuery()) | |||||
| ->setAncestorClass(__CLASS__) | |||||
| ->execute(); | |||||
| } | |||||
| abstract protected function canBuildForRepository( | |||||
| PhabricatorRepository $repository); | |||||
| abstract protected function newFormattedCommand($pattern, array $argv); | |||||
| abstract protected function newCustomEnvironment(); | |||||
| public function setRepository(PhabricatorRepository $repository) { | |||||
| $this->repository = $repository; | |||||
| return $this; | |||||
| } | |||||
| public function getRepository() { | |||||
| return $this->repository; | |||||
| } | |||||
| public function setProtocol($protocol) { | |||||
| $this->protocol = $protocol; | |||||
| return $this; | |||||
| } | |||||
| public function getProtocol() { | |||||
| return $this->protocol; | |||||
| } | |||||
| public function setCredentialPHID($credential_phid) { | |||||
| $this->credentialPHID = $credential_phid; | |||||
| return $this; | |||||
| } | |||||
| public function getCredentialPHID() { | |||||
| return $this->credentialPHID; | |||||
| } | |||||
| public function setArgv(array $argv) { | |||||
| $this->argv = $argv; | |||||
| return $this; | |||||
| } | |||||
| public function getArgv() { | |||||
| return $this->argv; | |||||
| } | |||||
| public function setPassthru($passthru) { | |||||
| $this->passthru = $passthru; | |||||
| return $this; | |||||
| } | |||||
| public function getPassthru() { | |||||
| return $this->passthru; | |||||
| } | |||||
| public function newFuture() { | |||||
| $argv = $this->newCommandArgv(); | |||||
| $env = $this->newCommandEnvironment(); | |||||
| if ($this->getPassthru()) { | |||||
| $future = newv('PhutilExecPassthru', $argv); | |||||
| } else { | |||||
| $future = newv('ExecFuture', $argv); | |||||
| } | |||||
| $future->setEnv($env); | |||||
| return $future; | |||||
| } | |||||
| private function newCommandArgv() { | |||||
| $argv = $this->argv; | |||||
| $pattern = $argv[0]; | |||||
| $argv = array_slice($argv, 1); | |||||
| list($pattern, $argv) = $this->newFormattedCommand($pattern, $argv); | |||||
| return array_merge(array($pattern), $argv); | |||||
| } | |||||
| private function newCommandEnvironment() { | |||||
| $env = $this->newCommonEnvironment() + $this->newCustomEnvironment(); | |||||
| foreach ($env as $key => $value) { | |||||
| if ($value === null) { | |||||
| unset($env[$key]); | |||||
| } | |||||
| } | |||||
| return $env; | |||||
| } | |||||
| private function newCommonEnvironment() { | |||||
| $env = array(); | |||||
| // NOTE: Force the language to "en_US.UTF-8", which overrides locale | |||||
| // settings. This makes stuff print in English instead of, e.g., French, | |||||
| // so we can parse the output of some commands, error messages, etc. | |||||
| $env['LANG'] = 'en_US.UTF-8'; | |||||
| // Propagate PHABRICATOR_ENV explicitly. For discussion, see T4155. | |||||
| $env['PHABRICATOR_ENV'] = PhabricatorEnv::getSelectedEnvironmentName(); | |||||
| if ($this->isAnySSHProtocol()) { | |||||
| $credential_phid = $this->getCredentialPHID(); | |||||
| if ($credential_phid) { | |||||
| $env['PHABRICATOR_CREDENTIAL'] = $credential_phid; | |||||
| } | |||||
| } | |||||
| return $env; | |||||
| } | |||||
| protected function isSSHProtocol() { | |||||
| return ($this->getProtocol() == 'ssh'); | |||||
| } | |||||
| protected function isSVNProtocol() { | |||||
| return ($this->getProtocol() == 'svn'); | |||||
| } | |||||
| protected function isSVNSSHProtocol() { | |||||
| return ($this->getProtocol() == 'svn+ssh'); | |||||
| } | |||||
| protected function isHTTPProtocol() { | |||||
| return ($this->getProtocol() == 'http'); | |||||
| } | |||||
| protected function isHTTPSProtocol() { | |||||
| return ($this->getProtocol() == 'https'); | |||||
| } | |||||
| protected function isAnyHTTPProtocol() { | |||||
| return ($this->isHTTPProtocol() || $this->isHTTPSProtocol()); | |||||
| } | |||||
| protected function isAnySSHProtocol() { | |||||
| return ($this->isSSHProtocol() || $this->isSVNSSHProtocol()); | |||||
| } | |||||
| protected function getSSHWrapper() { | |||||
| $root = dirname(phutil_get_library_root('phabricator')); | |||||
| return $root.'/bin/ssh-connect'; | |||||
| } | |||||
| } | |||||