Feignasse moi ?

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       = $name;
        $this->desc       = $desc;
        $this->author     = $author;
        $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.

Dépôt alternatif

On s’est dit que ça serait pas mal d’avoir la possibilité de proposer un dépôt alternatif pour les plugins et thèmes tiers. Alors JcDenis a codé ça il y a quelques jours/semaines et ça sera dans la prochaine version de Dotclear, la 2.20, prévue bientôt ! Pour les mises à jour des modules (plugins  […]

Lire la suite

Couscous

Mon assiette de couscous vide au Titi Touareg de Montrouge, oct. 2021

Mon assiette de couscous vide au Titi Touareg de Montrouge Encore eu une autre idée de plugin, hier — ou avant-hier, mais on s’en tape de la date — pour proposer de modifier l’URL quand on change le titre de la page ou du billet en cours d’édition, à condition toutefois que le billet n’ait pas déjà  […]

Lire la suite

Perceuse

Marteau-piqueur Les joies du non télé-travail au bureau avec les vrais bruits bien gênants des perceuses dans le béton, à environ 80db, juste au dessus de ma tête ; fichus travaux qui durent depuis un an et demi. Eh bien j’étais bien mieux en télé-travail en vrai chez moi à ma maison avec les  […]

Lire la suite

Haut de page