Développement


Projet symfony2, convention PSR2 et validation pre-receive GIT

Au mettre titre que SVN, je vais déployer progressivement des hooks pour traiter le code source "pushé" vers mon Gitlab (et les projets que je gère).

En m’appuyant sur un script récupéré sur Github, j'ai réalisé un hook GIT pre-receive qui permet de vérifier que le code soumis est valide PSR2. Il fonctionne pour le moment très bien mais je suis ouvert aux corrections si vous en avez à me proposer. Il faudra prendre une ou deux minutes pour configurer les premières variables.


Bilan de l'année 2015

Cette nouvelle année est l'occasion d'établir un petit bilan des projets sur lesquels j'ai pu travailler. Ça n'a pas été l'année la plus productive mais j'ai tout de même apporté ma pierre à l'édifice.

Le premier projet en date est pdns-console, sous licence BSD, qui permet de gérer son serveur PowerDNS en ligne de commande. PowerDNS est un DNS qui s'appuie sur une base de données plutôt que des fichiers. Le petit plus de pdns-console est sa capacité à gérer des versions de zones à la manière de Gandi.

Également sous licence BSD, j'ai mis en ligne t411-console qui offre un outil en ligne de commande pour accéder au tracker t411. Il permet d'effectuer des recherches, d'accéder aux fichiers torrents et même de lancer leur téléchargement via transmission.

Cette fois sous GPLv3, Gist est le dernier projet de la portée. C'est une réécriture totale du WALL que j'héberge depuis des années. C'est un Pastbin like qui s'appuie sur GIT et qui permet de coloriser et partager du code source.

Au delà ses projets persos, j'ai réalisé quelques pull-requests vers 3 projets très différents. J'ai corrigé un morceau de documentation pour NativeScript. NativeScript est un ensemble d'outils pour réaliser des applications mobiles natives écrites en Javascript. J'ai aussi proposé une nouvelle fonctionnalité pour idct-sftp-client, une bibliothèque pour jouer avec SSH2 et SFTP en PHP. Enfin, j'ai un participé au projet La Brique Internet en écrivant du code pour l'un de ses composants, la php-piratebox.

Il n'y a plus qu'à faire mieux cette année :)

Challenge Accepted!


Nouvelle version de Gist

Je viens de publier une nouvelle version de Gist, une application en ligne qui permet de mettre du code en ligne et de le versionner.

Voici les nouveautés de cette version :

  • elle contient bien évidement des correctifs
  • l'API permet maintenant de mettre à jour un Gist
  • ...donc on a aussi une nouvelle commande pour réaliser ces mises à jours
  • possibilité de créer des comptes depuis l'interface ou en console
  • et la console permet d'accéder à quelques statistiques qui devraient évoluer d'ici quelques semaines

Il y a encore du travail à réaliser pour avoir un outil complet mais je suis très confiant car c'est en bonne voie !

Si vous souhaitez mettre à jour votre instance, rien de bien compliqué :

La documentation est disponible sur Gitlab et Github.


Gist est dans la place !

Une nouvelle version de mon wall vient d'être mise ligne ! Bienvenue GIST.

GIST

  • Du chiffrement : on peut à présent partager du code colorisé chiffré et déchiffré coté navigateur
  • L'application est fondée sur git et permet de versionner les modifications réalisées sur du code et d'accéder aux différentes versions avec des diff
  • Il est à présent possible d'insérer sur son site le résultat de la colorisation
  • L'application est multilingue et fonctionne très bien sur téléphone
  • Toujours et encore libre, avec une procédure d'installation simplifiée !

La procédure d'installation :


Projet symfony2, convention PSR2 et validation pré-commit SVN

Les gens qui travaillent avec moi savent que je suis un "Syntax nazi". Je ne supporte pas quand le code ne suit pas les conventions. Ainsi, pour éviter de rager quand j'update mes sources, j'ai décidé de créer un hook SVN pour valider les commits des fichiers PHP.

