Index: gnome-modules.xml.in
===================================================================
--- gnome-modules.xml.in	(révision 390)
+++ gnome-modules.xml.in	(copie de travail)
@@ -7,12 +7,14 @@
       <bugs-baseurl>http://bugzilla.gnome.org/</bugs-baseurl>
       <bugs-product>%(module/id)</bugs-product>
       <bugs-component>general</bugs-component>
-      <svnroot>http://svn.gnome.org/svn</svnroot>
-      <svnmodule>%(module/id)</svnmodule>
-      <svnweb>http://svn.gnome.org/viewcvs/%(module/id)/trunk</svnweb>
+      <scmroot type="svn">
+        <path>http://svn.gnome.org/svn</path>
+      </scmroot>
+      <scmmodule>%(module/id)</scmmodule>
+      <scmweb>http://svn.gnome.org/viewcvs/%(module/id)/trunk</scmweb>
     </module>
     <branch id="HEAD" regenerate="1">
-      <svnweb>http://svn.gnome.org/viewcvs/%(module/id)/branches/%(branch/id)</svnweb>
+      <scmweb>http://svn.gnome.org/viewcvs/%(module/id)/branches/%(branch/id)</scmweb>
       <domain id="po">
         <_description>UI translations</_description>
       </domain>
@@ -67,7 +69,7 @@
     <_description>Banshee Music Player</_description>
     <webpage>http://banshee-project.org/</webpage>
     <maintainer id="abock"/>
-    <svnmodule>banshee</svnmodule>
+    <scmmodule>banshee</scmmodule>
     <branch id="HEAD">
       <domain id="banshee/po" potbase="banshee">
         <_description>UI translations</_description>
@@ -81,7 +83,7 @@
     <_description>Beagle Desktop Search</_description>
     <webpage>http://beagle-project.org/</webpage>
     <maintainer id="joeshaw"/>
-    <svnmodule>beagle</svnmodule>
+    <scmmodule>beagle</scmmodule>
     <branch id="HEAD">
       <domain id="beagle/po" potbase="beagle">
         <_description>UI translations</_description>
@@ -223,7 +225,7 @@
     <_description>Eye of GNOME</_description>
     <webpage>http://live.gnome.org/EyeOfGnome</webpage>
     <maintainer id="lucasr"/>
-    <svnmodule>eog</svnmodule>
+    <scmmodule>eog</scmmodule>
     <branch id="HEAD">
       <domain id="po">
         <_description>UI translations</_description>
@@ -241,7 +243,7 @@
     <_description>Epiphany Web Browser</_description>
     <webpage>http://gnome.org/projects/epiphany/</webpage>
     <maintainer id="chpe"/>
-    <svnmodule>epiphany</svnmodule>
+    <scmmodule>epiphany</scmmodule>
     <branch id="HEAD" />
     <branch id="gnome-2-14" stringfrozen="true"/>
     <branch id="gnome-2-16" stringfrozen="true"/>
@@ -452,7 +454,7 @@
     <webpage>http://gtk.org/</webpage>
     <maintainer id="matthiasc"/>
     <maintainer id="owen"/>
-    <svnmodule>glib</svnmodule>
+    <scmmodule>glib</scmmodule>
     <branch id="HEAD"/>
     <branch stringfrozen="true" id="glib-2-10"/>
     <branch id="glib-2-12"/>
@@ -1305,7 +1307,7 @@
   </module>
   <module id="release-notes">
     <_description>GNOME Release Notes</_description>
-    <svnmodule>gnomeweb-wml</svnmodule>
+    <scmmodule>gnomeweb-wml</scmmodule>
     <branch id="HEAD">
       <document id="release-notes-2.18">
         <_description>GNOME 2.18 release notes</_description>
@@ -1411,56 +1413,61 @@
   <module id="gstreamer">
     <webpage>http://gstreamer.freedesktop.org</webpage>
     <bugs-component>gstreamer (core)</bugs-component>
