Changeset View
Changeset View
Standalone View
Standalone View
src/repository/remote/ArcanistGitRepositoryRemoteQuery.php
- This file was added.
<?php | |||||
final class ArcanistGitRepositoryRemoteQuery | |||||
extends ArcanistRepositoryRemoteQuery { | |||||
protected function newRemoteRefs() { | |||||
$api = $this->getRepositoryAPI(); | |||||
$future = $api->newFuture('remote --verbose'); | |||||
list($lines) = $future->resolve(); | |||||
$pattern = | |||||
'(^'. | |||||
'(?P<name>[^\t]+)'. | |||||
'\t'. | |||||
'(?P<uri>[^\s]+)'. | |||||
' '. | |||||
'\((?P<mode>fetch|push)\)'. | |||||
'\z'. | |||||
')'; | |||||
$map = array(); | |||||
$lines = phutil_split_lines($lines, false); | |||||
foreach ($lines as $line) { | |||||
$matches = null; | |||||
if (!preg_match($pattern, $line, $matches)) { | |||||
throw new Exception( | |||||
pht( | |||||
'Failed to match remote pattern against line "%s".', | |||||
$line)); | |||||
} | |||||
$name = $matches['name']; | |||||
$uri = $matches['uri']; | |||||
$mode = $matches['mode']; | |||||
$map[$name][$mode] = $uri; | |||||
} | |||||
$refs = array(); | |||||
foreach ($map as $name => $uris) { | |||||
$fetch_uri = idx($uris, 'fetch'); | |||||
$push_uri = idx($uris, 'push'); | |||||
$ref = id(new ArcanistRemoteRef()) | |||||
->setRemoteName($name); | |||||
if ($fetch_uri !== null) { | |||||
$ref->setFetchURI($fetch_uri); | |||||
} | |||||
if ($push_uri !== null) { | |||||
$ref->setPushURI($push_uri); | |||||
} | |||||
$refs[] = $ref; | |||||
} | |||||
return $refs; | |||||
} | |||||
} |