==== Patch <I18NsvnInfo> level 1
Source: 64aeed2c-32e1-e74b-a05d-363db3c4f845:/local/svnmerge:118
Target: 612f8ebc-c883-4be0-9ee0-a4e9ef946e3a:/trunk/contrib/client-side/svnmerge:29770
        (http://svn.collab.net/repos/svn/trunk/contrib/client-side/svnmerge)
Log:
 r117@LPETIT:  Laurent | 2008-03-07 21:25:09 +0100
 branche svnmerge locale
 r118@LPETIT:  Laurent | 2008-03-07 21:43:18 +0100
 Internationalization effort of svnmerge

=== svnmerge.py
==================================================================
--- svnmerge.py	(revision 29770)
+++ svnmerge.py	(patch I18NsvnInfo level 1)
@@ -69,6 +69,7 @@
 #  a URL.
 
 import sys, os, getopt, re, types, tempfile, time, popen2, locale
+import xml.dom.minidom
 from bisect import bisect
 from xml.dom import pulldom
 
@@ -763,21 +764,37 @@
     return os.path.isdir(os.path.join(dir, ".svn")) or \
            os.path.isdir(os.path.join(dir, "_svn"))
 
+def getText(node):
+    """Returns the text contained in a Dom node"""
+    rc = ""
+    for childNode in node.childNodes:
+        if childNode.nodeType == childNode.TEXT_NODE:
+            rc = rc + childNode.data
+    return rc
+
 _cache_svninfo = {}
+_infoKeys = { "URL": {"elem":"url","attr":None}, 
+               "Repository Root" : {"elem":"root","attr":None}, 
+               "Revision": {"elem":"entry","attr":"revision"} 
+            }
+    
 def get_svninfo(target):
     """Extract the subversion information for a target (through 'svn info').
     This function uses an internal cache to let clients query information
     many times."""
     if _cache_svninfo.has_key(target):
-        return _cache_svninfo[target]
-    info = {}
-    for L in launchsvn('info "%s"' % target):
-        L = L.strip()
-        if not L:
-            continue
-        key, value = L.split(": ", 1)
-        info[key] = value.strip()
-    _cache_svninfo[target] = info
+        return _cache_svninfo[target]
+    info = {}
+    infoSvnResult = launchsvn(' --xml info "%s" ' % target, split_lines = False)
+    infoXml = xml.dom.minidom.parseString(infoSvnResult)
+    for key,path in _infoKeys.iteritems() :
+        node = infoXml.getElementsByTagName(path["elem"])[0]
+        if path["attr"] != None :
+            value = node.getAttribute(path["attr"])
+        else:
+            value = getText(node)
+        info[key] = value.strip()
+    _cache_svninfo[target] = info
     return info
 
 def target_to_url(target):

==== BEGIN SVK PATCH BLOCK ====
Version: svk v2.0.2 (MSWin32)

eJyNVetq40YUdv8aDP3Z/miZCoW12cjR6GLL2sa4yyY0bHCXxNsuhGDGo6NYRJbMaGTWGwU2TUsf
IY/Ql+hb9EffpvSM5FsCS9f4opk55/vO5ZvjYzF6MaBFv28WOjWL859f+/4bJvl0jzqF3ikgiGQq
dLeIYQGxbhdxeqU7RcJmgKdZmguuHiQTVyDVQ8SvQfb7FOG8Cu6ohFjDlqgTJtMk03sl/FgKAJ0W
1sAuqvdYp70iAzwpYccCFlEWpQnSU+qhAVpT9E7nkIxFmkqMz+p1u+bAUr5mweM0g7ECx52Bq+yt
tX0YxchGi2yRzADh2/NlCbeGKOndFUQQCeAYfWlSYZWnbD6Pl2MJ72UAsWQlvm0Voel6geNOJrbV
4dQNGXQnYQiUMjZx7NDVez0LizKs1X779/vf72++/cOpPXxde6jd/fXNw1cf749rv3559/ePH+9/
qd3/+cXdPy+i2TwVkryfxe0gnbVnURLhbyOAkGBhRsjfTNIAWn6jTvCladoZyFwkGZFTICo+wtNE
siiBgEQJYeRVOiPKBU0rH8HJIVkvwlQQPo3iYIgmykGZtjc72YpHvaJwa9lWZqPlHMjh4c7u6Ojd
aDz86dXRjtuGEr+e79gGTLJVQGUGeN6oN+pjzvgUxtisKAlTdLu5rY/V42tYZmpJtLdnp5pPbjSI
Yab5Wi5ibV9jUgrNH6YJ3O6Tx+yqTmcwTzMlyyU5Q/1oZAdACepzECpN7lJDIsVy46qtZavdPvG/
LVeNanOT13Z5vkjOIMtjifsxyxM+xfybz4hhoBAqB20v08gzskeqK7JPsnmMVynGRquyHLM4g9YW
8R36HT6VUXvORAbnUkTJVfMRb2urhmtY7s+ZnCoxbArfjiQI/MyyZovsNFfJAHlWjG0M7Agrg2XJ
Xi5H7GqIU6OpwC6qil22LszLR4qqDsv6XZLvDokqP3mingWLc8VSShMpfkDraJLLNXTl3do6Adbi
ExiPLtFOJJjABWZ+iSalaTtDjnlzZfJYlBdVCy5XiTcGzu4QqsZNNR4c0wyoy5nrhJbnBJxbPYAJ
Dxjv2NzqQjmHaMcriKC0Ozh9czQ6GfmEnLJcYBFJQSzT9AzTNswusahvub7ZI89Napp1MhEMhQJk
PddInHIWQ11hef+P5dg+9dZYJwn2N2ESxcvi6EP5QCAM1SxKww1FXc3RE+oNceMEU+/3rUK3rGrs
j8qq+P7bJFqAyFi81ynwn0P1COc43g1c5HkUqHF6UMZ6sMat5rxud4qOwwACixu2BdSArjMxmOkG
ht2xg4nNndBz3H7LKj6FbSO2FHlyfaDGIMrkgMcRpm9kUQBbvtXsLxmpFXrYFIN7nm04EzANbJJp
MAd6EPacDthMdz8vMv9JXj5m9R+Kd0lO
==== END SVK PATCH BLOCK ====
