mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-01 11:12:42 +01:00
b22e52e40c
Summary: Ref T2852. Primarily, this expands API access to Asana. As a user-visible effect, it links Asana tasks in Remarkup. When a user enters an Asana URI, we register an onload behavior to make an Ajax call for the lookup. This respects privacy imposed by the API without creating a significant performance impact. Test Plan: {F47183} Reviewers: btrahan Reviewed By: btrahan CC: chad, aran Maniphest Tasks: T2852 Differential Revision: https://secure.phabricator.com/D6274
83 lines
2.3 KiB
PHP
83 lines
2.3 KiB
PHP
<?php
|
|
|
|
final class DiffusionRemarkupRule
|
|
extends PhabricatorRemarkupRuleObject {
|
|
|
|
protected function getObjectNamePrefix() {
|
|
return '';
|
|
}
|
|
|
|
protected function getObjectNamePrefixBeginsWithWordCharacter() {
|
|
return true;
|
|
}
|
|
|
|
protected function getObjectIDPattern() {
|
|
$min_unqualified = PhabricatorRepository::MINIMUM_UNQUALIFIED_HASH;
|
|
$min_qualified = PhabricatorRepository::MINIMUM_QUALIFIED_HASH;
|
|
|
|
// NOTE: The "(?<!/)" negative lookbehind prevents this rule from matching
|
|
// hashes or hash-like substrings in most URLs. For example, this will not
|
|
// match: http://www.example.com/article/28903218328/
|
|
|
|
return
|
|
'r[A-Z]+[1-9]\d*'.
|
|
'|'.
|
|
'r[A-Z]+[a-f0-9]{'.$min_qualified.',40}'.
|
|
'|'.
|
|
'(?<!/)[a-f0-9]{'.$min_unqualified.',40}';
|
|
}
|
|
|
|
protected function loadObjects(array $ids) {
|
|
$viewer = $this->getEngine()->getConfig('viewer');
|
|
$min_qualified = PhabricatorRepository::MINIMUM_QUALIFIED_HASH;
|
|
|
|
$commits = id(new DiffusionCommitQuery())
|
|
->setViewer($viewer)
|
|
->withIdentifiers($ids)
|
|
->execute();
|
|
|
|
if (!$commits) {
|
|
return array();
|
|
}
|
|
|
|
$ids = array_fuse($ids);
|
|
|
|
$result = array();
|
|
foreach ($commits as $commit) {
|
|
$prefix = 'r'.$commit->getRepository()->getCallsign();
|
|
$suffix = $commit->getCommitIdentifier();
|
|
|
|
if ($commit->getRepository()->isSVN()) {
|
|
if (isset($ids[$prefix.$suffix])) {
|
|
$result[$prefix.$suffix][] = $commit;
|
|
}
|
|
} else {
|
|
// This awkward contruction is so we can link the commits up in O(N)
|
|
// time instead of O(N^2).
|
|
for ($ii = $min_qualified; $ii <= strlen($suffix); $ii++) {
|
|
$part = substr($suffix, 0, $ii);
|
|
if (isset($ids[$prefix.$part])) {
|
|
$result[$prefix.$part][] = $commit;
|
|
}
|
|
if (isset($ids[$part])) {
|
|
$result[$part][] = $commit;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach ($result as $identifier => $commits) {
|
|
if (count($commits) == 1) {
|
|
$result[$identifier] = head($commits);
|
|
} else {
|
|
// This reference is ambiguous -- it matches more than one commit -- so
|
|
// don't link it. We could potentially improve this, but it's a bit
|
|
// tricky since the superclass expects a single object.
|
|
unset($result[$identifier]);
|
|
}
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
}
|