-    <cvsroot>:pserver:anoncvs@cvs.freedesktop.org:/cvs/gstreamer</cvsroot>
-    <cvsmodule>gstreamer</cvsmodule>
-    <cvsweb>http://cvs.freedesktop.org/gstreamer/gstreamer/?only_with_id=%(branch/id)</cvsweb>
-    <svnroot />
+    <scmroot type="cvs">
+      <path>:pserver:anoncvs@cvs.freedesktop.org:/cvs/gstreamer</path>
+    </scmroot>
+    <scmmodule>gstreamer</scmmodule>
+    <scmweb>http://cvs.freedesktop.org/gstreamer/gstreamer/?only_with_id=%(branch/id)</scmweb>
     <branch id="HEAD">
-      <cvsweb>http://cvs.freedesktop.org/gstreamer/gstreamer/</cvsweb>
+      <scmweb>http://cvs.freedesktop.org/gstreamer/gstreamer/</scmweb>
     </branch>
   </module>
   <module id="gst-plugins-base">
     <webpage>http://gstreamer.freedesktop.org</webpage>
     <bugs-component>gst-plugins-base</bugs-component>
-    <cvsroot>:pserver:anoncvs@cvs.freedesktop.org:/cvs/gstreamer</cvsroot>
-    <cvsmodule>gst-plugins-base</cvsmodule>
-    <cvsweb>http://cvs.freedesktop.org/gstreamer/gst-plugins-base/?only_with_id=%(branch/id)</cvsweb>
-    <svnroot />
+    <scmroot type="cvs">
+      <path>:pserver:anoncvs@cvs.freedesktop.org:/cvs/gstreamer</path>
+    </scmroot>
+    <scmmodule>gst-plugins-base</scmmodule>
+    <scmweb>http://cvs.freedesktop.org/gstreamer/gst-plugins-base/?only_with_id=%(branch/id)</scmweb>
     <branch id="HEAD">
-      <cvsweb>http://cvs.freedesktop.org/gstreamer/gst-plugins-base/</cvsweb>
+      <scmweb>http://cvs.freedesktop.org/gstreamer/gst-plugins-base/</scmweb>
     </branch>
   </module>
   <module id="gst-plugins-good">
     <webpage>http://gstreamer.freedesktop.org</webpage>
     <bugs-component>gst-plugins-good</bugs-component>
-    <cvsroot>:pserver:anoncvs@cvs.freedesktop.org:/cvs/gstreamer</cvsroot>
-    <cvsmodule>gst-plugins-good</cvsmodule>
-    <cvsweb>http://cvs.freedesktop.org/gstreamer/gst-plugins-good/?only_with_id=%(branch/id)</cvsweb>
-    <svnroot />
+    <scmroot type="cvs">
+      <path>:pserver:anoncvs@cvs.freedesktop.org:/cvs/gstreamer</path>
+    </scmroot>
+    <scmmodule>gst-plugins-good</scmmodule>
+    <scmweb>http://cvs.freedesktop.org/gstreamer/gst-plugins-good/?only_with_id=%(branch/id)</scmweb>
     <branch id="HEAD">
-      <cvsweb>http://cvs.freedesktop.org/gstreamer/gst-plugins-good/</cvsweb>
+      <scmweb>http://cvs.freedesktop.org/gstreamer/gst-plugins-good/</scmweb>
     </branch>
   </module>
   <module id="gst-plugins-bad">
     <webpage>http://gstreamer.freedesktop.org</webpage>
     <bugs-component>gst-plugins-bad</bugs-component>
-    <cvsroot>:pserver:anoncvs@cvs.freedesktop.org:/cvs/gstreamer</cvsroot>
-    <cvsmodule>gst-plugins-bad</cvsmodule>
-    <cvsweb>http://cvs.freedesktop.org/gstreamer/gst-plugins-bad/?only_with_id=%(branch/id)</cvsweb>
-    <svnroot />
+    <scmroot type="cvs">
+      <path>:pserver:anoncvs@cvs.freedesktop.org:/cvs/gstreamer</path>
+    </scmroot>
+    <scmmodule>gst-plugins-bad</scmmodule>
+    <scmweb>http://cvs.freedesktop.org/gstreamer/gst-plugins-bad/?only_with_id=%(branch/id)</scmweb>
     <branch id="HEAD">
