Page MenuHomePhabricator

D21094.id50247.diff
No OneTemporary

D21094.id50247.diff

diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -437,6 +437,7 @@
'ArcanistSubversionAPI' => 'repository/api/ArcanistSubversionAPI.php',
'ArcanistSubversionWorkingCopy' => 'workingcopy/ArcanistSubversionWorkingCopy.php',
'ArcanistSummaryLintRenderer' => 'lint/renderer/ArcanistSummaryLintRenderer.php',
+ 'ArcanistSymbolEngine' => 'ref/symbol/ArcanistSymbolEngine.php',
'ArcanistSymbolRef' => 'ref/symbol/ArcanistSymbolRef.php',
'ArcanistSyntaxErrorXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistSyntaxErrorXHPASTLinterRule.php',
'ArcanistSystemConfigurationSource' => 'config/source/ArcanistSystemConfigurationSource.php',
@@ -1381,7 +1382,10 @@
'ArcanistReusedIteratorXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase',
'ArcanistRevertWorkflow' => 'ArcanistWorkflow',
'ArcanistRevisionCommitMessageHardpointQuery' => 'ArcanistWorkflowHardpointQuery',
- 'ArcanistRevisionRef' => 'ArcanistRef',
+ 'ArcanistRevisionRef' => array(
+ 'ArcanistRef',
+ 'ArcanistDisplayRefInterface',
+ ),
'ArcanistRevisionRefSource' => 'Phobject',
'ArcanistRevisionSymbolHardpointQuery' => 'ArcanistWorkflowHardpointQuery',
'ArcanistRevisionSymbolRef' => 'ArcanistSymbolRef',
@@ -1417,6 +1421,7 @@
'ArcanistSubversionAPI' => 'ArcanistRepositoryAPI',
'ArcanistSubversionWorkingCopy' => 'ArcanistWorkingCopy',
'ArcanistSummaryLintRenderer' => 'ArcanistLintRenderer',
+ 'ArcanistSymbolEngine' => 'Phobject',
'ArcanistSymbolRef' => 'ArcanistRef',
'ArcanistSyntaxErrorXHPASTLinterRule' => 'ArcanistXHPASTLinterRule',
'ArcanistSystemConfigurationSource' => 'ArcanistFilesystemConfigurationSource',
diff --git a/src/ref/commit/ArcanistGitCommitSymbolCommitHardpointQuery.php b/src/ref/commit/ArcanistGitCommitSymbolCommitHardpointQuery.php
--- a/src/ref/commit/ArcanistGitCommitSymbolCommitHardpointQuery.php
+++ b/src/ref/commit/ArcanistGitCommitSymbolCommitHardpointQuery.php
@@ -76,6 +76,17 @@
$results[$key] = $hash_map[$symbol];
}
+ foreach ($results as $key => $result) {
+ if ($result === null) {
+ continue;
+ }
+
+ $ref = id(new ArcanistCommitRef())
+ ->setCommitHash($result);
+
+ $results[$key] = $ref;
+ }
+
yield $this->yieldMap($results);
}
diff --git a/src/ref/revision/ArcanistRevisionRef.php b/src/ref/revision/ArcanistRevisionRef.php
--- a/src/ref/revision/ArcanistRevisionRef.php
+++ b/src/ref/revision/ArcanistRevisionRef.php
@@ -1,7 +1,9 @@
<?php
final class ArcanistRevisionRef
- extends ArcanistRef {
+ extends ArcanistRef
+ implements
+ ArcanistDisplayRefInterface {
const HARDPOINT_COMMITMESSAGE = 'ref.revision.commitmessage';
@@ -77,4 +79,12 @@
return $this->sources;
}
+ public function getDisplayRefObjectName() {
+ return $this->getMonogram();
+ }
+
+ public function getDisplayRefTitle() {
+ return $this->getName();
+ }
+
}
diff --git a/src/ref/symbol/ArcanistSymbolEngine.php b/src/ref/symbol/ArcanistSymbolEngine.php
new file mode 100644
--- /dev/null
+++ b/src/ref/symbol/ArcanistSymbolEngine.php
@@ -0,0 +1,78 @@
+<?php
+
+final class ArcanistSymbolEngine
+ extends Phobject {
+
+ private $workflow;
+ private $refs = array();
+
+ public function setWorkflow($workflow) {
+ $this->workflow = $workflow;
+ return $this;
+ }
+
+ public function getWorkflow() {
+ return $this->workflow;
+ }
+
+ public function loadRevisionForSymbol($symbol) {
+ $refs = $this->loadRevisionsForSymbols(array($symbol));
+ return head($refs)->getObject();
+ }
+
+ public function loadRevisionsForSymbols(array $symbols) {
+ return $this->loadRefsForSymbols(
+ new ArcanistRevisionSymbolRef(),
+ $symbols);
+ }
+
+ public function loadUserForSymbol($symbol) {
+ $refs = $this->loadUsersForSymbols(array($symbol));
+ return head($refs)->getObject();
+ }
+
+ public function loadUsersForSymbols(array $symbols) {
+ return $this->loadRefsForSymbols(
+ new ArcanistUserSymbolRef(),
+ $symbols);
+ }
+
+ public function loadCommitForSymbol($symbol) {
+ $refs = $this->loadCommitsForSymbols(array($symbol));
+ return head($refs)->getObject();
+ }
+
+ public function loadCommitsForSymbols(array $symbols) {
+ return $this->loadRefsForSymbols(
+ new ArcanistCommitSymbolRef(),
+ $symbols);
+ }
+
+ public function loadRefsForSymbols(
+ ArcanistSymbolRef $template,
+ array $symbols) {
+
+ $refs = array();
+ $load_refs = array();
+ foreach ($symbols as $symbol) {
+ $ref = id(clone $template)
+ ->setSymbol($symbol);
+
+ $ref_key = $ref->getSymbolEngineCacheKey();
+ if (!isset($this->refs[$ref_key])) {
+ $this->refs[$ref_key] = $ref;
+ $load_refs[] = $ref;
+ }
+
+ $refs[$symbol] = $ref;
+ }
+
+ $workflow = $this->getWorkflow();
+ if ($load_refs) {
+ $workflow->loadHardpoints($refs, ArcanistSymbolRef::HARDPOINT_OBJECT);
+ }
+
+ return $refs;
+ }
+
+}
diff --git a/src/ref/symbol/ArcanistSymbolRef.php b/src/ref/symbol/ArcanistSymbolRef.php
--- a/src/ref/symbol/ArcanistSymbolRef.php
+++ b/src/ref/symbol/ArcanistSymbolRef.php
@@ -4,6 +4,7 @@
extends ArcanistRef {
private $symbol;
+ private $cacheKey;
const HARDPOINT_OBJECT = 'ref.symbol.object';
@@ -24,6 +25,27 @@
return $this->symbol;
}
+ final public function getSymbolEngineCacheKey() {
+ if ($this->cacheKey === null) {
+ $parts = array();
+ $parts[] = sprintf('class(%s)', get_class($this));
+
+ foreach ($this->newCacheKeyParts() as $part) {
+ $parts[] = $part;
+ }
+
+ $parts[] = $this->getSymbol();
+
+ $this->cacheKey = implode('.', $parts);
+ }
+
+ return $this->cacheKey;
+ }
+
+ protected function newCacheKeyParts() {
+ return array();
+ }
+
final public function attachObject(ArcanistRef $object) {
return $this->attachHardpoint(self::HARDPOINT_OBJECT, $object);
}
@@ -36,6 +58,4 @@
return $symbol;
}
-
-
}
diff --git a/src/ref/user/ArcanistUserRef.php b/src/ref/user/ArcanistUserRef.php
--- a/src/ref/user/ArcanistUserRef.php
+++ b/src/ref/user/ArcanistUserRef.php
@@ -34,8 +34,6 @@
}
public function getRealName() {
- var_dump($this->parameters);
-
return idxv($this->parameters, array('fields', 'realName'));
}
diff --git a/src/ref/user/ArcanistUserSymbolRef.php b/src/ref/user/ArcanistUserSymbolRef.php
--- a/src/ref/user/ArcanistUserSymbolRef.php
+++ b/src/ref/user/ArcanistUserSymbolRef.php
@@ -14,6 +14,12 @@
return pht('User Symbol "%s"', $this->getSymbol());
}
+ protected function newCacheKeyParts() {
+ return array(
+ sprintf('type(%s)', $this->type),
+ );
+ }
+
public function getSymbolType() {
return $this->type;
}
diff --git a/src/workflow/ArcanistWorkflow.php b/src/workflow/ArcanistWorkflow.php
--- a/src/workflow/ArcanistWorkflow.php
+++ b/src/workflow/ArcanistWorkflow.php
@@ -76,7 +76,9 @@
private $configurationEngine;
private $configurationSourceList;
+ private $viewer;
private $hardpointEngine;
+ private $symbolEngine;
private $promptMap;
final public function setToolset(ArcanistToolset $toolset) {
@@ -2298,7 +2300,7 @@
->setExecutableFuture($future);
}
- final protected function loadHardpoints(
+ final public function loadHardpoints(
$objects,
$requests) {
@@ -2401,4 +2403,32 @@
return clone $prompt;
}
+ final protected function getSymbolEngine() {
+ if ($this->symbolEngine === null) {
+ $this->symbolEngine = $this->newSymbolEngine();
+ }
+ return $this->symbolEngine;
+ }
+
+ private function newSymbolEngine() {
+ return id(new ArcanistSymbolEngine())
+ ->setWorkflow($this);
+ }
+
+ final protected function getViewer() {
+ if (!$this->viewer) {
+ $viewer = $this->getSymbolEngine()
+ ->loadUserForSymbol('viewer()');
+
+ // TODO: Deal with anonymous stuff.
+ if (!$viewer) {
+ throw new Exception(pht('No viewer!'));
+ }
+
+ $this->viewer = $viewer;
+ }
+
+ return $this->viewer;
+ }
+
}

File Metadata

Mime Type
text/plain
Expires
Tue, Apr 1, 10:28 PM (1 w, 3 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7718778
Default Alt Text
D21094.id50247.diff (8 KB)

Event Timeline