Skip to content

Commit e3e8a4b

Browse files
committed
Refactor distribution features
1 parent ab2a987 commit e3e8a4b

21 files changed

Lines changed: 246 additions & 80 deletions

.symfony.local.yaml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ http:
33
port: 7015
44
use_gzip: true
55

6-
workers:
7-
messenger_consume:
8-
cmd: ['symfony', 'console', 'messenger:consume', 'async', 'scheduler_packages', '--sleep', '10']
9-
watch: ['config', 'src', 'templates']
6+
# todo the worker isn't doing anything for me at the moment
7+
#workers:
8+
# messenger_consume:
9+
# cmd: ['symfony', 'console', 'messenger:consume', '--all', '--sleep', '10']
10+
# watch: ['config', 'src', 'templates']

docs/configuration-reference.md

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,13 @@ dirigent:
2929
dynamic_update_delay: 'PT4H'
3030
periodic_updates: true
3131
periodic_update_interval: 'P1W'
32-
dist_mirroring:
32+
distributions:
3333
enabled: false
34-
preferred: true
34+
build: true
35+
mirror: false
36+
async_api_requests: false
3537
dev_packages: false
38+
preferred_mirror: true
3639
```
3740
3841
## dirigent (root)
@@ -107,18 +110,28 @@ The time between periodic updates being scheduled, defaults to once a week.
107110

108111
The time must be defined in the [ISO 8601 durations][iso-8601-durations] format.
109112

110-
## dist_mirroring
113+
## distributions
111114

112115
### enabled
113116

114117
Type: `boolean` | Default: `false`
115118

116-
Whether to enable or disable distribution mirroring
119+
Enable hosting of package distributions.
117120

118-
### preferred
121+
### build
122+
123+
Type: `boolean` | Default: `true`
124+
125+
Enable building distribution from the source.
126+
127+
### mirror
128+
129+
### async_api_requests
119130

120131
### dev_packages
121132

133+
### preferred_mirror
134+
122135
[iso-8601-durations]: https://en.wikipedia.org/wiki/ISO_8601#Durations
123136
[symfony]: https://symfony.com
124137
[symfony-docs-config]: https://symfony.com/doc/current/configuration.html

docs/dist-mirroring.md

Lines changed: 0 additions & 15 deletions
This file was deleted.

docs/distributions.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
sidebar_position: 31
3+
---
4+
5+
# Distributions
6+
7+
:::note
8+
9+
This page is a stub.
10+
11+
:::
12+
13+
Dirigent mirrors distributions from their original source if it's provided by the package, or builds the distribution
14+
from the source code.

docs/readme.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@ sidebar_position: 1
88
- [Introduction](introduction.md)
99
- [Installation](installation/readme.md)
1010
- [Getting Started](getting-started.md)
11+
12+
---
13+
1114
- [Automatic Package Updates](automatic-package-updates.md)
12-
- [Dist Mirroring](dist-mirroring.md)
15+
- [Distributions](distributions.md)
1316

1417
---
1518

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace DoctrineMigrations;
6+
7+
use Doctrine\DBAL\Schema\Schema;
8+
use Doctrine\Migrations\AbstractMigration;
9+
10+
final class Version20250609181654 extends AbstractMigration
11+
{
12+
public function getDescription(): string
13+
{
14+
return 'Add package distribution strategy';
15+
}
16+
17+
public function up(Schema $schema): void
18+
{
19+
$this->addSql(<<<'SQL'
20+
ALTER TABLE package ADD distribution_strategy VARCHAR(255) DEFAULT NULL
21+
SQL);
22+
$this->addSql(<<<'SQL'
23+
UPDATE package SET distribution_strategy = 'dynamic'
24+
SQL);
25+
$this->addSql(<<<'SQL'
26+
ALTER TABLE package ALTER distribution_strategy DROP DEFAULT
27+
SQL);
28+
}
29+
30+
public function down(Schema $schema): void
31+
{
32+
$this->addSql(<<<'SQL'
33+
ALTER TABLE package DROP distribution_strategy
34+
SQL);
35+
}
36+
}

src/Controller/ApiController.php

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public function root(RouterInterface $router): JsonResponse
5151
'notify-batch' => $router->generate('api_track_installations'),
5252
];
5353

54-
if ($this->getParameter('dirigent.dist_mirroring.enabled')) {
54+
if ($this->getParameter('dirigent.distributions.mirror')) {
5555
$distributionUrlPattern = u($router->getRouteCollection()->get('api_package_distribution')->getPath())
5656
->replace('{packageName}', '%package%')
5757
->replace('{packageVersion}', '%version%')
@@ -61,7 +61,7 @@ public function root(RouterInterface $router): JsonResponse
6161

6262
$data['mirrors'] = [[
6363
'dist-url' => $distributionUrlPattern,
64-
'preferred' => $this->getParameter('dirigent.dist_mirroring.preferred'),
64+
'preferred' => $this->getParameter('dirigent.distributions.preferred_mirror'),
6565
]];
6666
}
6767

@@ -104,7 +104,7 @@ public function packageMetadata(string $packageName): Response
104104
#[IsGrantedAccess]
105105
public function packageDistribution(string $packageName, string $packageVersion, string $reference, string $type): Response
106106
{
107-
if (!$this->getParameter('dirigent.dist_mirroring.enabled')) {
107+
if (!$this->getParameter('dirigent.distributions.enabled')) {
108108
throw new NotFoundHttpException();
109109
}
110110

@@ -113,17 +113,13 @@ public function packageDistribution(string $packageName, string $packageVersion,
113113
throw new NotFoundHttpException();
114114
}
115115

116-
if (null === $version = $this->versionRepository->findOneBy(['package' => $package, 'normalizedVersion' => $packageVersion])) {
117-
throw new NotFoundHttpException();
118-
}
116+
$this->messenger->dispatch(new UpdatePackage($package->getId()));
119117

120-
if ($version->isDevelopment() && !$this->getParameter('dirigent.dist_mirroring.dev_packages')) {
118+
if (null === $version = $this->versionRepository->findOneBy(['package' => $package, 'normalizedVersion' => $packageVersion])) {
121119
throw new NotFoundHttpException();
122120
}
123121

124-
$this->messenger->dispatch(new UpdatePackage($package->getId()));
125-
126-
if (!$this->distributionResolver->resolve($version, $reference, $type)) {
122+
if (!$this->distributionResolver->resolve($version, $reference, $type, async: $this->getParameter('dirigent.distributions.async_api_requests'))) {
127123
throw new NotFoundHttpException();
128124
}
129125
}

src/Controller/Dashboard/DashboardPackagesController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ public function edit(Request $request, string $packageName): Response
174174
return $this->redirectToRoute('dashboard_packages_info', ['packageName' => $package->getName()]);
175175
}
176176

177-
return $this->render('dashboard/packages/package_edit.html.twig', [
177+
return $this->render('dashboard/packages/edit.html.twig', [
178178
'package' => $package,
179179
'form' => $form,
180180
]);

src/DependencyInjection/DirigentConfiguration.php

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -76,17 +76,14 @@ public function getConfigTreeBuilder(): TreeBuilder
7676
->scalarNode('periodic_update_interval')->defaultValue('P1W')->end()
7777
->end()
7878
->end()
79-
->arrayNode('dist_builder')
80-
->canBeEnabled()
79+
->arrayNode('distributions')
80+
->canBeEnabled('Host the distributions of packages')
8181
->children()
82-
->booleanNode('dev_packages')->defaultFalse()->end()
83-
->end()
84-
->end()
85-
->arrayNode('dist_mirroring')
86-
->canBeEnabled()
87-
->children()
88-
->booleanNode('preferred')->defaultTrue()->end()
89-
->booleanNode('dev_packages')->defaultFalse()->end()
82+
->booleanNode('build')->defaultTrue()->info('Build distributions from the source code (if not already provided)')->end()
83+
->booleanNode('mirror')->defaultFalse()->info('Mirror distributions from the original source (if provided)')->end()
84+
->booleanNode('async_api_requests')->defaultFalse()->info('Fetch distributions asynchronously instead of during execution (from the API)')->end()
85+
->booleanNode('dev_versions')->defaultFalse()->info('Include distributions of development versions')->end()
86+
->booleanNode('preferred_mirror')->defaultFalse()->info('Force Composer to download distributions from this registry first')->end()
9087
->end()
9188
->end();
9289

src/DependencyInjection/DirigentExtension.php

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ protected function loadInternal(array $mergedConfig, ContainerBuilder $container
1919
$container->setParameter('dirigent.title', $mergedConfig['title']);
2020
$container->setParameter('dirigent.slug', $slug);
2121

22+
$this->registerDistributionsConfiguration($mergedConfig['distributions'], $container);
2223
$this->registerEncryptionConfiguration($mergedConfig['encryption'], $container);
2324

2425
$container->setParameter('dirigent.security.public_access', $mergedConfig['security']['public']);
@@ -34,20 +35,26 @@ protected function loadInternal(array $mergedConfig, ContainerBuilder $container
3435
$container->setParameter('dirigent.packages.dynamic_update_delay', $mergedConfig['packages']['dynamic_update_delay']);
3536
$container->setParameter('dirigent.packages.periodic_updates', $mergedConfig['packages']['periodic_updates']);
3637
$container->setParameter('dirigent.packages.periodic_update_interval', $mergedConfig['packages']['periodic_update_interval']);
37-
38-
$container->setParameter('dirigent.dist_builder.enabled', $mergedConfig['dist_builder']['enabled']);
39-
$container->setParameter('dirigent.dist_builder.dev_packages', $mergedConfig['dist_builder']['dev_packages']);
40-
41-
$container->setParameter('dirigent.dist_mirroring.enabled', $mergedConfig['dist_mirroring']['enabled']);
42-
$container->setParameter('dirigent.dist_mirroring.preferred', $mergedConfig['dist_mirroring']['preferred']);
43-
$container->setParameter('dirigent.dist_mirroring.dev_packages', $mergedConfig['dist_mirroring']['dev_packages']);
4438
}
4539

4640
public function getConfiguration(array $config, ContainerBuilder $container): ConfigurationInterface
4741
{
4842
return new DirigentConfiguration();
4943
}
5044

45+
private function registerDistributionsConfiguration(array $config, ContainerBuilder $container): void
46+
{
47+
$distributionsEnabled = $config['enabled'];
48+
49+
$container->setParameter('dirigent.distributions.enabled', $distributionsEnabled);
50+
$container->setParameter('dirigent.distributions.build', $distributionsEnabled && $config['build']);
51+
$container->setParameter('dirigent.distributions.mirror', $distributionsEnabled && $config['mirror']);
52+
53+
$container->setParameter('dirigent.distributions.async_api_requests', $config['async_api_requests']);
54+
$container->setParameter('dirigent.distributions.dev_versions', $config['dev_versions']);
55+
$container->setParameter('dirigent.distributions.preferred_mirror', $config['preferred_mirror']);
56+
}
57+
5158
/**
5259
* @param array{private_key: ?string, private_key_path: ?string, public_key: ?string, public_key_path: ?string, rotated_keys: array<string>, rotated_key_paths: array<string>} $config
5360
*/

0 commit comments

Comments
 (0)