-      <cvsweb>http://cvs.freedesktop.org/gstreamer/gst-plugins-bad/</cvsweb>
+      <scmweb>http://cvs.freedesktop.org/gstreamer/gst-plugins-bad/</scmweb>
     </branch>
   </module>
   <module id="gst-plugins-ugly">
     <webpage>http://gstreamer.freedesktop.org</webpage>
     <bugs-component>gst-plugins-ugly</bugs-component>
-    <cvsroot>:pserver:anoncvs@cvs.freedesktop.org:/cvs/gstreamer</cvsroot>
-    <cvsmodule>gst-plugins-ugly</cvsmodule>
-    <cvsweb>http://cvs.freedesktop.org/gstreamer/gst-plugins-ugly/?only_with_id=%(branch/id)</cvsweb>
-    <svnroot />
+    <scmroot type="cvs">
+      <path>:pserver:anoncvs@cvs.freedesktop.org:/cvs/gstreamer</path>
+    </scmroot>
+    <scmmodule>gst-plugins-ugly</scmmodule>
+    <scmweb>http://cvs.freedesktop.org/gstreamer/gst-plugins-ugly/?only_with_id=%(branch/id)</scmweb>
     <branch id="HEAD">
-      <cvsweb>http://cvs.freedesktop.org/gstreamer/gst-plugins-ugly/</cvsweb>
+      <scmweb>http://cvs.freedesktop.org/gstreamer/gst-plugins-ugly/</scmweb>
     </branch>
   </module>
   <module id="shared-mime-info">
@@ -1470,12 +1477,13 @@
     <bugs-baseurl>https://bugs.freedesktop.org/</bugs-baseurl>
     <bugs-product>shared-mime-info</bugs-product>
     <bugs-component>general</bugs-component>
-    <cvsroot>:pserver:anoncvs@cvs.freedesktop.org:/cvs/mime</cvsroot>
-    <cvsmodule>shared-mime-info</cvsmodule>
-    <cvsweb>http://cvs.freedesktop.org/mime/shared-mime-info/?only_with_id=%(branch/id)</cvsweb>
-    <svnroot />
+    <scmroot type="cvs">
+      <path>:pserver:anoncvs@cvs.freedesktop.org:/cvs/mime</path>
+    </scmroot>
+    <scmmodule>shared-mime-info</scmmodule>
+    <scmweb>http://cvs.freedesktop.org/mime/shared-mime-info/?only_with_id=%(branch/id)</scmweb>
     <branch id="HEAD">
-      <cvsweb>http://cvs.freedesktop.org/mime/shared-mime-info/</cvsweb>
+      <scmweb>http://cvs.freedesktop.org/mime/shared-mime-info/</scmweb>
     </branch>
   </module>
   <module id="xdg-user-dirs">
@@ -1483,15 +1491,16 @@
     <bugs-baseurl>https://bugs.freedesktop.org/</bugs-baseurl>
     <bugs-product>xdg-user-dirs</bugs-product>
     <bugs-component>General</bugs-component>
-    <cvsroot>:pserver:anoncvs@cvs.freedesktop.org:/cvs/user-dirs</cvsroot>
-    <cvsmodule>xdg-user-dirs</cvsmodule>
-    <cvsweb>http://cvs.freedesktop.org/user-dirs/xdg-user-dirs/?only_with_id=%(branch/id)</cvsweb>
-    <svnroot />
+    <scmroot type="cvs">
+      <path>:pserver:anoncvs@cvs.freedesktop.org:/cvs/user-dirs</path>
+    </scmroot>
+    <scmmodule>xdg-user-dirs</scmmodule>
+    <scmweb>http://cvs.freedesktop.org/user-dirs/xdg-user-dirs/?only_with_id=%(branch/id)</scmweb>
     <branch id="HEAD">
       <domain id="po">
         <_description>User Directories</_description>
       </domain>
-      <cvsweb>http://cvs.freedesktop.org/user-dirs/xdg-user-dirs/</cvsweb>
+      <scmweb>http://cvs.freedesktop.org/user-dirs/xdg-user-dirs/</scmweb>
     </branch>
   </module>
   <module id="xkeyboard-config">
