Page MenuHomePhabricator

D7424.id16717.diff
No OneTemporary

D7424.id16717.diff

Index: src/applications/diffusion/ssh/DiffusionSSHGitUploadPackWorkflow.php
===================================================================
--- src/applications/diffusion/ssh/DiffusionSSHGitUploadPackWorkflow.php
+++ src/applications/diffusion/ssh/DiffusionSSHGitUploadPackWorkflow.php
@@ -23,4 +23,12 @@
return head($args->getArg('dir'));
}
+ protected function executeRepositoryOperations(
+ PhabricatorRepository $repository) {
+
+ $future = new ExecFuture('git-upload-pack %s', $repository->getLocalPath());
+
+ return $this->passthruIO($future);
+ }
+
}
Index: src/applications/diffusion/ssh/DiffusionSSHWorkflow.php
===================================================================
--- src/applications/diffusion/ssh/DiffusionSSHWorkflow.php
+++ src/applications/diffusion/ssh/DiffusionSSHWorkflow.php
@@ -10,6 +10,9 @@
abstract protected function isReadOnly();
abstract protected function getRequestPath();
+ abstract protected function executeRepositoryOperations(
+ PhabricatorRepository $repository);
+
protected function writeError($message) {
$this->getErrorChannel()->write($message);
return $this;
@@ -20,15 +23,11 @@
try {
$repository = $this->loadRepository();
-
- throw new Exception("TODO: Implement serve over SSH.");
-
+ return $this->executeRepositoryOperations($repository);
} catch (Exception $ex) {
$this->writeError(get_class($ex).': '.$ex->getMessage());
return 1;
}
-
- return 0;
}
private function loadRepository() {
Index: src/infrastructure/ssh/PhabricatorSSHWorkflow.php
===================================================================
--- src/infrastructure/ssh/PhabricatorSSHWorkflow.php
+++ src/infrastructure/ssh/PhabricatorSSHWorkflow.php
@@ -37,6 +37,50 @@
return $this->iochannel;
}
+ public function passthruIO(ExecFuture $future) {
+ $exec_channel = new PhutilExecChannel($future);
+ $exec_channel->setStderrHandler(array($this, 'writeErrorIOCallback'));
+
+ $io_channel = $this->getIOChannel();
+ $error_channel = $this->getErrorChannel();
+
+ $channels = array($exec_channel, $io_channel, $error_channel);
+
+ while (true) {
+ PhutilChannel::waitForAny($channels);
+
+ $io_channel->update();
+ $exec_channel->update();
+ $error_channel->update();
+
+ $done = !$exec_channel->isOpen();
+
+ $data = $io_channel->read();
+ if (strlen($data)) {
+ $exec_channel->write($data);
+ }
+
+ $data = $exec_channel->read();
+ if (strlen($data)) {
+ $io_channel->write($data);
+ }
+
+ // If we have nothing left on stdin, close stdin on the subprocess.
+ if (!$io_channel->isOpenForReading()) {
+ // TODO: This should probably be part of PhutilExecChannel?
+ $future->write('');
+ }
+
+ if ($done) {
+ break;
+ }
+ }
+
+ list($err) = $future->resolve();
+
+ return $err;
+ }
+
public function readAllInput() {
$channel = $this->getIOChannel();
while ($channel->update()) {
@@ -53,4 +97,13 @@
return $this;
}
+ public function writeErrorIO($data) {
+ $this->getErrorChannel()->write($data);
+ return $this;
+ }
+
+ public function writeErrorIOCallback(PhutilChannel $channel, $data) {
+ $this->writeErrorIO($data);
+ }
+
}

File Metadata

Mime Type
text/plain
Expires
Thu, Oct 24, 2:49 PM (2 w, 23 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6712492
Default Alt Text
D7424.id16717.diff (3 KB)

Event Timeline