diff --git a/lib/spack/spack/fetch_strategy.py b/lib/spack/spack/fetch_strategy.py
index bafd99f885a9c4b9035a90ee1751be3484e9d145..dd7ebd248b5ea471e62de0d687e32930f76d8981 100644
--- a/lib/spack/spack/fetch_strategy.py
+++ b/lib/spack/spack/fetch_strategy.py
@@ -26,6 +26,7 @@
 import re
 import shutil
 import copy
+import xml.etree.ElementTree
 from functools import wraps
 from six import string_types, with_metaclass
 
@@ -771,13 +772,9 @@ def source_id(self):
         return self.revision
 
     def get_source_id(self):
-        output = self.svn('info', self.url, output=str)
-        if not output:
-            return None
-        lines = output.split('\n')
-        for line in lines:
-            if line.startswith('Revision:'):
-                return line.split()[-1]
+        output = self.svn('info', '--xml', self.url, output=str)
+        info = xml.etree.ElementTree.fromstring(output)
+        return info.find('entry/commit').get('revision')
 
     @_needs_stage
     def fetch(self):
diff --git a/lib/spack/spack/test/conftest.py b/lib/spack/spack/test/conftest.py
index 8107ffe1226fc0888f42a62d6c8c174ea9663ed6..9991b53f301352b7ff2fc39aac10997688733011 100644
--- a/lib/spack/spack/test/conftest.py
+++ b/lib/spack/spack/test/conftest.py
@@ -9,7 +9,7 @@
 import os
 import os.path
 import shutil
-import re
+import xml.etree.ElementTree
 
 import ordereddict_backport
 import py
@@ -725,12 +725,9 @@ def mock_svn_repository(tmpdir_factory):
     }
 
     def get_rev():
-        output = svn('info', output=str)
-        assert "Revision" in output
-        for line in output.split('\n'):
-            match = re.match(r'Revision: (\d+)', line)
-            if match:
-                return match.group(1)
+        output = svn('info', '--xml', output=str)
+        info = xml.etree.ElementTree.fromstring(output)
+        return info.find('entry/commit').get('revision')
 
     t = Bunch(checks=checks, url=url, hash=get_rev, path=str(repodir))
     yield t