@@ -1502,15 +1511,16 @@
     <bugs-baseurl>https://bugs.freedesktop.org/</bugs-baseurl>
     <bugs-product>xkeyboard-config</bugs-product>
     <bugs-component>General</bugs-component>
-    <cvsroot>:pserver:anoncvs@cvs.freedesktop.org:/cvs/xlibs</cvsroot>
-    <cvsmodule>xkbdesc</cvsmodule>
-    <cvsweb>http://cvs.freedesktop.org/xlibs/xkbdesc/?only_with_id=%(branch/id)</cvsweb>
-    <svnroot />
+    <scmroot type="cvs">
+      <path>:pserver:anoncvs@cvs.freedesktop.org:/cvs/xlibs</path>
+    </scmroot>
+    <scmmodule>xkbdesc</scmmodule>
+    <scmweb>http://cvs.freedesktop.org/xlibs/xkbdesc/?only_with_id=%(branch/id)</scmweb>
     <branch id="HEAD">
       <domain id="po">
         <_description>Layout Descriptions</_description>
       </domain>
-      <cvsweb>http://cvs.freedesktop.org/xlibs/xkbdesc/</cvsweb>
+      <scmweb>http://cvs.freedesktop.org/xlibs/xkbdesc/</scmweb>
     </branch>
   </module>
 </modules>
Index: modules.py
===================================================================
--- modules.py	(révision 390)
+++ modules.py	(copie de travail)
@@ -83,8 +83,8 @@
             if real_update:
                 if defaults.DEBUG:
                     print >>sys.stderr, "Checking '%s.%s' out to '%s'..." % (module["id"], branch, checkoutpath)
