Un patchset est une modification, ou un ensemble de modifications, qui sont appliqués sur un module pour corriger une fonctionnalité.
Pour le format du patchset, on va s'inspirer de l'existant avec le format `.webinst'.
Un patchset se compose de :
Exemple contenu d'un paquet `.patchset' :
Le `info.xml' identifie le patchset et déclare les dépendances avec le module sur lequel il s'applique et autres patchset à appliquer si nécessaire.
<patchset name="freedom-core" version="2.14.5" release="9" patchlevel="724"> <description>Fixes foo and bar</description> <requires> <patchset name="freedom-ecm" version="3.2.1" release="1" patchlevel="835" /> </requires> <install> <patch patchfile="fix_foo.patch"> <label>Fixed the foo() method.</label> </patch> <patch patchfile="fix_bar.patch" > <label>Added support for bar.</label> </patch> </install> </patchset>
Les attributs de <patch/> sont nommés comme les arguments de `patch' dans sa man page.
$ ./wiff context <contextName> patchset install <path/to/patchset>
$PATCHSET_DIR' avec le chemin de ce répertoire temporaire$CONTEXT_ROOT'$PATCHSET_DIR/<patchfile>' à l'aide de la commande `patch' en faisant un backup des fichiers modifiés `.patchset_<patchlevel>'L'application du patchset ajoute un attribut `patchlevel' au nœud <module/> et une section <patchset/> contenant la description des patchset appliqués :
<contexts> <context name="test" […]> <modules> <module name="freedom-core" version="2.14.5" release="9" basecomponent="yes" status="installed" patchlevel="728"> <description>[…]</description> […] <changelog> […] </changelog> <patchsets> <patchset name="freedom-core" version="2.14.5" release="9" patchlevel="724"> <description>Fixes foo and bar.</description> </patchset> <patchset name="freedom-core" version="2.14.5" release="9" patchlevel="728"> <description>Fixes baz.</description> </patchset> </patchsets> </module> […] </modules> </context> […] </contexts>
Parcourir la liste des patchset disponible pour le module et ordonner les patchset par ordre croissant de `patchlevel'.
Prendre les patchset dont le `patchlevel' est compris entre le `patchlevel' courant du module et le `patchlevel' à appliquer.
Si le module n'a pas de `patchlevel', alors son `patchlevel' est égal à 0.
$GIT_DIR/core/
ecm/
patchset/
freedom-core/
2.14.5/
9/
724/
info.xml
fix_foo.patch
fix_bar.patch
freedom-ecm/
3.2.1/
1/
932/
[…]
$GIT_DIR/patchset/<module>/<version>/<release>/<patchlevel>/
Les patchset sont dans le même dépôt des paquets webinst et renseignés dans l'index du dépôt (`content.xml') sous chaque nœud <module/> sur lequels ils s'appliquent.
Exemple de contenu d'un repo :
$REPO/content.xml $REPO/freedom-core-2.14.5-9.webinst $REPO/freedom-core-2.14.5-9.724.patchset $REPO/freedom-core-2.14.5-9.728.patchset
Exemple de `content.xml' :
<repo label="test"> <modules> <module name="freedom-core" version="2.14.5" release="9" src="freedom-core-2.14.5-9.webinst"> <requires> […] </requires> <changelog> […] </changelog> <patchsets> <patchset name="freedom-core" version="2.14.5" release="9" patchlevel="724" src="freedom-core-2.14.5-9.724.patchset"> <description>Fixes foo and bar.</description> <requires> <patchset name="freedom-ecm" version="3.2.1" release="1" patchlevel="835" /> </requires> </patchset> <patchset name="freedom-core" version="2.14.5" release="9" patchlevel="728" src="freedom-core-2.14.5-9.728.patchset"> […] </patchset> </patchsets> […] </module> </modules> </repo>