@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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]
#4 PhabricatorRepositoryPullEngine::pullRepositoryWithLock() called at [<phabricator>/src/applications/repository/engine/PhabricatorRepositoryPullEngine.php:40]
#5 PhabricatorRepositoryPullEngine::pullRepository() called at [<phabricator>/src/applications/repository/management/PhabricatorRepositoryManagementUpdateWorkflow.php:59]
#6 PhabricatorRepositoryManagementUpdateWorkflow::execute(PhutilArgumentParser) called at [<phutil>/src/parser/argument/PhutilArgumentParser.php:441]
#7 PhutilArgumentParser::parseWorkflowsFull(array) called at [<phutil>/src/parser/argument/PhutilArgumentParser.php:333]
#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

+27
+27
scripts/ssh/ssh-connect.php
··· 27 27 'param' => pht('port'), 28 28 'help' => pht('Port number to connect to.'), 29 29 ), 30 + array( 31 + 'name' => 'options', 32 + 'short' => 'o', 33 + 'param' => pht('options'), 34 + 'repeat' => true, 35 + 'help' => pht('SSH options.'), 36 + ), 30 37 )); 38 + 31 39 $unconsumed_argv = $args->getUnconsumedArgumentVector(); 32 40 33 41 if (function_exists('pcntl_signal')) { ··· 111 119 if ($port) { 112 120 $pattern[] = '-p %d'; 113 121 $arguments[] = $port; 122 + } 123 + 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 + } 114 141 } 115 142 116 143 $pattern[] = '--';