Patchset

Un patchset est une modification, ou un ensemble de modifications, qui sont appliqués sur un module pour corriger une fonctionnalité.

Format

Pour le format du patchset, on va s'inspirer de l'existant avec le format `.webinst'.

Un patchset se compose de :

  • un fichier `info.xml' de description du patchset
  • un ensemble de fichiers `*.patch' au format diff

Exemple contenu d'un paquet `.patchset' :

  • info.xml
  • fix_foo.patch
  • fix_bar.patch

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.

Déroulement de l'application d'un patchset sur un contexte

$ ./wiff context <contextName> patchset install <path/to/patchset>
  • Télécharcher le patchset avec les autres patchset dont il dépend
  • Pour chaque patchset
    • Extraire les fichiers du patchset dans un répertoire temporaire
    • Déclarer la variable d'environnement `$PATCHSET_DIR' avec le chemin de ce répertoire temporaire
    • Se positionner dans la racine du contexte `$CONTEXT_ROOT'
    • Appliquer les instructions <patch/> de la section <install/> dans l'ordre indiqué
      • Appliquer les `$PATCHSET_DIR/<patchfile>' à l'aide de la commande `patch' en faisant un backup des fichiers modifiés `.patchset_<patchlevel>'
        • Si un <patch/> échoue, restaurer les fichiers originaux (*.patchset_<patchlevel>) et arrêter l'opération en retournant le message d'erreur rencontré
    • Si tout est Ok, inscrire le patchset dans `conf/contexts.xml'

Comment inscrire le patchset dans `conf/contexts.xml'

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>

Comment lister tous les patchset applicables sur un module donné

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.

Comment produire et gérer un patchset

FIXME

$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>/

Comment distribuer les patchset

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>

Questions

freedom_3/workinprogress/patchset.txt · Dernière modification: 03/05/2010 14:51 par jerome.auge