From 99025c976b7d37a621343f20e39cfa6d0d3b5196 Mon Sep 17 00:00:00 2001 From: Owen Voke Date: Fri, 25 Aug 2023 09:41:09 +0100 Subject: [PATCH] fix: resolve Phar updater strategies This makes sure that the Phar name is set for the GitHub Releases strategy. --- src/Components/Updater/Provider.php | 28 +++++++++++++------ .../Strategy/Concerns/UsesPharName.php | 20 +++++++++++++ .../Updater/Strategy/GithubStrategy.php | 9 +++--- .../Updater/Strategy/GitlabStrategy.php | 9 +++--- src/Components/Updater/config/updater.php | 15 ++++++++++ 5 files changed, 62 insertions(+), 19 deletions(-) create mode 100644 src/Components/Updater/Strategy/Concerns/UsesPharName.php diff --git a/src/Components/Updater/Provider.php b/src/Components/Updater/Provider.php index 22cbace0..a168bb51 100644 --- a/src/Components/Updater/Provider.php +++ b/src/Components/Updater/Provider.php @@ -14,10 +14,12 @@ namespace LaravelZero\Framework\Components\Updater; use Humbug\SelfUpdate\Updater as PharUpdater; +use Illuminate\Contracts\Config\Repository as ConfigRepository; use LaravelZero\Framework\Components\AbstractComponentProvider; use LaravelZero\Framework\Components\Updater\Strategy\GithubStrategy; use LaravelZero\Framework\Components\Updater\Strategy\StrategyInterface; use LaravelZero\Framework\Providers\Build\Build; +use Phar; use function class_exists; @@ -31,7 +33,7 @@ final class Provider extends AbstractComponentProvider */ public function isAvailable(): bool { - return class_exists(\Humbug\SelfUpdate\Updater::class); + return class_exists(PharUpdater::class); } /** @@ -67,19 +69,27 @@ public function register(): void $this->app->singleton(Updater::class, function () use ($build) { $updater = new PharUpdater($build->getPath(), false, PharUpdater::STRATEGY_GITHUB); - $composer = json_decode(file_get_contents(base_path('composer.json')), true); - $name = $composer['name']; + $composer = json_decode(file_get_contents($this->app->basePath('composer.json')), true); - $strategy = $this->app['config']->get('updater.strategy', GithubStrategy::class); + /** @var ConfigRepository $config */ + $config = $this->app->make(ConfigRepository::class); - $updater->setStrategyObject($this->app->make($strategy)); + $strategyClass = $config->get('updater.strategy', GithubStrategy::class); - if ($updater->getStrategy() instanceof StrategyInterface) { - $updater->getStrategy()->setPackageName($name); + $updater->setStrategyObject($strategy = $this->app->make($strategyClass)); + + if ($strategy instanceof StrategyInterface) { + assert(isset($composer['name']), 'Package name has not been set in Composer'); + + $strategy->setPackageName($composer['name']); + } + + if (method_exists($strategy, 'setPharName')) { + $strategy->setPharName($config->get('updater.phar_name') ?? basename(Phar::running())); } - if (method_exists($updater->getStrategy(), 'setCurrentLocalVersion')) { - $updater->getStrategy()->setCurrentLocalVersion(config('app.version')); + if (method_exists($strategy, 'setCurrentLocalVersion')) { + $strategy->setCurrentLocalVersion($config->get('app.version')); } return new Updater($updater); diff --git a/src/Components/Updater/Strategy/Concerns/UsesPharName.php b/src/Components/Updater/Strategy/Concerns/UsesPharName.php new file mode 100644 index 00000000..4ac7d852 --- /dev/null +++ b/src/Components/Updater/Strategy/Concerns/UsesPharName.php @@ -0,0 +1,20 @@ +pharName = $name; + } + + public function getPharName(): string + { + return $this->pharName; + } +} diff --git a/src/Components/Updater/Strategy/GithubStrategy.php b/src/Components/Updater/Strategy/GithubStrategy.php index 1a2b6a67..8133c6e6 100644 --- a/src/Components/Updater/Strategy/GithubStrategy.php +++ b/src/Components/Updater/Strategy/GithubStrategy.php @@ -2,19 +2,18 @@ namespace LaravelZero\Framework\Components\Updater\Strategy; -use Phar; +use LaravelZero\Framework\Components\Updater\Strategy\Concerns\UsesPharName; final class GithubStrategy extends \Humbug\SelfUpdate\Strategy\GithubStrategy implements StrategyInterface { - /** - * Returns the Download Url. - */ + use UsesPharName; + protected function getDownloadUrl(array $package): string { $downloadUrl = parent::getDownloadUrl($package); $downloadUrl = str_replace('releases/download', 'raw', $downloadUrl); - return $downloadUrl.'/builds/'.basename(Phar::running()); + return "{$downloadUrl}/builds/{$this->getPharName()}"; } } diff --git a/src/Components/Updater/Strategy/GitlabStrategy.php b/src/Components/Updater/Strategy/GitlabStrategy.php index 88bd40c6..5654186d 100644 --- a/src/Components/Updater/Strategy/GitlabStrategy.php +++ b/src/Components/Updater/Strategy/GitlabStrategy.php @@ -2,19 +2,18 @@ namespace LaravelZero\Framework\Components\Updater\Strategy; -use Phar; +use LaravelZero\Framework\Components\Updater\Strategy\Concerns\UsesPharName; class GitlabStrategy extends \Humbug\SelfUpdate\Strategy\GithubStrategy implements StrategyInterface { - /** - * Returns the Download Url. - */ + use UsesPharName; + protected function getDownloadUrl(array $package): string { $downloadUrl = parent::getDownloadUrl($package); $downloadUrl = str_replace('releases/download', '-/raw', $downloadUrl); - return $downloadUrl.'/builds/'.basename(Phar::running()); + return "{$downloadUrl}/builds/{$this->getPharName()}"; } } diff --git a/src/Components/Updater/config/updater.php b/src/Components/Updater/config/updater.php index 127a8a5f..b8b8738d 100644 --- a/src/Components/Updater/config/updater.php +++ b/src/Components/Updater/config/updater.php @@ -17,4 +17,19 @@ 'strategy' => GithubStrategy::class, + /* + |-------------------------------------------------------------------------- + | Self-updater Phar Name + |-------------------------------------------------------------------------- + | + | Here you may specify the name of the Phar file, as stored on GitHub or + | GitLab. This can be configured if the Phar name is different to the + | name of the Phar file running on the users' machine. + | + | Default: `null` + | + */ + + 'phar_name' => null, + ];