Page MenuHomePhabricator

D7754.diff

diff --git a/src/applications/phame/controller/PhameResourceController.php b/src/applications/phame/controller/PhameResourceController.php
--- a/src/applications/phame/controller/PhameResourceController.php
+++ b/src/applications/phame/controller/PhameResourceController.php
@@ -10,7 +10,7 @@
private $name;
private $root;
- protected function getRootDirectory() {
+ protected function getRootDirectory($module) {
return $this->root;
}
diff --git a/src/infrastructure/celerity/CelerityPhabricatorResourceController.php b/src/infrastructure/celerity/CelerityPhabricatorResourceController.php
--- a/src/infrastructure/celerity/CelerityPhabricatorResourceController.php
+++ b/src/infrastructure/celerity/CelerityPhabricatorResourceController.php
@@ -14,8 +14,8 @@
private $hash;
private $package;
- protected function getRootDirectory() {
- $root = dirname(phutil_get_library_root('phabricator'));
+ protected function getRootDirectory($module) {
+ $root = dirname(phutil_get_library_root($module));
return $root.'/webroot/';
}
diff --git a/src/infrastructure/celerity/CelerityResourceController.php b/src/infrastructure/celerity/CelerityResourceController.php
--- a/src/infrastructure/celerity/CelerityResourceController.php
+++ b/src/infrastructure/celerity/CelerityResourceController.php
@@ -2,7 +2,7 @@
abstract class CelerityResourceController extends PhabricatorController {
- abstract protected function getRootDirectory();
+ abstract protected function getRootDirectory($module);
protected function buildResourceTransformer() {
return null;
@@ -16,8 +16,8 @@
return false;
}
- private function getDiskPath($to_resource = null) {
- return $this->getRootDirectory().$to_resource;
+ private function getDiskPath($module, $to_resource = null) {
+ return $this->getRootDirectory($module).$to_resource;
}
protected function serveResource($path, $package_hash = null) {
@@ -44,23 +44,29 @@
if ($package_hash) {
$map = CelerityResourceMap::getInstance();
$paths = $map->resolvePackage($package_hash);
+ $module = $map->resolvePackageModule($package_hash);
if (!$paths) {
return new Aphront404Response();
}
try {
$data = array();
foreach ($paths as $package_path) {
- $disk_path = $this->getDiskPath($package_path);
+ $disk_path = $this->getDiskPath($module, $package_path);
$data[] = Filesystem::readFile($disk_path);
}
$data = implode("\n\n", $data);
} catch (Exception $ex) {
return new Aphront404Response();
}
} else {
+ $map = CelerityResourceMap::getInstance();
+ $info = $map->lookupFileInformation('/'.$path);
+ if ($info === null) {
+ return new Aphront404Response();
+ }
try {
- $disk_path = $this->getDiskPath($path);
+ $disk_path = $this->getDiskPath($info['module'], $info['disk']);
$data = Filesystem::readFile($disk_path);
} catch (Exception $ex) {
return new Aphront404Response();
diff --git a/src/infrastructure/celerity/CelerityResourceMap.php b/src/infrastructure/celerity/CelerityResourceMap.php
--- a/src/infrastructure/celerity/CelerityResourceMap.php
+++ b/src/infrastructure/celerity/CelerityResourceMap.php
@@ -18,21 +18,45 @@
public static function getInstance() {
if (empty(self::$instance)) {
self::$instance = new CelerityResourceMap();
- $root = phutil_get_library_root('phabricator');
-
- $path = PhabricatorEnv::getEnvConfig('celerity.resource-path');
- $ok = include_once $root.'/'.$path;
- if (!$ok) {
- throw new Exception(
- "Failed to load Celerity resource map! Check the ".
- "'celerity.resource-path' setting in your configuration.");
+
+ $bootloader = PhutilBootloader::getInstance();
+
+ foreach ($bootloader->getAllLibraries() as $name) {
+ if ($name === 'phabricator') {
+ $path = PhabricatorEnv::getEnvConfig('celerity.resource-path');
+ } else {
+ $path = '/../src/__celerity_resource_map__.php';
+ }
+
+ $root = phutil_get_library_root($name);
+ if ($name === 'phabricator' || file_exists($root.'/'.$path)) {
+ $ok = include_once $root.'/'.$path;
+ if (!$ok) {
+ if ($name === 'phabricator') {
+ throw new Exception(
+ "Failed to load Celerity resource map! Check the ".
+ "'celerity.resource-path' setting in your configuration.");
+ } else {
+ throw new Exception(
+ "Failed to load Celerity resource map for '$name'.");
+ }
+ }
+ }
}
}
return self::$instance;
}
- public function setResourceMap($resource_map) {
- $this->resourceMap = $resource_map;
+ public function addResourceMap($resource_map) {
+ if ($this->resourceMap === null) {
+ $this->resourceMap = $resource_map;
+ return $this;
+ }
+
+ // We need to add to the resource map instead.
+ foreach ($resource_map as $key => $value) {
+ $this->resourceMap[$key] = $value;
+ }
return $this;
}
@@ -65,8 +89,19 @@
$map[$symbol] = $info;
}
- public function setPackageMap($package_map) {
- $this->packageMap = $package_map;
+ public function addPackageMap($package_map) {
+ if ($this->packageMap === null) {
+ $this->packageMap = $package_map;
+ return $this;
+ }
+
+ // We need to add to the package map instead.
+ foreach ($package_map["packages"] as $key => $value) {
+ $this->packageMap["packages"][$key] = $value;
+ }
+ foreach ($package_map["reverse"] as $key => $value) {
+ $this->packageMap["reverse"][$key] = $value;
+ }
return $this;
}
@@ -105,6 +140,15 @@
return $paths;
}
+ public function resolvePackageModule($package_hash) {
+ $package = idx($this->packageMap['packages'], $package_hash);
+ if (!$package) {
+ return null;
+ }
+
+ return $package['module'];
+ }
+
public function lookupSymbolInformation($symbol) {
return idx($this->resourceMap, $symbol);
}
diff --git a/src/infrastructure/celerity/map.php b/src/infrastructure/celerity/map.php
--- a/src/infrastructure/celerity/map.php
+++ b/src/infrastructure/celerity/map.php
@@ -8,6 +8,6 @@
*/
function celerity_register_resource_map(array $map, array $package_map) {
$instance = CelerityResourceMap::getInstance();
- $instance->setResourceMap($map);
- $instance->setPackageMap($package_map);
+ $instance->addResourceMap($map);
+ $instance->addPackageMap($package_map);
}

File Metadata

Mime Type
text/x-diff
Storage Engine
amazon-s3
Storage Format
Raw Data
Storage Handle
phabricator/zd/u4/6zc3zowzazdy4zke
Default Alt Text
D7754.diff (6 KB)

Event Timeline