Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15423652
D21094.id50247.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
8 KB
Referenced Files
None
Subscribers
None
D21094.id50247.diff
View Options
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
Details
Attached
Mime Type
text/plain
Expires
Sun, Mar 23, 4:31 PM (2 w, 5 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7718778
Default Alt Text
D21094.id50247.diff (8 KB)
Attached To
Mode
D21094: Add a "SymbolEngine" to support top-level ref resolution by symbol
Attached
Detach File
Event Timeline
Log In to Comment