From 31fe2880723a9fcf5cc1a4c35bc8a4816f0f3a0c Mon Sep 17 00:00:00 2001 From: "Martin Studer, fluxlabs ag" Date: Thu, 31 Mar 2022 21:30:04 -0400 Subject: [PATCH] example, gitclonestatehandler --- .gitignore | 1 + CHANGELOG.md | 13 +++-- bin/downloadSources.php | 12 ++++- composer.json | 2 +- composer.lock | 2 +- examples/ilias/run.sh | 1 + examples/ilias/sourceList.yaml | 5 ++ schemas/sources/sourceList.yaml | 15 ++++-- src/Adapters/Api/SourceDownloaderApi.php | 8 +-- src/Adapters/Configs/Env.php | 4 +- src/Adapters/Configs/Outbounds.php | 51 +++++++++++++------ .../Application/DownloadHandlers/Command.php | 8 ++- .../DownloadHandlers/DownloadTarGzHandler.php | 4 +- .../GitCloneCommandHandler.php | 42 +++++++++++++++ .../GitCloneStateCommandHandler.php | 42 +++++++++++++++ .../DownloadHandlers/GitCommandHandler.php | 36 ------------- .../Application/Processes/DownloadCommand.php | 43 ++++++++++++---- .../Application/Processes/DownloadProcess.php | 8 ++- src/Core/Ports/Configs/Outbounds.php | 4 +- src/Core/Ports/Service.php | 4 +- vendor/composer/autoload_classmap.php | 3 +- vendor/composer/autoload_static.php | 3 +- vendor/composer/installed.php | 24 ++++----- 23 files changed, 230 insertions(+), 105 deletions(-) create mode 100644 .gitignore create mode 100644 examples/ilias/run.sh create mode 100644 examples/ilias/sourceList.yaml create mode 100644 src/Core/Application/DownloadHandlers/GitCloneCommandHandler.php create mode 100644 src/Core/Application/DownloadHandlers/GitCloneStateCommandHandler.php delete mode 100644 src/Core/Application/DownloadHandlers/GitCommandHandler.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..485dee6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea diff --git a/CHANGELOG.md b/CHANGELOG.md index 4762565..390864b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,15 @@ # CHANGELOG -## [1.0.0] -- first version +## [1.0.3] +- added example +- added gitCloneStateHandler +- added shell argument handling + +## [1.0.2] +- added flux-publisher ## [1.0.1] - fixed bug with env variables -## [1.0.2] -- added flux-publisher +## [1.0.0] +- first version \ No newline at end of file diff --git a/bin/downloadSources.php b/bin/downloadSources.php index 6b4c3e7..df6c645 100644 --- a/bin/downloadSources.php +++ b/bin/downloadSources.php @@ -4,5 +4,15 @@ use FluxEco\SourceDownloader\Adapters\Api\SourceDownloaderApi; -$api = SourceDownloaderApi::new(); +$sourceListFile = null; +$volumePath = null; +$gitGetFullClone = null; + +if (count($argv) === 4) { + $sourceListFile = __DIR__ . '/' . $argv[1]; + $volumePath = $argv[2]; + $gitGetFullClone = (bool)$argv[3]; +} + +$api = SourceDownloaderApi::new($sourceListFile, $volumePath, $gitGetFullClone); $api->downloadSources(); \ No newline at end of file diff --git a/composer.json b/composer.json index e34dc01..cdd230b 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,7 @@ { "name": "flux-eco/source-downloader", "description": "Component for flux-capacitor apps developed by fluxlabs", - "version": "1.0.2", + "version": "1.0.3", "type": "flux-eco", "keywords": [ "FluxCapacitor", diff --git a/composer.lock b/composer.lock index d99d2eb..312001b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "67bce431eb374c10b233d322b9e15890", + "content-hash": "75ebb59895d6a67e0c6f5db4c4e0950f", "packages": [ { "name": "flux-eco/shell-executor", diff --git a/examples/ilias/run.sh b/examples/ilias/run.sh new file mode 100644 index 0000000..9e2bfee --- /dev/null +++ b/examples/ilias/run.sh @@ -0,0 +1 @@ +php ../../bin/downloadSources.php '../examples/ilias/sourceList.yaml' '/tmp' 0 \ No newline at end of file diff --git a/examples/ilias/sourceList.yaml b/examples/ilias/sourceList.yaml new file mode 100644 index 0000000..3e2bfa0 --- /dev/null +++ b/examples/ilias/sourceList.yaml @@ -0,0 +1,5 @@ +- sourceType: git + url: https://github.com/fluxapps/SrContainerObjectMenu.git + directoryPath: /var/www/ilias/Customizing/global/plugins/Services/UIComponent/UserInterfaceHook + directoryName: SrContainerObjectMenu + tag: v2.5.7 \ No newline at end of file diff --git a/schemas/sources/sourceList.yaml b/schemas/sources/sourceList.yaml index 11d2791..3e68f26 100644 --- a/schemas/sources/sourceList.yaml +++ b/schemas/sources/sourceList.yaml @@ -1,3 +1,4 @@ +$schema: "https://raw.githubusercontent.com/flux-eco/source-downloader/main/schemas/sources/sourceList.yaml" type: array items: oneOf: @@ -7,15 +8,21 @@ items: const: git url: type: string - localPath: + directoryPath: type: string - required: [sourceType, url, localPath] + directoryName: + type: string + tag: + type: string + required: [sourceType, url, directoryPath, directoryName, tag] - type: object properties: sourceType: const: tar-gz url: type: string - localPath: + directoryPath: + type: string + directoryName: type: string - required: [sourceType, url, localPath] \ No newline at end of file + required: [sourceType, url, directoryPath, directoryName] \ No newline at end of file diff --git a/src/Adapters/Api/SourceDownloaderApi.php b/src/Adapters/Api/SourceDownloaderApi.php index bbdb695..ea8898a 100644 --- a/src/Adapters/Api/SourceDownloaderApi.php +++ b/src/Adapters/Api/SourceDownloaderApi.php @@ -13,13 +13,13 @@ private function __construct(Ports\Service $service) $this->service = $service; } - public static function new() : self + public static function new(?string $sourceListFile = null, ?string $volumePath = null, ?bool $gitGetFullClone = null) : self { - $apiGatewayService = Ports\Service::new(Adapters\Configs\Outbounds::new()); + $apiGatewayService = Ports\Service::new(Adapters\Configs\Outbounds::new($sourceListFile, $volumePath, $gitGetFullClone)); return new self($apiGatewayService); } - public function downloadSources(?string $sourceListFile = null, ?string $volumePath = null) { - $this->service->downloadSources($sourceListFile, $volumePath); + public function downloadSources() { + $this->service->downloadSources(); } } \ No newline at end of file diff --git a/src/Adapters/Configs/Env.php b/src/Adapters/Configs/Env.php index fa11d32..585134a 100644 --- a/src/Adapters/Configs/Env.php +++ b/src/Adapters/Configs/Env.php @@ -4,5 +4,7 @@ class Env { - public const SOURCE_DOWNLOADER_SOURCE_LIST_FILE = 'SOURCE_DOWNLOADER_SOURCE_LIST_FILE'; + public const GIT_FULL_CLONE = 'SOURCE_DOWNLOADER_GIT_FULL_CLONE'; + public const SOURCE_LIST_FILE = 'SOURCE_DOWNLOADER_SOURCE_LIST_FILE'; + public const VOLUME_PATH = 'SOURCE_DOWNLOADER_VOLUME_PATH'; } \ No newline at end of file diff --git a/src/Adapters/Configs/Outbounds.php b/src/Adapters/Configs/Outbounds.php index 8863177..34f88ab 100644 --- a/src/Adapters/Configs/Outbounds.php +++ b/src/Adapters/Configs/Outbounds.php @@ -6,15 +6,33 @@ class Outbounds implements Ports\Configs\Outbounds { + private string $sourceListFile; + private string $volumePath; + private bool $gitGetFullClone; - private function __construct() + private function __construct(string $sourceListFile, string $volumePath, bool $gitGetFullClone) { - + $this->sourceListFile = $sourceListFile; + $this->volumePath = $volumePath; + $this->gitGetFullClone = $gitGetFullClone; } - public static function new() : self - { - return new self(); + public static function new( + ?string $sourceListFile = null, + ?string $volumePath = null, + ?bool $gitGetFullClone = null + ) : self { + if (is_null($sourceListFile) === true) { + $sourceListFile = getenv(Env::SOURCE_LIST_FILE); + } + if (is_null($volumePath) === true) { + $volumePath = getenv(Env::VOLUME_PATH); + } + if (is_null($gitGetFullClone) === true) { + $gitGetFullClone = getenv(Env::GIT_FULL_CLONE); + } + + return new self($sourceListFile, $volumePath, $gitGetFullClone); } public function getShellExecutorClient() : Ports\ShellExecutor\ShellExecutorClient @@ -22,18 +40,19 @@ public function getShellExecutorClient() : Ports\ShellExecutor\ShellExecutorClie return Adapters\ShellExecutor\ShellExecutorClient::new(); } - public function getSourceList(?string $sourceListFile, ?string $volumePath) : array + public function getGitFullClone() : bool { - if ($sourceListFile !== null) { - $sources = yaml_parse(file_get_contents($sourceListFile)); - $transformedSources = []; - foreach ($sources as $source) { - $source['localPath'] = $volumePath . $source['localPath']; - $transformedSources[] = $source; - } - return $transformedSources; - } + return $this->gitGetFullClone; + } - return yaml_parse(file_get_contents(getenv(Env::SOURCE_DOWNLOADER_SOURCE_LIST_FILE))); + public function getSourceList() : array + { + $sources = yaml_parse(file_get_contents($this->sourceListFile)); + $transformedSources = []; + foreach ($sources as $source) { + $source['directoryPath'] = $this->volumePath . $source['directoryPath']; + $transformedSources[] = $source; + } + return $transformedSources; } } diff --git a/src/Core/Application/DownloadHandlers/Command.php b/src/Core/Application/DownloadHandlers/Command.php index 3c5cafa..4ad8021 100644 --- a/src/Core/Application/DownloadHandlers/Command.php +++ b/src/Core/Application/DownloadHandlers/Command.php @@ -6,7 +6,11 @@ interface Command { public function getSourceType() : string; - public function getPath() : string; - public function getUrl() : string; + + public function getDirectoryPath() : string; + + public function getDirectoryName() : string; + + public function getTag() : string; } \ No newline at end of file diff --git a/src/Core/Application/DownloadHandlers/DownloadTarGzHandler.php b/src/Core/Application/DownloadHandlers/DownloadTarGzHandler.php index 9495346..a819bbe 100644 --- a/src/Core/Application/DownloadHandlers/DownloadTarGzHandler.php +++ b/src/Core/Application/DownloadHandlers/DownloadTarGzHandler.php @@ -27,8 +27,8 @@ public function handle(Command $command) : void return; } - $createDirectory = 'mkdir -p ' . $command->getPath(); - $cdDirectory = 'cd ' . $command->getPath(); + $createDirectory = 'mkdir -p ' . $command->getDirectoryPath() . '/' . $command->getDirectoryName(); + $cdDirectory = 'cd ' . $command->getDirectoryPath() . '/' . $command->getDirectoryName(); $curlUrl = 'curl -SL ' . $command->getUrl() . ' | tar -xz --strip-components=1'; $this->shellExecutorClient->execute([$createDirectory, $cdDirectory, $curlUrl]); diff --git a/src/Core/Application/DownloadHandlers/GitCloneCommandHandler.php b/src/Core/Application/DownloadHandlers/GitCloneCommandHandler.php new file mode 100644 index 0000000..f77f3f3 --- /dev/null +++ b/src/Core/Application/DownloadHandlers/GitCloneCommandHandler.php @@ -0,0 +1,42 @@ +shellExecutorClient = $shellExecutorClient; + $this->gitFullClone = $gitFullClone; + $this->process = $process; + } + + public static function new(Ports\Configs\Outbounds $outbounds, Process $process) : self + { + return new self($outbounds->getShellExecutorClient(), $outbounds->getGitFullClone(), $process); + } + + public function handle(Command $command) : void + { + if ($command->getSourceType() !== Models\SourceTypeEnum::GIT || $this->gitFullClone === false) { + $this->process->process($command); + return; + } + + $deleteDirectory = 'rm -r ' . $command->getDirectoryPath(); + $createDirectory = 'mkdir -p ' . $command->getDirectoryPath(); + $cdDirectory = 'cd ' . $command->getDirectoryPath(); + $cloneRepository = 'git clone --branch ' . $command->getTag() . ' ' . $command->getUrl() . ' ' . $command->getDirectoryName(); + + $this->shellExecutorClient->execute([$deleteDirectory, $createDirectory, $cdDirectory, $cloneRepository]); + } +} \ No newline at end of file diff --git a/src/Core/Application/DownloadHandlers/GitCloneStateCommandHandler.php b/src/Core/Application/DownloadHandlers/GitCloneStateCommandHandler.php new file mode 100644 index 0000000..5e2a98d --- /dev/null +++ b/src/Core/Application/DownloadHandlers/GitCloneStateCommandHandler.php @@ -0,0 +1,42 @@ +shellExecutorClient = $shellExecutorClient; + $this->gitFullClone = $gitFullClone; + $this->process = $process; + } + + public static function new(Ports\Configs\Outbounds $outbounds, Process $process) : self + { + return new self($outbounds->getShellExecutorClient(), $outbounds->getGitFullClone(), $process); + } + + public function handle(Command $command) : void + { + if ($command->getSourceType() !== Models\SourceTypeEnum::GIT || $this->gitFullClone === true) { + $this->process->process($command); + return; + } + + $deleteDirectory = 'rm -r ' . $command->getDirectoryPath(); + $createDirectory = 'mkdir -p ' . $command->getDirectoryPath(); + $cdDirectory = 'cd ' . $command->getDirectoryPath(); + $cloneRepository = 'git clone --depth 1 --branch '.$command->getTag() .' '. $command->getUrl().' '.$command->getDirectoryName(); + + $this->shellExecutorClient->execute([$deleteDirectory, $createDirectory, $cdDirectory, $cloneRepository]); + } +} \ No newline at end of file diff --git a/src/Core/Application/DownloadHandlers/GitCommandHandler.php b/src/Core/Application/DownloadHandlers/GitCommandHandler.php deleted file mode 100644 index 7e34283..0000000 --- a/src/Core/Application/DownloadHandlers/GitCommandHandler.php +++ /dev/null @@ -1,36 +0,0 @@ -shellExecutorClient = $shellExecutorClient; - $this->process = $process; - } - - public static function new(Ports\Configs\Outbounds $outbounds, Process $process) : self - { - return new self($outbounds->getShellExecutorClient(), $process); - } - - public function handle(Command $command) : void - { - if ($command->getSourceType() !== Models\SourceTypeEnum::GIT) { - $this->process->process($command); - return; - } - - $createDirectory = 'mkdir -p ' . $command->getPath(); - $cdDirectory = 'cd ' . $command->getPath(); - $cloneRepository = 'git clone ' . $command->getUrl(); - - $this->shellExecutorClient->execute([$createDirectory, $cdDirectory, $cloneRepository]); - } -} \ No newline at end of file diff --git a/src/Core/Application/Processes/DownloadCommand.php b/src/Core/Application/Processes/DownloadCommand.php index 81fd0ba..a6ef421 100644 --- a/src/Core/Application/Processes/DownloadCommand.php +++ b/src/Core/Application/Processes/DownloadCommand.php @@ -7,25 +7,38 @@ class DownloadCommand implements DownloadHandlers\Command { private string $sourceType; - private string $path; private string $url; + private string $directoryPath; + private string $directoryName; + private string $tag; private function __construct( string $sourceType, - string $path, - string $url + string $url, + string $directoryPath, + string $directoryName, + string $tag ) { $this->sourceType = $sourceType; - $this->path = $path; $this->url = $url; + $this->directoryPath = $directoryPath; + $this->directoryName = $directoryName; + $this->tag = $tag; } public static function fromArray(array $source) : self { + $tag = ''; + if(key_exists('tag', $source)) { + $tag = $source['tag']; + } + return new self( $source['sourceType'], - $source['localPath'], - $source['url'] + $source['url'], + $source['directoryPath'], + $source['directoryName'], + $tag ); } @@ -34,13 +47,23 @@ public function getSourceType() : string return $this->sourceType; } - public function getPath() : string + public function getUrl() : string { - return $this->path; + return $this->url; } - public function getUrl() : string + public function getdirectoryPath() : string { - return $this->url; + return $this->directoryPath; + } + + public function getDirectoryName() : string + { + return $this->directoryName; + } + + public function getTag() : string + { + return $this->tag; } } \ No newline at end of file diff --git a/src/Core/Application/Processes/DownloadProcess.php b/src/Core/Application/Processes/DownloadProcess.php index 008e4c8..588131f 100644 --- a/src/Core/Application/Processes/DownloadProcess.php +++ b/src/Core/Application/Processes/DownloadProcess.php @@ -17,7 +17,8 @@ private function __construct(Ports\Configs\Outbounds $outbounds) $this->outbounds = $outbounds; $this->handlerQueue = [ DownloadHandlers\DownloadTarGzHandler::new($outbounds, $this), - DownloadHandlers\GitCommandHandler::new($outbounds, $this), + DownloadHandlers\GitCloneCommandHandler::new($outbounds, $this), + DownloadHandlers\GitCloneStateCommandHandler::new($outbounds, $this), $this ]; } @@ -34,10 +35,7 @@ public function handle(DownloadHandlers\Command $command) : void public function process(DownloadHandlers\Command $command) : void { - $nextHandler = $this->handlerQueue[0]; - unset($this->handlerQueue[0]); // remove item at index 0 - $this->handlerQueue = array_values($this->handlerQueue); // 'reindex' array - + $nextHandler = array_shift($this->handlerQueue); $nextHandler->handle($command); } } \ No newline at end of file diff --git a/src/Core/Ports/Configs/Outbounds.php b/src/Core/Ports/Configs/Outbounds.php index fa08f99..bea963e 100644 --- a/src/Core/Ports/Configs/Outbounds.php +++ b/src/Core/Ports/Configs/Outbounds.php @@ -7,6 +7,6 @@ interface Outbounds { public function getShellExecutorClient() : Ports\ShellExecutor\ShellExecutorClient; - - public function getSourceList(?string $sourceListFile, ?string $volumePath) : array; + public function getGitFullClone() : bool; + public function getSourceList() : array; } \ No newline at end of file diff --git a/src/Core/Ports/Service.php b/src/Core/Ports/Service.php index bf4de3e..3644977 100644 --- a/src/Core/Ports/Service.php +++ b/src/Core/Ports/Service.php @@ -18,9 +18,9 @@ public static function new(Configs\Outbounds $outbounds) : self return new self($outbounds); } - public function downloadSources(?string $sourceListFile, ?string $volumePath) + public function downloadSources() { - $sourceList = $this->outbounds->getSourceList($sourceListFile, $volumePath); + $sourceList = $this->outbounds->getSourceList(); foreach ($sourceList as $source) { $process = Processes\DownloadProcess::new($this->outbounds); diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 3ec29bf..1855d73 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -22,7 +22,8 @@ 'FluxEco\\SourceDownloader\\Core\\Application\\DownloadHandlers\\Command' => $baseDir . '/src/Core/Application/DownloadHandlers/Command.php', 'FluxEco\\SourceDownloader\\Core\\Application\\DownloadHandlers\\CommandHandler' => $baseDir . '/src/Core/Application/DownloadHandlers/CommandHandler.php', 'FluxEco\\SourceDownloader\\Core\\Application\\DownloadHandlers\\DownloadTarGzHandler' => $baseDir . '/src/Core/Application/DownloadHandlers/DownloadTarGzHandler.php', - 'FluxEco\\SourceDownloader\\Core\\Application\\DownloadHandlers\\GitCommandHandler' => $baseDir . '/src/Core/Application/DownloadHandlers/GitCommandHandler.php', + 'FluxEco\\SourceDownloader\\Core\\Application\\DownloadHandlers\\GitCloneCommandHandler' => $baseDir . '/src/Core/Application/DownloadHandlers/GitCloneCommandHandler.php', + 'FluxEco\\SourceDownloader\\Core\\Application\\DownloadHandlers\\GitCloneStateCommandHandler' => $baseDir . '/src/Core/Application/DownloadHandlers/GitCloneStateCommandHandler.php', 'FluxEco\\SourceDownloader\\Core\\Application\\DownloadHandlers\\Process' => $baseDir . '/src/Core/Application/DownloadHandlers/Process.php', 'FluxEco\\SourceDownloader\\Core\\Application\\Processes\\DownloadCommand' => $baseDir . '/src/Core/Application/Processes/DownloadCommand.php', 'FluxEco\\SourceDownloader\\Core\\Application\\Processes\\DownloadProcess' => $baseDir . '/src/Core/Application/Processes/DownloadProcess.php', diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index f5486a2..1fc0194 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -42,7 +42,8 @@ class ComposerStaticInite3659ac4ea333622acc31277154af2d8 'FluxEco\\SourceDownloader\\Core\\Application\\DownloadHandlers\\Command' => __DIR__ . '/../..' . '/src/Core/Application/DownloadHandlers/Command.php', 'FluxEco\\SourceDownloader\\Core\\Application\\DownloadHandlers\\CommandHandler' => __DIR__ . '/../..' . '/src/Core/Application/DownloadHandlers/CommandHandler.php', 'FluxEco\\SourceDownloader\\Core\\Application\\DownloadHandlers\\DownloadTarGzHandler' => __DIR__ . '/../..' . '/src/Core/Application/DownloadHandlers/DownloadTarGzHandler.php', - 'FluxEco\\SourceDownloader\\Core\\Application\\DownloadHandlers\\GitCommandHandler' => __DIR__ . '/../..' . '/src/Core/Application/DownloadHandlers/GitCommandHandler.php', + 'FluxEco\\SourceDownloader\\Core\\Application\\DownloadHandlers\\GitCloneCommandHandler' => __DIR__ . '/../..' . '/src/Core/Application/DownloadHandlers/GitCloneCommandHandler.php', + 'FluxEco\\SourceDownloader\\Core\\Application\\DownloadHandlers\\GitCloneStateCommandHandler' => __DIR__ . '/../..' . '/src/Core/Application/DownloadHandlers/GitCloneStateCommandHandler.php', 'FluxEco\\SourceDownloader\\Core\\Application\\DownloadHandlers\\Process' => __DIR__ . '/../..' . '/src/Core/Application/DownloadHandlers/Process.php', 'FluxEco\\SourceDownloader\\Core\\Application\\Processes\\DownloadCommand' => __DIR__ . '/../..' . '/src/Core/Application/Processes/DownloadCommand.php', 'FluxEco\\SourceDownloader\\Core\\Application\\Processes\\DownloadProcess' => __DIR__ . '/../..' . '/src/Core/Application/Processes/DownloadProcess.php', diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index a5aabe8..39d1ad3 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -1,24 +1,15 @@ array( - 'pretty_version' => '1.0.0', - 'version' => '1.0.0.0', + 'pretty_version' => '1.0.2', + 'version' => '1.0.2.0', 'type' => 'flux-eco', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'reference' => NULL, - 'name' => 'flux-cap/source-downloader', + 'name' => 'flux-eco/source-downloader', 'dev' => true, ), 'versions' => array( - 'flux-cap/source-downloader' => array( - 'pretty_version' => '1.0.0', - 'version' => '1.0.0.0', - 'type' => 'flux-eco', - 'install_path' => __DIR__ . '/../../', - 'aliases' => array(), - 'reference' => NULL, - 'dev_requirement' => false, - ), 'flux-eco/shell-executor' => array( 'pretty_version' => '0.0.1', 'version' => '0.0.1.0', @@ -28,5 +19,14 @@ 'reference' => 'bf1dd67ecd242864449d42cb92a55a5c20357a98', 'dev_requirement' => false, ), + 'flux-eco/source-downloader' => array( + 'pretty_version' => '1.0.2', + 'version' => '1.0.2.0', + 'type' => 'flux-eco', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'reference' => NULL, + 'dev_requirement' => false, + ), ), );