archive: make it work with svn subrepos (issue3308)
- _svncommand() in files() returns a tuple since 0ae98cd2a83f not a string.
- _svncommand() in filedata() returns a tuple not a string.
- "svn list" returns files but also directories.
- "svn list" is not recursive by default.
I have no idea what happens to svn:externals possibly embedded in the svn
subrepository.
--- a/mercurial/subrepo.py Fri Apr 13 15:07:13 2012 +0200
+++ b/mercurial/subrepo.py Mon Apr 16 11:48:15 2012 +0200
@@ -740,12 +740,21 @@
return True
def files(self):
- output = self._svncommand(['list'])
- # This works because svn forbids \n in filenames.
- return output.splitlines()
+ output = self._svncommand(['list', '--recursive', '--xml'])[0]
+ doc = xml.dom.minidom.parseString(output)
+ paths = []
+ for e in doc.getElementsByTagName('entry'):
+ kind = str(e.getAttribute('kind'))
+ if kind != 'file':
+ continue
+ name = ''.join(c.data for c
+ in e.getElementsByTagName('name')[0].childNodes
+ if c.nodeType == c.TEXT_NODE)
+ paths.append(name)
+ return paths
def filedata(self, name):
- return self._svncommand(['cat'], name)
+ return self._svncommand(['cat'], name)[0]
class gitsubrepo(abstractsubrepo):
--- a/tests/test-subrepo-svn.t Fri Apr 13 15:07:13 2012 +0200
+++ b/tests/test-subrepo-svn.t Mon Apr 16 11:48:15 2012 +0200
@@ -543,3 +543,16 @@
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ test -f recreated/somethingold
+Test archive
+
+ $ hg archive -S ../archive-all --debug
+ archiving: 0/2 files (0.00%)
+ archiving: .hgsub 1/2 files (50.00%)
+ archiving: .hgsubstate 2/2 files (100.00%)
+ archiving (obstruct): 0/1 files (0.00%)
+ archiving (obstruct): 1/1 files (100.00%)
+ archiving (s): 0/2 files (0.00%)
+ archiving (s): 1/2 files (50.00%)
+ archiving (s): 2/2 files (100.00%)
+ archiving (recreated): 0/1 files (0.00%)
+ archiving (recreated): 1/1 files (100.00%)