Skip to content

Commit

Permalink
Allow to disable cron package auto update
Browse files Browse the repository at this point in the history
  • Loading branch information
vtsykun committed Oct 7, 2023
1 parent 9a372ab commit e01ddb5
Show file tree
Hide file tree
Showing 10 changed files with 350 additions and 208 deletions.
392 changes: 196 additions & 196 deletions composer.lock

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions src/Command/UpdatePackagesCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int
$updateEqualRefs = true;
} else {
$packages = $repo->getStalePackages($interval);
$packages = $repo->filterByJson($packages, fn($data) => ($data['disabled_update'] ?? false) !== true);
}

if ($input->getOption('delete-before')) {
Expand Down
23 changes: 23 additions & 0 deletions src/Controller/PackageController.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
use Packeton\Form\Type\EditRequiresMetadataType;
use Packeton\Form\Type\Package\AbandonedType;
use Packeton\Form\Type\Package\AddMaintainerRequestType;
use Packeton\Form\Type\Package\SettingsPackageType;
use Packeton\Form\Type\RemoveMaintainerRequestType;
use Packeton\Model\DownloadManager;
use Packeton\Model\FavoriteManager;
Expand Down Expand Up @@ -774,6 +775,28 @@ public function removeMaintainerAction(Request $req, $name): Response
return $this->render('package/viewPackage.html.twig', $data);
}

#[Route('/packages/{name}/settings', name: 'settings_package', requirements: ['name' => '%package_name_regex%'])]
public function settingsAction(Request $req, #[Vars] Package $package): Response
{
$this->checkSubrepositoryAccess($package->getName());
if (!$this->canEditPackage($package)) {
throw new AccessDeniedException();
}

$form = $this->createForm(SettingsPackageType::class, $package);
$form->handleRequest($req);

if ($form->isSubmitted() && $form->isValid()) {
$em = $this->registry->getManager();
$em->flush();

$this->addFlash('success', 'The package settings has been updated.');
return $this->redirect($this->generateUrl('view_package', ['name' => $package->getName()]));
}

return $this->render('package/settings.html.twig', ['form' => $form->createView(), 'package' => $package]);
}

#[Route('/packages/{name}/edit', name: 'edit_package', requirements: ['name' => '%package_name_regex%'])]
public function editAction(Request $req, #[Vars] Package $package): Response
{
Expand Down
10 changes: 10 additions & 0 deletions src/Entity/PackageSerializedTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,16 @@ public function setCustomVersions($versions): void
$this->setSerializedField('custom_versions', $versions);
}

public function isDisabledUpdate(): bool
{
return (bool) ($this->serializedData['disabled_update'] ?? false);
}

public function setDisabledUpdate(?bool $flag): void
{
$this->setSerializedField('disabled_update', $flag);
}

protected function setSerializedField(string $field, mixed $value): void
{
if (null === $value) {
Expand Down
12 changes: 0 additions & 12 deletions src/Form/Type/Package/BasePackageType.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,18 +39,6 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
'attr' => ['class' => 'repo-type']
]);
}

if ($options['has_active_integration']) {
$builder->add('pullRequestReview', ChoiceType::class, [
'required' => false,
'label' => 'Pull Request composer diff review',
'choices' => [
'Use global config settings' => null,
'Enable PR Review' => true,
],
'priority' => -10,
]);
}
}

protected function hasActiveIntegration(): bool
Expand Down
58 changes: 58 additions & 0 deletions src/Form/Type/Package/SettingsPackageType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?php

declare(strict_types=1);

namespace Packeton\Form\Type\Package;

use Doctrine\Persistence\ManagerRegistry;
use Packeton\Entity\OAuthIntegration;
use Packeton\Entity\Package;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class SettingsPackageType extends AbstractType
{
public function __construct(private ManagerRegistry $registry)
{
}

/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->add('disabledUpdate', CheckboxType::class, [
'required' => false,
'label' => 'Disable cron auto-updates',
]);

if ($options['has_active_integration']) {
$builder->add('pullRequestReview', ChoiceType::class, [
'required' => false,
'label' => 'Pull Request composer diff review',
'choices' => [
'Use global config settings' => null,
'Enable PR Review' => true,
],
'priority' => -10,
]);
}
}

protected function hasActiveIntegration(): bool
{
return (bool) $this->registry->getRepository(OAuthIntegration::class)->findOneBy([]);
}

/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefault('data_class', Package::class);
$resolver->setDefault('has_active_integration', $this->hasActiveIntegration());
}
}
30 changes: 30 additions & 0 deletions src/Repository/PackageRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
use Packeton\Entity\User;
use Packeton\Entity\Version;
use Packeton\Service\SubRepositoryHelper;
use Packeton\Util\PacketonUtils;

/**
* @author Jordi Boggiano <[email protected]>
Expand Down Expand Up @@ -186,6 +187,30 @@ private function getPackageNamesForQuery($query)
return $names;
}

public function filterByJson(array $packagesIds, callable $filter): array
{
if (empty($packagesIds)) {
return [];
}

$packages = $this->getConn()->fetchAllAssociative(
"SELECT p.id, p.serialized_data FROM package p WHERE p.id IN (:ids)",
['ids' => $packagesIds],
['ids' => ArrayParameterType::INTEGER]
);

$packages = PacketonUtils::buildChoices($packages, 'id', 'serialized_data');
foreach ($packagesIds as $i => $packageId) {
$data = $packages[$packageId] ?? null;
$data = is_string($data) ? json_decode($data, true) : null;
if (false === $filter(is_array($data) ? $data : [], $packageId)) {
unset($packagesIds[$i]);
}
}

return array_values($packagesIds);
}

public function getStalePackages($interval = null)
{
$conn = $this->getEntityManager()->getConnection();
Expand Down Expand Up @@ -605,4 +630,9 @@ public function getMetadataChanges($since, $now = null, ?bool $stability = true)

return $updates;
}

private function getConn(): Connection
{
return $this->getEntityManager()->getConnection();
}
}
25 changes: 25 additions & 0 deletions templates/package/settings.html.twig
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{% extends "layout.html.twig" %}

{% block title %}
{{ 'packages.settings_title'|trans({ '%name%': package.name }) }}
{% endblock %}

{% block stylesheets %}
<link rel="stylesheet" href="{{ asset('packeton/css/forms.css') }}" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/select2.min.css">
{% endblock %}

{% block scripts %}
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/select2.min.js"></script>
{% endblock %}

{% block content %}
<h2 class="title">{{ 'packages.settings_title'|trans({ '%name%': package.name }) }}</h2>

<section class="row">
{{ form_start(form, { attr: { class: 'col-md-6' } }) }}
{{ form_widget(form) }}
<input class="btn btn-block btn-primary btn-lg" id="submit" type="submit" value="{{ 'edit.submit'|trans }}" />
{{ form_end(form) }}
</section>
{% endblock %}
6 changes: 6 additions & 0 deletions templates/package/viewPackage.html.twig
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,12 @@
<input class="btn btn-primary" type="submit" value="Edit" />
</form>
{% endif %}

{% if canEdit %}
<form class="action" action="{{ path("settings_package", {name: package.name}) }}">
<input class="btn btn-default" type="submit" value="Settings" />
</form>
{% endif %}
</div>
{% endif %}
</div>
Expand Down
1 change: 1 addition & 0 deletions translations/messages.en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ packages:
suggesters_title: Suggesters Packages
from: "Packages from %vendor%"
security_title: 'Security Advisories'
settings_title: "Settings Package %name%"

browse:
packages: Packages
Expand Down

0 comments on commit e01ddb5

Please sign in to comment.