-                co = self.checkout(module["cvsroot"],
-                                   module["cvsmodule"], branch, 
+                co = self.checkout(module["scmroot"]["path"],
+                                   module["scmmodule"], branch, 
                                    localroot,
                                    moduledir)
 
@@ -150,8 +150,8 @@
             if real_update:
                 if defaults.DEBUG:
                     print >>sys.stderr, "Checking '%s.%s' out to '%s'..." % (module["id"], branch, checkoutpath)
-                co = self.checkout(module["svnroot"],
-                                   module["svnmodule"], branch, 
+                co = self.checkout(module["scmroot"]["path"],
+                                   module["scmmodule"], branch, 
                                    localroot,
                                    moduledir)
 
@@ -200,6 +200,152 @@
                 print >> sys.stderr, output
             return 0
 
+class HgModule:
+    """Checks out a module from Mercurial (hg) if necessary to be able to work on it."""
+
+    def __init__(self, module, real_update = 1):
+        if not module: return None
+
+        self.paths = {}
+        self.module = module
+
+        localroot = os.path.join(defaults.scratchdir, "hg")
+        branches = module["branch"].keys()
+        for branch in branches:
+            moduledir = module["id"] + "." + branch
+            checkoutpath = os.path.join(localroot, module["id"] + "." + branch)
+
+            if real_update:
+                if defaults.DEBUG:
+                    print >>sys.stderr, "Checking '%s.%s' out to '%s'..." % (module["id"], branch, checkoutpath)
+                co = self.checkout(module["scmroot"],
+                                   module["scmmodule"], branch, 
+                                   localroot,
+                                   moduledir)
+
+                if not co:
+                    print >> sys.stderr, "Problem checking out module %s.%s" % (module["id"], branch)
+                else:
+                    self.paths[branch] = checkoutpath
+            else:
+                if os.access(checkoutpath, os.X_OK):
+                    self.paths[branch] = checkoutpath
+
+
+    def checkout(self, hgroot, module, branch, localroot, moduledir):
+
+        import commands
+
+        try: os.makedirs(localroot)
+        except: pass
+
+        commandList=[]
+        if os.access(os.path.join(localroot, moduledir), os.X_OK | os.W_OK):
+            commandList.append("cd %(localdir)s && hg update %(branch)s" % {
+                "localdir" : os.path.join(localroot, moduledir),
+                "branch" : branch,
+                })
+        else:
+            hgpath = hgroot + "/" + module
+            commandList.append("cd %(localroot)s && hg clone %(hgpath)s %(dir)s" % {
+                "localroot" : localroot,
+                "hgpath" : hgpath,
+                "dir" : moduledir,
+                })
+            commandList.append("cd %(localdir)s && hg update %(branch)s" % {
+                "localdir" : os.path.join(localroot, moduledir),
+                "hgpath" : hgpath,
+                "branch" : branch,
+                })
+        errorsOccured = 0
+        for command in commandList:
+            if defaults.DEBUG:
+                print >>sys.stdout, command
+            (error, output) = commands.getstatusoutput(command)
+            if defaults.DEBUG:
+                print >> sys.stderr, output
+            if error:
+                errorsOccured = 1
+            if error and defaults.DEBUG:
+                print >> sys.stderr, error
+        if errorsOccured:
+            return 0
+        else:
+            return 1
+            
+class GitModule:
+    """Checks out a module from git if necessary to be able to work on it."""
+
+    def __init__(self, module, real_update = 1):
+        if not module: return None
+
+        self.paths = {}
+        self.module = module
+
+        localroot = os.path.join(defaults.scratchdir, "git")
+        branches = module["branch"].keys()
+        for branch in branches:
+            moduledir = module["id"] + "." + branch
+            checkoutpath = os.path.join(localroot, module["id"] + "." + branch)
+
+            if real_update:
+                if defaults.DEBUG:
+                    print >>sys.stderr, "Checking '%s.%s' out to '%s'..." % (module["id"], branch, checkoutpath)
+                co = self.checkout(module["scmroot"],
+                                   module["scmmodule"], branch, 
+                                   localroot,
+                                   moduledir)
+
+                if not co:
+                    print >> sys.stderr, "Problem checking out module %s.%s" % (module["id"], branch)
+                else:
+                    self.paths[branch] = checkoutpath
+            else:
+                if os.access(checkoutpath, os.X_OK):
+                    self.paths[branch] = checkoutpath
+
+
+    def checkout(self, gitroot, module, branch, localroot, moduledir):
+
+        import commands
+
+        try: os.makedirs(localroot)
+        except: pass
+
+        commandList=[]
+        if os.access(os.path.join(localroot, moduledir), os.X_OK | os.W_OK):
+            commandList.append("cd %(localdir)s && git checkout %(branch)s" % {
+                "localdir" : os.path.join(localroot, moduledir),
+                "branch" : branch,
+                })
+        else:
+            gitpath = gitroot + "/" + module
+            commandList.append("cd %(localroot)s && git clone %(gitpath)s %(dir)s" % {
+                "localroot" : localroot,
+                "gitpath" : gitpath,
+                "dir" : moduledir,
+                })
+            commandList.append("cd %(localdir)s && git checkout %(branch)s" % {
+                "localdir" : os.path.join(localroot, moduledir),
+                "gitpath" : gitpath,
+                "branch" : branch,
+                })
+        errorsOccured = 0
+        for command in commandList:
+            if defaults.DEBUG:
+                print >>sys.stdout, command
+            (error, output) = commands.getstatusoutput(command)
+            if defaults.DEBUG:
+                print >> sys.stderr, output
+            if error:
+                errorsOccured = 1
+            if error and defaults.DEBUG:
+                print >> sys.stderr, error
+        if errorsOccured:
+            return 0
+        else:
+            return 1
+
 if __name__=="__main__":
     m = XmlModules()
     import pprint
Index: update-stats.py
===================================================================
--- update-stats.py	(révision 390)
+++ update-stats.py	(copie de travail)
@@ -80,10 +80,15 @@
 
     def __init__(self, module, onlybranch = None):
         self.module = module
-        if module.has_key('cvsroot'):
+        scmtype = module["scmroot"]["type"]
+        if scmtype=="cvs":
             COs = modules.CvsModule(module, 1)
-        elif module.has_key('svnroot'):
+        elif scmtype=="svn":
             COs = modules.SvnModule(module, 1)
+        elif scmtype=="git":
+            COs = modules.GitModule(module, 1)
+        elif scmtype=="hg":
+            COs = modules.HgModule(module, 1)
         else:
             raise Exception("Can't fetch source code for this module.")
 
Index: releases.py
===================================================================
--- releases.py	(révision 390)
+++ releases.py	(copie de travail)
@@ -103,11 +103,8 @@
                         retmodules[modid]['maintainers'] = myMod['maintainer']
                     else:
                         retmodules[modid]['maintainers'] = {}
-                    if myMod.has_key('cvsmodule'):
-                        retmodules[modid]['cvsmodule'] = myMod['cvsmodule']
-                    if myMod.has_key('svnmodule'):
-                        retmodules[modid]['svnmodule'] = myMod['svnmodule']
-                        retmodules[modid]['cvsmodule'] = myMod['svnmodule']
+                    if myMod.has_key('scmmodule'):
+                        retmodules[modid]['scmmodule'] = myMod['scmmodule']
 
                     if gather_stats and myMod.has_key('branch') and myMod['branch'].has_key(branch):
                         trdomains = myMod['branch'][branch]['domain']
Index: templates/language-release-doc-stats-modules.tmpl
===================================================================
--- templates/language-release-doc-stats-modules.tmpl	(révision 390)
+++ templates/language-release-doc-stats-modules.tmpl	(copie de travail)
@@ -32,14 +32,14 @@
      <tr>
        #if len($module.documents.keys()) > 1
         <td class="left" style="padding-left:2em; padding-right:2em;">
-         <a href="$POFILE" title="module: '$module.cvsmodule/$docdir', branch: '$module.branch'"><img src="${webroot}/data/download.png" alt="$_("Download po file")"/></a>${document.description}
+         <a href="$POFILE" title="module: '$module.scmmodule/$docdir', branch: '$module.branch'"><img src="${webroot}/data/download.png" alt="$_("Download po file")"/></a>${document.description}
          #for pomsgs in $POINFO
            <img src="${webroot}/data/${pomsgs[0]}.png" title="${pomsgs[1]}" />
          #end for
         </td>
        #else
         <td class="left">
-         <a href="$POFILE" title="module: '$module.cvsmodule/$docdir', branch: '$module.branch'"><img src="${webroot}/data/download.png" alt="$_("Download po file")"/></a> <a href="${webroot}/module/${moduleid}" title="branch: '$module.branch'">${module.description}</a>
+         <a href="$POFILE" title="module: '$module.scmmodule/$docdir', branch: '$module.branch'"><img src="${webroot}/data/download.png" alt="$_("Download po file")"/></a> <a href="${webroot}/module/${moduleid}" title="branch: '$module.branch'">${module.description}</a>
          #for pomsgs in $POINFO
            <img src="${webroot}/data/${pomsgs[0]}.png" title="${pomsgs[1]}" />
          #end for
Index: templates/language-release-ui-stats-modules.tmpl
===================================================================
--- templates/language-release-ui-stats-modules.tmpl	(révision 390)
+++ templates/language-release-ui-stats-modules.tmpl	(copie de travail)
@@ -29,14 +29,14 @@
 
      <tr>
       #if len($module.translation_domains.keys()) > 1
-       <td class="left" style="padding-left:2em; padding-right:2em;" title="module: '$module.cvsmodule/$domaindir', branch: '$module.branch'">
+       <td class="left" style="padding-left:2em; padding-right:2em;" title="module: '$module.scmmodule/$domaindir', branch: '$module.branch'">
        	 <a href="$POFILE"><img src="${webroot}/data/download.png" alt="$_("Download po file")"/></a>${domain.description}
        #for pomsgs in $POINFO
        	 <img src="${webroot}/data/${pomsgs[0]}.png" title="${pomsgs[1]}" />
        #end for
        </td>
       #else
-       <td class="left" title="module: '$module.cvsmodule/$domaindir', branch: '$module.branch'">
+       <td class="left" title="module: '$module.scmmodule/$domaindir', branch: '$module.branch'">
          <a href="$POFILE"><img src="${webroot}/data/download.png" alt="$_("Download po file")"/></a> <a href="${webroot}/module/${moduleid}">${module.description}</a>
        #for pomsgs in $POINFO
        	 <img src="${webroot}/data/${pomsgs[0]}.png" title="${pomsgs[1]}" />
Index: templates/language-release-module-xml.tmpl
===================================================================
--- templates/language-release-module-xml.tmpl	(révision 390)
+++ templates/language-release-module-xml.tmpl	(copie de travail)
@@ -40,7 +40,7 @@
         #else
           #set docpath='help'
         #end if
-	<svnpath>${module.cvsmodule}/$MODROOT/$docpath/$language</svnpath>       
+	<svnpath>${module.scmmodule}/$MODROOT/$docpath/$language</svnpath>       
          #for pomsgs in $POINFO
            <error type="${pomsgs[0]}">${pomsgs[1]}</error>
          #end for
@@ -67,7 +67,7 @@
         #else
           #set MODROOT="branches/"+$branch
         #end if
-	<svnpath>${module.cvsmodule}/$MODROOT/$potid</svnpath>
+	<svnpath>${module.scmmodule}/$MODROOT/$potid</svnpath>
 
          #for pomsgs in $POINFO
            <error type="${pomsgs[0]}">${pomsgs[1]}</error>
Index: templates/module.tmpl
===================================================================
--- templates/module.tmpl	(révision 390)
+++ templates/module.tmpl	(copie de travail)
@@ -28,7 +28,7 @@
 <div class="mainpage">
 
 <h1>$module.description</h1>
-#if not $module.has_key('svnroot') or $module.svnroot!="http://svn.gnome.org/svn"
+#if $module.scmroot.path!="http://svn.gnome.org/svn"
 <p><i><img src="${webroot}/data/warn.png" alt="Warning logo" /> $_("This module is not part of the GNOME SVN repository. Please check the module's web page to see where to send translations.")</i></p>
 #end if
 #if $module.has_key('webpage') and $module.webpage
@@ -75,12 +75,12 @@
 #for branch in $branches
 #set data=$module.branch[$branch]
 <h2><a name="$branch"></a>$branch
-#if $data.has_key('cvsweb')
-(<a href="$data['cvsweb']">$_("Browse CVS")</a>)
-#elif $data.has_key('svnweb') and $branch!='HEAD'
-(<a href="$data['svnweb']">$_("Browse SVN")</a>)
-#elif $module.has_key('svnweb')
-(<a href="$module['svnweb']">$_("Browse SVN")</a>)
+#if $module.scmroot.type == "cvs" and $data.has_key('scmweb')
+(<a href="$data['scmweb']">$_("Browse CVS")</a>)
+#elif $module.scmroot.type == "svn" and $data.has_key('scmweb') and $branch!='HEAD'
+(<a href="$data['scmweb']">$_("Browse SVN")</a>)
+#elif $module.scmroot.type == "svn" and $module.has_key('scmweb')
+(<a href="$module['scmweb']">$_("Browse SVN")</a>)
 #end if
 </h2>
 #if $data.has_key('stringfrozen') and $data.stringfrozen
Index: data.py
===================================================================
--- data.py     (révision 390)
+++ data.py     (copie de travail)
@@ -185,12 +185,16 @@
                 if not data.has_key (key): data[key] = {}
                 for i in defsDict[key].keys():
                     id = pat.sub (subsFunc, i)
-                    if not data[key].has_key (id): data[key][id] = {}
-                    newThings = copy.copy(things)
-                    newThings[key] = data[key][id]
-                    _applyDefaultsData (data[key][id], key, defsDict[key][i],
+                    if type(val[id]) == type(u''):
+                        if not data[key].has_key (id):
+                            data[key][id] = pat.sub (subsFunc, val[id])
+                    else:
+                        if not data[key].has_key (id): data[key][id] = {}
+                        newThings = copy.copy(things)
+                        newThings[key] = data[key][id]
+                        _applyDefaultsData (data[key][id], key, defsDict[key][i],
                                         defsList=defsList, things=newThings)
-                    _applyDefaultsList (data[key][id], key,
+                        _applyDefaultsList (data[key][id], key,
                                         defsList=defsList, things=newThings)
             else:
                 #FIXME: be stricter

