Skip to content

Commit 4c09e88

Browse files
author
Arturas Moskvinas
committed
Add parsing for ssh options (-o) which are passed when using GIT v2 wire protocol by git command (SSH transport)
Summary: Makes `ssh-connect` compatible with Git v2 wire protocol over SSH More details about git V2 wire: https://opensource.googleblog.com/2018/05/introducing-git-protocol-version-2.html `git` command (2.18+) passes extra options (`-o "SendEnv GIT_PROTOCOL"`) to underlying `ssh` command to enable v2 wire protocol (environment variable enabling new protocol). Phabricator `ssh-connect` command doesn't understand `-o` options and interprets it as host parts hence when you enable git v2 all clones/ls-remotes crash with: ``` #0 ExecFuture::resolvex() called at [<phabricator>/src/applications/repository/storage/PhabricatorRepository.php:525] #1 PhabricatorRepository::execxRemoteCommand(string, PhutilOpaqueEnvelope) called at [<phabricator>/src/applications/repository/engine/PhabricatorRepositoryPullEngine.php:400] #2 PhabricatorRepositoryPullEngine::loadGitRemoteRefs(PhabricatorRepository) called at [<phabricator>/src/applications/repository/engine/PhabricatorRepositoryPullEngine.php:343] #3 PhabricatorRepositoryPullEngine::executeGitUpdate() called at [<phabricator>/src/applications/repository/engine/PhabricatorRepositoryPullEngine.php:126] phacility#4 PhabricatorRepositoryPullEngine::pullRepositoryWithLock() called at [<phabricator>/src/applications/repository/engine/PhabricatorRepositoryPullEngine.php:40] phacility#5 PhabricatorRepositoryPullEngine::pullRepository() called at [<phabricator>/src/applications/repository/management/PhabricatorRepositoryManagementUpdateWorkflow.php:59] phacility#6 PhabricatorRepositoryManagementUpdateWorkflow::execute(PhutilArgumentParser) called at [<phutil>/src/parser/argument/PhutilArgumentParser.php:441] phacility#7 PhutilArgumentParser::parseWorkflowsFull(array) called at [<phutil>/src/parser/argument/PhutilArgumentParser.php:333] phacility#8 PhutilArgumentParser::parseWorkflows(array) called at [<phabricator>/scripts/repository/manage_repositories.php:22] COMMAND git ls-remote '********' STDOUT (empty) STDERR ssh: Could not resolve hostname -o: Name or service not known fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. at [<phutil>/src/future/exec/ExecFuture.php:369] ``` Test Plan: How to reproduce: 1. add repository to Phabricator which is accessed via `ssh` 2. Use git 2.18+ 3. Enable wire protocol in `/etc/gitconfig`: ``` [protocol] version = 2 ``` 4. Try refreshing repository: `phabricator/bin/repository update somecallsing` 5. Repository update fails with `ssh: Could not resolve hostname -o: Name or service not known` after this changes - updates will succeed Reviewers: epriestley, Pawka, #blessed_reviewers Reviewed By: epriestley, #blessed_reviewers Subscribers: Korvin Differential Revision: https://secure.phabricator.com/D19542
1 parent e72296f commit 4c09e88

File tree

1 file changed

+27
-0
lines changed

1 file changed

+27
-0
lines changed

scripts/ssh/ssh-connect.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,15 @@
2727
'param' => pht('port'),
2828
'help' => pht('Port number to connect to.'),
2929
),
30+
array(
31+
'name' => 'options',
32+
'short' => 'o',
33+
'param' => pht('options'),
34+
'repeat' => true,
35+
'help' => pht('SSH options.'),
36+
),
3037
));
38+
3139
$unconsumed_argv = $args->getUnconsumedArgumentVector();
3240

3341
if (function_exists('pcntl_signal')) {
@@ -113,6 +121,25 @@ function ssh_connect_signal($signo) {
113121
$arguments[] = $port;
114122
}
115123

124+
$options = $args->getArg('options');
125+
$allowed_ssh_options = array('SendEnv=GIT_PROTOCOL');
126+
127+
if (!empty($options)) {
128+
foreach ($options as $option) {
129+
if (array_search($option, $allowed_ssh_options) !== false) {
130+
$pattern[] = '-o %s';
131+
$arguments[] = $option;
132+
} else {
133+
throw new Exception(
134+
pht(
135+
'Disallowed ssh option "%s" given with "-o". '.
136+
'Allowed options are: %s.',
137+
$option,
138+
implode(', ', $allowed_ssh_options)));
139+
}
140+
}
141+
}
142+
116143
$pattern[] = '--';
117144

118145
$pattern[] = '%s';

0 commit comments

Comments
 (0)