Skip to content

Commit 1935865

Browse files
committed
Add mirror_vcs_repositories configuration option
1 parent ba93574 commit 1935865

10 files changed

Lines changed: 78 additions & 13 deletions

File tree

docs/configuration-reference.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ dirigent:
3333
enabled: false
3434
preferred: true
3535
dev_packages: false
36+
metadata:
37+
mirror_vcs_repositories: false
3638
```
3739
3840
## dirigent (root)
@@ -119,6 +121,16 @@ Whether to enable or disable distribution mirroring
119121

120122
### dev_packages
121123

124+
## metadata
125+
126+
### mirror_vcs_repositories
127+
128+
Type: `boolean` | Default: `false`
129+
130+
Fetch mirrored packages from their VCS repositories by default when possible.
131+
132+
Sets the fetch strategy of new mirrored packages to **Fetch from VCS**.
133+
122134
[iso-8601-durations]: https://en.wikipedia.org/wiki/ISO_8601#Durations
123135
[symfony]: https://symfony.com
124136
[symfony-docs-config]: https://symfony.com/doc/current/configuration.html

phpstan.dist.neon

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,10 @@ parameters:
1010
excludePaths:
1111
- tests/bootstrap.php
1212
ignoreErrors:
13+
- '#^Call to an undefined method Symfony\\Component\\Config\\Definition\\Builder\\NodeDefinition\:\:children\(\)\.$#'
1314
- '#CodedMonkey\\Dirigent\\Doctrine\\Entity\\AbstractVersionLink given\.#'
1415
- '#^PHPDoc tag @var with type CodedMonkey\\Dirigent\\Doctrine\\Entity\\AbstractVersionLink is not subtype of native type#'
1516
- '#^Property CodedMonkey\\Dirigent\\Doctrine\\Entity\\[a-zA-Z]+\:\:\$id \(int\|null\) is never assigned int so it can be removed from the property type\.$#'
16-
-
17-
message: '#^Call to an undefined method Symfony\\Component\\Config\\Definition\\Builder\\NodeDefinition\:\:children\(\)\.$#'
18-
identifier: method.notFound
19-
count: 1
20-
path: src/DependencyInjection/DirigentConfiguration.php
2117
-
2218
message: '#^Left side of \|\| is always false\.$#'
2319
identifier: booleanOr.leftAlwaysFalse

src/Controller/ApiController.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use CodedMonkey\Dirigent\Package\PackageMetadataResolver;
1414
use CodedMonkey\Dirigent\Package\PackageProviderManager;
1515
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
16+
use Symfony\Component\DependencyInjection\Attribute\Autowire;
1617
use Symfony\Component\HttpFoundation\BinaryFileResponse;
1718
use Symfony\Component\HttpFoundation\JsonResponse;
1819
use Symfony\Component\HttpFoundation\Request;
@@ -33,6 +34,8 @@ public function __construct(
3334
private readonly PackageDistributionResolver $distributionResolver,
3435
private readonly PackageProviderManager $providerManager,
3536
private readonly MessageBusInterface $messenger,
37+
#[Autowire(param: 'dirigent.metadata.mirror_vcs_repositories')]
38+
private readonly bool $mirrorVcsRepositories = false,
3639
) {
3740
}
3841

@@ -170,7 +173,7 @@ private function findPackage(string $packageName): ?Package
170173
$package = new Package();
171174
$package->setName($packageName);
172175
$package->setMirrorRegistry($registry);
173-
$package->setFetchStrategy(PackageFetchStrategy::Mirror);
176+
$package->setFetchStrategy($this->mirrorVcsRepositories ? PackageFetchStrategy::Vcs : PackageFetchStrategy::Mirror);
174177

175178
$this->packageRepository->save($package, true);
176179

src/Controller/Dashboard/DashboardPackagesController.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use CodedMonkey\Dirigent\Package\PackageMetadataResolver;
1515
use Doctrine\ORM\EntityManagerInterface;
1616
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
17+
use Symfony\Component\DependencyInjection\Attribute\Autowire;
1718
use Symfony\Component\HttpFoundation\Request;
1819
use Symfony\Component\HttpFoundation\Response;
1920
use Symfony\Component\Messenger\MessageBusInterface;
@@ -27,6 +28,8 @@ public function __construct(
2728
private readonly PackageRepository $packageRepository,
2829
private readonly PackageMetadataResolver $metadataResolver,
2930
private readonly MessageBusInterface $messenger,
31+
#[Autowire(param: 'dirigent.metadata.mirror_vcs_repositories')]
32+
private readonly bool $mirrorVcsRepositories = false,
3033
) {
3134
}
3235

@@ -104,7 +107,7 @@ public function addMirroring(Request $request): Response
104107
$package = new Package();
105108
$package->setName($packageName);
106109
$package->setMirrorRegistry($registry);
107-
$package->setFetchStrategy(PackageFetchStrategy::Mirror);
110+
$package->setFetchStrategy($this->mirrorVcsRepositories ? PackageFetchStrategy::Vcs : PackageFetchStrategy::Mirror);
108111

109112
$this->packageRepository->save($package, true);
110113

src/Controller/Dashboard/DashboardRegistryController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public function configureFields(string $pageName): iterable
6363
yield AssociationField::new('credentials')
6464
->onlyOnForms();
6565

66-
yield FormField::addPanel('Test');
66+
yield FormField::addPanel('Packages');
6767

6868
yield ChoiceField::new('packageMirroring')
6969
->setSortable(false)

src/DependencyInjection/DirigentConfiguration.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace CodedMonkey\Dirigent\DependencyInjection;
44

5+
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
6+
use Symfony\Component\Config\Definition\Builder\NodeDefinition;
57
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
68
use Symfony\Component\Config\Definition\ConfigurationInterface;
79
use function Symfony\Component\String\u;
@@ -84,6 +86,22 @@ public function getConfigTreeBuilder(): TreeBuilder
8486
->end()
8587
->end();
8688

89+
$this->addMetadataSection($rootNode);
90+
8791
return $treeBuilder;
8892
}
93+
94+
private function addMetadataSection(ArrayNodeDefinition|NodeDefinition $rootNode): void
95+
{
96+
$rootNode->children()
97+
->arrayNode('metadata')
98+
->addDefaultsIfNotSet()
99+
->children()
100+
->booleanNode('mirror_vcs_repositories')
101+
->defaultFalse()
102+
->info('Fetch mirrored packages from their VCS repositories by default when possible.')
103+
->end()
104+
->end()
105+
->end();
106+
}
89107
}

src/DependencyInjection/DirigentExtension.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ class DirigentExtension extends ConfigurableExtension
1212
protected function loadInternal(array $mergedConfig, ContainerBuilder $container): void
1313
{
1414
if (null === $slug = $mergedConfig['slug']) {
15-
$slug = (new AsciiSlugger())->slug($mergedConfig['title']);
16-
$slug = strtolower($slug);
15+
$slug = (new AsciiSlugger())->slug($mergedConfig['title'])->lower();
1716
}
1817

1918
$container->setParameter('dirigent.title', $mergedConfig['title']);
2019
$container->setParameter('dirigent.slug', $slug);
2120

2221
$this->registerEncryptionConfiguration($mergedConfig['encryption'], $container);
22+
$this->registerMetadataConfiguration($mergedConfig['metadata'], $container);
2323

2424
$container->setParameter('dirigent.security.public_access', $mergedConfig['security']['public']);
2525
$container->setParameter('dirigent.security.registration_enabled', $mergedConfig['security']['registration']);
@@ -58,4 +58,12 @@ private function registerEncryptionConfiguration(array $config, ContainerBuilder
5858
$container->setParameter('dirigent.encryption.public_key_path', $config['public_key_path']);
5959
$container->setParameter('dirigent.encryption.rotated_key_paths', $config['rotated_key_paths']);
6060
}
61+
62+
/**
63+
* @param array{mirror_vcs_repositories: bool} $config
64+
*/
65+
private function registerMetadataConfiguration(array $config, ContainerBuilder $container): void
66+
{
67+
$container->setParameter('dirigent.metadata.mirror_vcs_repositories', $config['mirror_vcs_repositories']);
68+
}
6169
}

src/Form/PackageFormType.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,16 @@ public function onPostSetData(PostSetDataEvent $event): void
7777
return "package.fetch-strategy.{$choice->value}";
7878
},
7979
]);
80+
81+
if (PackageFetchStrategy::Mirror === $package->getFetchStrategy()) {
82+
$form
83+
->add('repositoryCredentials', EntityType::class, [
84+
'label' => 'Credentials',
85+
'disabled' => true,
86+
'class' => Credentials::class,
87+
'placeholder' => 'No credentials',
88+
]);
89+
}
8090
}
8191
}
8292

templates/dashboard/docs/admin/mirroring.md.twig

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ of registries, move the registries up and down in the **Registries** overview.
1515
To add an external registry, go to **Registries** in the sidebar and click **Add Registry**.
1616

1717
### Package mirroring
18-
When adding an external registry, you have the following options regarding package mirroring:
18+
The package mirroring option allows control over when a package from the mirror registry is added to the current
19+
registry.
1920

2021
**Package mirroring disabled**<br>
2122
Package mirroring is disabled for this external registry so new packages can't be added. Existing packages already
@@ -28,3 +29,17 @@ registry will not request the package from this external registry.
2829
**Automatically mirror packages on request**<br>
2930
Packages can be added manually or will be created automatically when requested by a developer installing packages
3031
(through `composer update`).
32+
33+
## Add mirrored packages
34+
To add a package from an external registry, go to **Packages** in the sidebar and click **Add Package** >
35+
**Mirror from registry**.
36+
37+
### Fetch strategy
38+
It's possible to change how Dirigent fetches a mirrored package by changing the fetch strategy of the package. The
39+
default fetch strategy can be changed by the system administrator.
40+
41+
**Fetch from registry** (default)<br>
42+
Fetch package metadata directly from the mirror registry. Only metadata from the registry is available.
43+
44+
**Fetch from VCS**<br>
45+
Fetch package from VCS if possible. Metadata is compiled from the source code, including distributions and README data.

translations/messages.en.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ credentials:
7373
gitlab-pat: GitLab personal access token
7474
package:
7575
fetch-strategy:
76-
mirror: Fetch from mirror registry
77-
vcs: Fetch directly from VCS
76+
mirror: Fetch from registry
77+
vcs: Fetch from VCS
7878
registry:
7979
package-mirroring:
8080
none: Package mirroring disabled

0 commit comments

Comments
 (0)