Il m'est arrivé plusieurs fois de commiter un 'fix a typo' ou 'add forgotten property in i18n files', quelques minutes ou quelques heures après avoir commité une fonctionnalité que j'estimais complète.

Je viens de découvrir 2 options utiles dans Git, qui fonctionnent ensemble, et qui adressent ce problème : git commit --fixup et git rebase --autosquash. Avec ces options, on peut facilement fusionner de petits commits liés à la fonctionnalité originale et garder un historique propre sur la branche.

A noter : il ne faut pas utiliser cette technique sur une branche stable ou sur master, parce que rebase ré-écrit l'historique et peut mettre un sacré bazar, principalement si le projet compte plusieurs développeurs. Il est préférable d'appliquer cette technique sur une branche locale de développement avant de la fusionner sur master.

fixup & autosquash

  • git commit --fixup <commit> : marque automatiquement le commit en cours comme une correction d'un précédent commit.
  • git rebase -i --autosquash : organise automatiquement la fusion des commits de correctif avec les commits normaux.

Exemple

On part d'un repo git avec une branche locale dev et l'on planifie de commiter les fonctionnalités A et B :

$ (dev) git add featureA
$ (dev) git commit -m "Implement Feature A"
[dev fb2f677] Implement Feature A
$ (dev) git add featureB
$ (dev) git commit -m "Implement Feature B"
[dev 733e2ff] Implement Feature B

Puis on découvre que de petites erreurs se sont glissées dans Feature A : on va utiliser l'option --fixup !

$ (dev) git add featureA      # removed shameful bug
$ (dev) git commit --fixup fb2f677
[dev c5069d5] fixup! Implement Feature A

On voit ici que Git a automatiquement récupéré le message de commit de Feature A, préfixé par fixup!.
C'est bon, on a fini, voyons voir l'historique :

$ (dev) git log --oneline
c5069d5 fixup! Implement Feature A
733e2ff Implement Feature B
fb2f677 Implement Feature A
ac5db87 Previous commit

Et maintenant, on nettoie l'historique avant de fusionner avec master : on va utiliser l'option --autosquash !

$ (dev) git rebase -i --autosquash ac5db87
pick fb2f677 Implement Feature A
fixup c5069d5 fixup! Implement Feature A
pick 733e2ff Implement Feature B

La commande précédente a ouvert l'éditeur avec les lignes précédentes. On sauve et on quitte l'éditeur, puis :

$ (dev) git log --oneline
ff4de2a Feature B is done
5478cee Feature A is done
ac5db87 Previous commit

Tous les commits de correctifs sont fusionnés proprement avec la fonctionnalité originale !

Tout ceci est bien sûr un raccourci pour quelque chose qu'on aurait pu faire de bien d'autres façons avec Git mais j'ai trouvé ces options bien pratiques in fine.

 

Il se trouve que, par défaut, les modifications de classe et de JSP ne sont pas automatiquement publiées dans une instance de JBoss AS 7 en cours d'exécution. En cause : une configuration incomplète de l'IDE et du JBoss pour que ces actions soient réalisées.

Voilà les étapes que j'ai suivi pour me simplifier la vie, sur un développement en cours. Note : j'utilise IntelliJ IDEA, je n'ai aucune idée de ce qu'il faudrait faire dans un autre IDE. J'imagine que ça doit être relativement proche malgré tout.

Publier les modifications de classes

Dans la fenêtre Run/Debug Configurations de IntelliJ, sélectionner l'onglet Server. Il existe une option appelée On frame deactivation qui, par défaut, ne fait rien. Dans la liste déroulante proposée pour cette option, choisir Update classes and resources. Et voilà, dès que la fenêtre IntelliJ perd le focus, tous les fichiers modifiés (classes, properties, …) sont re-publiés automatiquement dans le serveur d'applications.

J'ai dû redémarrer le serveur pour que l'option soit prise en compte.

Publier les modifications de JSP

Ça, ça demande un peu plus de travail. Il faut soit modifier le fichier standalone.xml soit passer par l'interface web de gestion du serveur Jboss pour apporter cette modification.

Modification manuelle

Dans le <subsystem xmlns="urn:jboss:domain:web:1.2", ajouter la ligne suivante :

<jsp-configuration development="true" check-interval="1"/>

Modification par l'interface web

Pour apporter la modification via la console web, il faut un utilisateur ayant les droits d'accès à cette console de gestion. Ensuite, il suffit de cliquer aux bons endroits :

  • Cliquer sur l'onglet Profil, en haut à droite
  • Sélectionner l'entrée “Web” dans le menu qui s'affiche à gauche
  • Sélectionner l'entrée “Servlet/HTTP” dans le sous-menu qui s'affiche
  • Cliquer sur le bouton “Edit” de la page affichée
  • Cocher la case “Development?”
  • (Facultatif) Déployer le bloc “Advanced” et préciser une valeur dans “Check Interval”
  • Cliquer sur le bouton “Save”
  • Redémarrer le serveur pour que les modifications soient prises en compte.

Et voilà, les modifications faites sur les JSP seront prises en compte automatiquement.