Comme je disais hier, il a fallu que je crée les fichiers dcstore.xml
pour tous mes thèmes et plugins et comme vous me connaissez, j’suis une feignasse assumée :-)
J’ai donc passé beaucoup de temps pour développer un petit outil qui ferait le boulot à ma place, parce que faire ça pour environ 90 dépôts, c’est niet !
En préambule il faut savoir que j’ai deux dossiers, un pour les plugins, un autre pour les thèmes, où je stocke tous les dépôts locaux (sur ma machine) des plugins et thèmes que je maintiens ; en dehors de mon répertoire de test de Dotclear donc.
Pour les plugins, j’ai simplement ajouté ce qu’il faut dans le fichier config.php
, et pour les thèmes, j’ai simplement créé des liens symboliques dans le répertoire des thèmes de mon installation Dotclear vers tous mes thèmes.
Ce fichier dcstore.xml
contient quelques infos nécessaires pour décrire le module (plugin ou thème) et il se trouve que toutes ses infos, ou quasi, se trouvent dans le fichier _define.php
. L’idée était donc de parcourir tous les plugins (ou tous les thèmes), d’extraire les infos du fichier _define.php
et d’écrire un beau fichier dcstore.xml
tout neuf.
Et puis au passage j’ai aussi fait en sorte que je puisse refaire la manip autant de fois que je voulais en cas de mise à jour, par exemple.
Si ça vous intéresse, vous trouverez ci-dessous le code du script Bash mk-dcstore.sh
que j’utilise :
#!/bin/bash
set -e
make_dcstore_xml()
{
module_type=$1
rootdir=$2
git_action=$3
modules=$(cd "$rootdir" && ls -d -- */ | sed -e "s/\///g")
for module in $modules; do
# For each module in root dir
if [ -d "$rootdir/$module/.git" ] && [ ! -f "$rootdir/$module/.notmine" ]; then
# There is a git repository here
dcstore_xml="$rootdir/$module/dcstore.xml"
define_php="$rootdir/$module/_define.php"
if [ ! -f "$define_php" ]; then
echo "Warning, _define.php is missing in $rootdir/$module !"
else
status="updated"
if [ ! -f "$dcstore_xml" ]; then
status="created"
fi
# Extract info from _define.php
define=$(./mk-dcstore.php "$define_php")
IFS='£'
read -a data <<< "$define"
# Write dcstore.xml
buffer="$DCSTORE_XML_TEMPLATE"
details="$DEFAULT_DETAILS"
if [ "${data[5]}" != "-" ]; then
details="${data[5]}"
fi
buffer=${buffer//\[%details%\]/"$details"}
support="$DEFAULT_SUPPORT"
if [ "${data[6]}" != "-" ]; then
support="${data[6]}"
fi
buffer=${buffer//\[%support%\]/"$support"}
buffer=${buffer//\[%type%\]/"$module_type"}
buffer=${buffer//\[%id%\]/"$module"}
buffer=${buffer//\[%name%\]/"${data[0]}"}
buffer=${buffer//\[%version%\]/"${data[3]}"}
buffer=${buffer//\[%author%\]/"${data[2]}"}
buffer=${buffer//\[%description%\]/"${data[1]}"}
buffer=${buffer//\[%dcmin%\]/"${data[4]}"}
echo "$buffer" > "$dcstore_xml"
test=$(cd "$rootdir/$module" && git diff --name-only -- dcstore.xml)
if [ "$test" != "" ]; then
echo "dcstore.xml $status for $module_type $module."
if [ "$git_action" != "" ]; then
# Add, commit and push if required
echo $(cd "$rootdir/$module" && git add dcstore.xml)
if [ "$git_action" != "add" ]; then
echo $(cd "$rootdir/$module" && git commit -m "Update dcstore.xml")
if [ "$git_action" != "commit" ]; then
echo $(cd "$rootdir/$module" && git push)
fi
fi
fi
else
echo "nothing to do for $module_type $module."
fi
fi
fi
done
}
DEFAULT_DETAILS="https://open-time.net/?q=[%id%]"
DEFAULT_SUPPORT="https://github.com/franck-paul/[%id%]"
DCSTORE_XML_TEMPLATE=$(cat <<-END
<modules xmlns:da="http://dotaddict.org/da/">
<module id="[%id%]">
<name>[%name%]</name>
<version>[%version%]</version>
<author>[%author%]</author>
<desc>[%description%]</desc>
<file>https://github.com/franck-paul/[%id%]/releases/download/[%version%]/[%type%]-[%id%]-[%version%].zip</file>
<da:dcmin>[%dcmin%]</da:dcmin>
<da:details>[%details%]</da:details>
<da:support>[%support%]</da:support>
</module>
</modules>
END
)
case $1 in
-t | -T)
ROOT_DIR="$HOME/Documents/EGO/Geekeries/Internet/htdocs/git-themes"
MODULE_TYPE="theme"
;;
-p | -P)
ROOT_DIR="$HOME/Documents/EGO/Geekeries/Internet/htdocs/git-plugins"
MODULE_TYPE="plugin"
;;
-h | -H)
echo "run $0 -<type> [-<action>]"
echo ""
echo "-<type>: type of modules"
echo "p: for plugins"
echo "t: for themes"
echo ""
echo "-<action>: git action"
echo "n: none"
echo "a: for add only"
echo "c: for add and commit"
echo "other (or no argument): add, commit and push"
echo ""
echo "exemple:"
echo "$0 -p -a"
echo "will run in the plugins directory and only git add the created/updated dcstore.xml"
exit 0
;;
*)
echo "Parameters missing (run $0 -h for help)"
exit 1
;;
esac
case $2 in
-n | -N)
GIT=""
;;
-a | -A)
GIT="add"
;;
-c | -C)
GIT="commit"
;;
*)
GIT="all"
;;
esac
echo "Directory : $ROOT_DIR ($MODULE_TYPE)"
make_dcstore_xml "$MODULE_TYPE" "$ROOT_DIR" "$GIT"
Et également celui du script PHP mk-dcstore.php
— il doit être présent dans le même répertoire que le script Bash — qu’il utilise pour extraire les infos du fichier _define.php
:
#!/usr/bin/env php
<?php
$define = $_SERVER['argv'][1] ?: null;
if (!$define) {
return;
}
define('DC_RC_PATH', '.');
class mkdcstore
{
public $name;
public $desc;
public $author;
public $version;
public $properties;
public $dcmin = '2.0';
public $details = '-';
public $support = '-';
public function run($file)
{
require $file;
}
/**
* Moke official registerModule in order to extract useful properties
*/
public function registerModule($name, $desc, $author, $version, $properties = [])
{
$this->name = htmlspecialchars($desc, ENT_XML1 | ENT_QUOTES, 'UTF-8');
$this->desc = htmlspecialchars($desc, ENT_XML1 | ENT_QUOTES, 'UTF-8');
$this->author = htmlspecialchars($desc, ENT_XML1 | ENT_QUOTES, 'UTF-8');
$this->version = $version;
$this->properties = $properties;
if (is_array($this->properties)) {
if (isset($this->properties['requires'])) {
foreach ($this->properties['requires'] as $r) {
if ($r[0] === 'core') {
$this->dcmin = $r[1];
break;
}
}
}
if (isset($this->properties['details'])) {
$this->details = $this->properties['details'];
}
if (isset($this->properties['support'])) {
$this->support = $this->properties['support'];
}
}
}
}
$make = new mkdcstore();
$make->run($define);
echo $make->name . '£' . $make->desc . '£' . $make->author . '£' . $make->version . '£' . $make->dcmin . '£' . $make->details . '£' . $make->support;
Attention, le script Bash est a adapter si vous voulez l’utiliser chez vous, spécialement les lignes suivantes :
- Ligne 85, l’URL de la page détails par défaut (utilisée si elle n’est pas récupérée dans le fichier
_define.php
) - Lignes 86 et 95, modifiez le nom du compte github (franck-paul pour moi), notez que l’URL de support définie dans le fichier
_define.php
sera utilisée si elle est présente) - Ligne 106, le chemin vers le répertoire qui contient tous mes thèmes
- Ligne 110, le chemin vers le répertoire qui contient tous mes plugins
À savoir : j’utilise un fichier .notmine
que je crée dans les répertoires des plugins et thèmes tiers (que je teste localement). La présence de ce fichier permet d’indiquer au script qu’il faut ignorer ce répertoire.
Pour lancer le script, se placer dans le répertoire qui le contient et l’exécuter (pour les thèmes) :
./mk-dcstore.sh -t
Ou (pour les plugins) :
./mk-dcstore.sh -p
J’ai légèrement modifié les scripts pour récupérer plus d’info dans _define.php
et pour autoriser de choisir jusqu’où on veut aller dans la mise à jour du dépôt. Je les mets en pièces jointes de ce billet.
1 De JcDenis -
Je suppose que ça ne marche pas sous windows ton truc ? :D
Comme je ne parle pas 33 langages, j’ai opté pour mettre à jour à l’occasion avec quand même un petit outil fait maison sous Dotclear ;)
2 De Franck -
Sous Windows ? Aucune idée :-)
J’ai vu ton outil, bien fichu, sauf qu’avec 90 dépôts je pense que ç’a m’aurait pris plus de temps à cliquer dans tous les sens avec celui-ci à chaque fois :-)
Et puis c’est moins rigolo à faire que de coder un truc comme ça :-)
3 De Bernard -
Ah queue, pas vérifié ni approfondi mais pitet c’est
SNCFpossible ? Rechercher