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       = 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.

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant la syntaxe Markdown Extra.

Ajouter un rétrolien

URL de rétrolien : https://open-time.net/trackback/15139

Haut de page