diff --git a/src/applications/diffusion/query/DiffusionCommitQuery.php b/src/applications/diffusion/query/DiffusionCommitQuery.php --- a/src/applications/diffusion/query/DiffusionCommitQuery.php +++ b/src/applications/diffusion/query/DiffusionCommitQuery.php @@ -199,12 +199,19 @@ $result = array(); foreach ($commits as $commit) { $prefix = 'r'.$commit->getRepository()->getCallsign(); + $prefix_id = 'r'.$commit->getRepository()->getID().':'; $suffix = $commit->getCommitIdentifier(); if ($commit->getRepository()->isSVN()) { if (isset($ids[$prefix.$suffix])) { $result[$prefix.$suffix][] = $commit; } + if (isset($ids[$prefix.':'.$suffix])) { + $result[$prefix.':'.$suffix][] = $commit; + } + if (isset($ids[$prefix_id.$suffix])) { + $result[$prefix_id.$suffix][] = $commit; + } } else { // This awkward construction is so we can link the commits up in O(N) // time instead of O(N^2). @@ -213,6 +220,12 @@ if (isset($ids[$prefix.$part])) { $result[$prefix.$part][] = $commit; } + if (isset($ids[$prefix.':'.$part])) { + $result[$prefix.':'.$part][] = $commit; + } + if (isset($ids[$prefix_id.$part])) { + $result[$prefix_id.$part][] = $commit; + } if (isset($ids[$part])) { $result[$part][] = $commit; } @@ -327,8 +340,9 @@ $bare = array(); foreach ($this->identifiers as $identifier) { $matches = null; - preg_match('/^(?:r([A-Z]+))?(.*)$/', $identifier, $matches); - $repo = nonempty($matches[1], null); + // FIXME: Replace with CommitPHIDType::getCommitObjectNamePattern ?? + preg_match('/^(?:r([A-Z]+:?|[0-9]+:))?(.*)$/', $identifier, $matches); + $repo = nonempty(rtrim($matches[1], ':'), null); $identifier = nonempty($matches[2], null); if ($repo === null) { @@ -362,14 +376,28 @@ if ($refs) { $callsigns = ipull($refs, 'callsign'); - $repos = id(new PhabricatorRepositoryQuery()) + + $repos = array(); + $repos_by_callsign = id(new PhabricatorRepositoryQuery()) ->setViewer($this->getViewer()) ->withCallsigns($callsigns) ->execute(); - $repos = mpull($repos, null, 'getCallsign'); + foreach ($repos_by_callsign as $obj) { + $repos[$obj->getCallsign()] = $obj; + } + + $ids = array_filter($callsigns, 'is_numeric'); + $repos_by_id = id(new PhabricatorRepositoryQuery()) + ->setViewer($this->getViewer()) + ->withIDs($ids) + ->execute(); + foreach ($repos_by_id as $obj) { + $repos[$obj->getID()] = $obj; + } foreach ($refs as $key => $ref) { $repo = idx($repos, $ref['callsign']); + if (!$repo) { continue; } diff --git a/src/applications/diffusion/remarkup/DiffusionCommitRemarkupRule.php b/src/applications/diffusion/remarkup/DiffusionCommitRemarkupRule.php --- a/src/applications/diffusion/remarkup/DiffusionCommitRemarkupRule.php +++ b/src/applications/diffusion/remarkup/DiffusionCommitRemarkupRule.php @@ -22,7 +22,6 @@ ->withIdentifiers($ids); $query->execute(); - return $query->getIdentifierMap(); } diff --git a/src/applications/diffusion/remarkup/DiffusionRepositoryRemarkupRule.php b/src/applications/diffusion/remarkup/DiffusionRepositoryRemarkupRule.php --- a/src/applications/diffusion/remarkup/DiffusionRepositoryRemarkupRule.php +++ b/src/applications/diffusion/remarkup/DiffusionRepositoryRemarkupRule.php @@ -8,18 +8,43 @@ } protected function getObjectIDPattern() { - return '[A-Z]+'; + return '[A-Z0-9]+'; } protected function loadObjects(array $ids) { $viewer = $this->getEngine()->getConfig('viewer'); - $repositories = id(new PhabricatorRepositoryQuery()) - ->setViewer($viewer) - ->withCallsigns($ids) - ->execute(); + $repo_ids = array(); $callsigns = array(); + foreach ($ids as $id) { + if (is_numeric($id)) { + $repo_ids[] = $id; + } else { + $callsigns[] = $id; + } + } - return mpull($repositories, null, 'getCallsign'); + $results = array(); + if ($callsigns) { + $objects = id(new PhabricatorRepositoryQuery()) + ->setViewer($viewer) + ->withCallsigns($callsigns) + ->execute(); + foreach ($objects as $object) { + $results[$object->getCallsign()] = $object; + } + } + + if ($repo_ids) { + $objects = id(new PhabricatorRepositoryQuery()) + ->setViewer($viewer) + ->withIDs($repo_ids) + ->execute(); + foreach ($objects as $object) { + $results[$object->getID()] = $object; + } + } + + return $results; } } diff --git a/src/applications/repository/phid/PhabricatorRepositoryCommitPHIDType.php b/src/applications/repository/phid/PhabricatorRepositoryCommitPHIDType.php --- a/src/applications/repository/phid/PhabricatorRepositoryCommitPHIDType.php +++ b/src/applications/repository/phid/PhabricatorRepositoryCommitPHIDType.php @@ -54,9 +54,9 @@ $min_qualified = PhabricatorRepository::MINIMUM_QUALIFIED_HASH; return - 'r[A-Z]+[1-9]\d*'. + 'r([A-Z]+:?|[0-9]+:)[1-9]\d*'. '|'. - 'r[A-Z]+[a-f0-9]{'.$min_qualified.',40}'. + 'r([A-Z]+:?|[0-9]+:)[a-f0-9]{'.$min_qualified.',40}'. '|'. '[a-f0-9]{'.$min_unqualified.',40}'; } diff --git a/src/applications/repository/phid/PhabricatorRepositoryRepositoryPHIDType.php b/src/applications/repository/phid/PhabricatorRepositoryRepositoryPHIDType.php --- a/src/applications/repository/phid/PhabricatorRepositoryRepositoryPHIDType.php +++ b/src/applications/repository/phid/PhabricatorRepositoryRepositoryPHIDType.php @@ -44,29 +44,41 @@ } public function canLoadNamedObject($name) { - return preg_match('/^r[A-Z]+$/', $name); + return preg_match('/^r[A-Z0-9]+$/', $name); } public function loadNamedObjects( PhabricatorObjectQuery $query, array $names) { - $id_map = array(); + $callsigns = array(); $ids = array(); foreach ($names as $name) { $id = substr($name, 1); - $id_map[$id][] = $name; + if (is_numeric($id)) { + $ids[] = $id; + } else { + $callsigns[] = $id; + } } - $objects = id(new PhabricatorRepositoryQuery()) - ->setViewer($query->getViewer()) - ->withCallsigns(array_keys($id_map)) - ->execute(); - $results = array(); - foreach ($objects as $object) { - $callsign = $object->getCallsign(); - foreach (idx($id_map, $callsign, array()) as $name) { - $results[$name] = $object; + if ($callsigns) { + $objects = id(new PhabricatorRepositoryQuery()) + ->setViewer($query->getViewer()) + ->withCallsigns($callsigns) + ->execute(); + foreach ($objects as $object) { + $results[$object->getCallsign()] = $object; + } + } + + if ($ids) { + $objects = id(new PhabricatorRepositoryQuery()) + ->setViewer($query->getViewer()) + ->withIDs($ids) + ->execute(); + foreach ($objects as $object) { + $results[$object->getID()] = $object; } }