pman: ajout des clés match_require et match_require-dev

This commit is contained in:
Jephté Clain 2025-04-16 14:44:04 +04:00
parent 8ee13a85c0
commit 5e141b575e
5 changed files with 59 additions and 3 deletions

View File

@ -98,11 +98,17 @@ function _init_composer() {
# -*- coding: utf-8 mode: yaml -*- vim:sw=2:sts=2:et:ai:si:sta:fenc=utf-8 # -*- coding: utf-8 mode: yaml -*- vim:sw=2:sts=2:et:ai:si:sta:fenc=utf-8
composer: composer:
match_prefix:
match_prefix-dev:
profiles: [ dev, dist ] profiles: [ dev, dist ]
dev: dev:
link: true link: true
require:
reqire-dev:
dist: dist:
link: false link: false
require:
reqire-dev:
EOF EOF
"${EDITOR:-nano}" "$config" "${EDITOR:-nano}" "$config"
[ -s "$config" ] || return 1 [ -s "$config" ] || return 1

View File

@ -68,7 +68,7 @@ class SqliteStorage extends CapacitorStorage {
if (!$this->channelExists($channel->getName())) { if (!$this->channelExists($channel->getName())) {
# ne pas insérer si la ligne existe déjà, pour éviter d'avoir besoin d'un # ne pas insérer si la ligne existe déjà, pour éviter d'avoir besoin d'un
# verrou en écriture # verrou en écriture
$this->_addToChannelsSql($channel); $db->exec($this->_addToChannelsSql($channel));
} }
} }

View File

@ -242,6 +242,21 @@ class str {
return true; return true;
} }
/**
* vérifier si $s a le préfixe $prefix
* - si $prefix commence par /, c'est une expression régulière, et elle doit
* matcher $s
* - sinon $s doit commencer par la chaine $prefix
*/
static final function match_prefix(?string $s, ?string $prefix): bool {
if ($s === null || $prefix === null) return false;
if (substr($prefix, 0, 1) === "/") {
return preg_match($prefix, $s);
} else {
return self::_starts_with($prefix, $s);
}
}
/** /**
* ajouter $sep$prefix$text$suffix à $s si $text est non vide * ajouter $sep$prefix$text$suffix à $s si $text est non vide
* *

View File

@ -78,7 +78,7 @@ class ComposerFile {
]; ];
function selectProfile(string $profile, ComposerPmanFile $config): void { function selectProfile(string $profile, ComposerPmanFile $config): void {
$config = $config->getProfileConfig($profile); $config = $config->getProfileConfig($profile, $this->getRequires(), $this->getRequireDevs());
// corriger les liens // corriger les liens
$deps = cl::merge(array_keys($config["require"]), array_keys($config["require-dev"])); $deps = cl::merge(array_keys($config["require"]), array_keys($config["require-dev"]));
$paths = []; $paths = [];

View File

@ -4,6 +4,7 @@ namespace nulib\tools\pman;
use nulib\A; use nulib\A;
use nulib\ext\yaml; use nulib\ext\yaml;
use nulib\os\path; use nulib\os\path;
use nulib\str;
use nulib\ValueException; use nulib\ValueException;
class ComposerPmanFile { class ComposerPmanFile {
@ -49,6 +50,8 @@ class ComposerPmanFile {
$composer =& $data["composer"]; $composer =& $data["composer"];
A::ensure_array($composer); A::ensure_array($composer);
A::ensure_array($composer["profiles"]); A::ensure_array($composer["profiles"]);
A::ensure_array($composer["match_require"]);
A::ensure_array($composer["match_require-dev"]);
foreach ($composer["profiles"] as $profileName) { foreach ($composer["profiles"] as $profileName) {
$profile =& $composer[$profileName]; $profile =& $composer[$profileName];
A::ensure_array($profile); A::ensure_array($profile);
@ -61,11 +64,43 @@ class ComposerPmanFile {
return $this->data; return $this->data;
} }
function getProfileConfig(string $profile): array { function getProfileConfig(string $profile, ?array $composerRequires=null, ?array $composerRequireDevs=null): array {
$config = $this->data["composer"][$profile] ?? null; $config = $this->data["composer"][$profile] ?? null;
if ($config === null) { if ($config === null) {
throw new ValueException("$profile: profil invalide"); throw new ValueException("$profile: profil invalide");
} }
if ($composerRequires !== null) {
$matchRequires = $this->data["composer"]["match_require"];
foreach ($composerRequires as $dep => $version) {
$found = false;
foreach ($matchRequires as $matchRequire) {
if (str::match_prefix($dep, $matchRequire)) {
$found = true;
break;
}
}
$require = $config["require"][$dep] ?? null;
if ($found && $require === null) {
$config["require"][$dep] = $version;
}
}
}
if ($composerRequireDevs !== null) {
$matchRequireDevs = $this->data["composer"]["match_require-dev"];
foreach ($composerRequireDevs as $dep => $version) {
$found = false;
foreach ($matchRequireDevs as $matchRequireDev) {
if (str::match_prefix($dep, $matchRequireDev)) {
$found = true;
break;
}
}
$requireDev = $config["require-dev"][$dep] ?? null;
if ($found && $requireDev === null) {
$config["require"][$dep] = $version;
}
}
}
return $config; return $config;
} }