Vous l'aurez donc compris, il s'agit ici de valider les uniquement les fichiers PHP suivant la norme PSR2. Par ailleurs, je ne m'attarde que sur le code de l'équipe de développement. Il s'agit donc de tout ce qui se trouve dans le répertoire "src" des applications symfony2 que nous développons.

Un hook SVN est un script qui sera exécuté à un instant donné et qui, suivant le code d'erreur, va valider ou non l'action en cours. Dans le cas de commit SVN, le hook est "pre-commit". Il se place dans le répertoire "hooks" du dépôt SVN et se nomme "pre-commit". Vous y trouvez d'ailleurs des fichiers .tmpl donnant quelques exemples.

Mon script s'appuie sur PHP_CodeSniffer (phpcs) que j'ai installé via composer. En effet, il existe un paquet Debian pour phpcs mais le standard PSR2 n'est pas pris en charge dans celui de la Wheezy (version de Debian du serveur SVN).

Voici le contenu du script :

Afficher/masquer le code
#!/bin/sh

SVNLOOK=/usr/bin/svnlook
PHPCS=/usr/local/src/phpcs/vendor/bin/phpcs
STANDARD=PSR2
SEVERITY=1
FINAL_REPORT=

for FILE in `$SVNLOOK changed -t "$2" "$1" | egrep -v '^D' | cut -b 5- | egrep '^src.*\.php$'`; do
    REPORT=`$SVNLOOK cat -t "$2" "$1" "$FILE" | $PHPCS --standard=$STANDARD -n --report=full --error-severity=$SEVERITY | sed 's,STDIN,'$FILE','`

    if [ -n "$REPORT" ]; then
        FINAL_REPORT="$FINAL_REPORT$REPORT\n\n"
    fi
done

if [ -n "$FINAL_REPORT" ]; then
    echo "$FINAL_REPORT" >&2
    exit 1
fi

exit 0

Voici un exemple de sortie lorsque la validation échoue :

Afficher/masquer le code
Envoi          src/FooBar/Bundle/PacteBundle/Controller/CollaboratorController.php
Envoi          src/FooBar/Bundle/PacteBundle/Controller/PacteController.php
Envoi          src/FooBar/Bundle/PacteBundle/Controller/TeamController.php
Transmission des données ..svn: E165001: Échec de la propagation (commit), détails : 
svn: E165001: Commit blocked by pre-commit hook (exit code 1) with output:

FILE: src/FooBar/Bundle/PacteBundle/Controller/CollaboratorController.php
--------------------------------------------------------------------------------
FOUND 5 ERROR(S) AFFECTING 3 LINE(S)
--------------------------------------------------------------------------------
 18 | ERROR | Spaces must be used to indent lines; tabs are not allowed
 18 | ERROR | Line indented incorrectly; expected at least 4 spaces, found 1
 18 | ERROR | Line indented incorrectly; expected 4 spaces, found 1
 19 | ERROR | Opening brace indented incorrectly; expected 1 spaces, found 4
 32 | ERROR | Closing brace indented incorrectly; expected 1 spaces, found 4
--------------------------------------------------------------------------------


FILE: src/FooBar/Bundle/PacteBundle/Controller/PacteController.php
--------------------------------------------------------------------------------
FOUND 5 ERROR(S) AFFECTING 3 LINE(S)
--------------------------------------------------------------------------------
 15 | ERROR | Spaces must be used to indent lines; tabs are not allowed
 15 | ERROR | Line indented incorrectly; expected at least 4 spaces, found 1
 15 | ERROR | Line indented incorrectly; expected 4 spaces, found 1
 16 | ERROR | Opening brace indented incorrectly; expected 1 spaces, found 4
 18 | ERROR | Closing brace indented incorrectly; expected 1 spaces, found 4
--------------------------------------------------------------------------------

Édit : mise à jour du code qui plantait lors de la suppression d'un fichier.

Be brave!   Peace