Fix bzrlib.builtins.cmd_ls() recursion argument for pre 2.0 bzrlibs.
authorW. Trevor King <wking@drexel.edu>
Thu, 28 Jan 2010 16:47:59 +0000 (11:47 -0500)
committerW. Trevor King <wking@drexel.edu>
Thu, 28 Jan 2010 16:47:59 +0000 (11:47 -0500)
$ python test.py libbe.storage.vcs.bzr
...
======================================================================
ERROR: Children list should be revision dependent.
----------------------------------------------------------------------
Traceback (most recent call last):
  File ".../libbe/storage/base.py", line 997, in test_
get_previous_children
    ret = sorted(self.s.children('parent', revision=revs[i]))
  File ".../libbe/storage/base.py", line 314, in child
ren
    return self._children(*args, **kwargs)
  File ".../libbe/storage/vcs/base.py", line 811, in _
children
    path = self.path(id, revision, relpath=False)
  File ".../libbe/storage/vcs/base.py", line 716, in p
ath
    path = self._vcs_path(id, revision)
  File ".../libbe/storage/vcs/bzr.py", line 145, in _v
cs_path
    self.repo, revision=revision, recursive=True)
  File ".../libbe/storage/vcs/bzr.py", line 163, in _v
cs_listdir
    cmd.run(revision=revision, path=path, recursive=recursive)
  File "/usr/lib/python2.5/site-packages/bzrlib/commands.py", line 800, in ignor
e_pipe
    result = func(*args, **kwargs)
TypeError: run() got an unexpected keyword argument 'recursive'
...

The change is due to (in bzr.dev):

revno: 4206.2.1
revision-id: ian.clatworthy@canonical.com-20090326133831-orvicmmc6w29mpfp
parent: pqm@pqm.ubuntu.com-20090326063330-evutyvml3067dpsz
committer: Ian Clatworthy <ian.clatworthy@canonical.com>
branch nick: bzr.ls-recursive-off
timestamp: Thu 2009-03-26 23:38:31 +1000
message: ls should be non-recursive by default

Which occured between bzr-1.9rc1 and 2.0rc1.:

bzr.dev$ bzr tags
2.0rc1               4634.9.1
...
bzr-1.9rc1           3815.3.1
bzr-2.0.1            4634.73.2
...

libbe/storage/vcs/bzr.py

index 1db50f826878236f954c071c91216915677c1738..b617d68801ec5d8fba530e4b63817185a3bcb332 100644 (file)
@@ -62,6 +62,46 @@ class Bzr(base.VCS):
             return None
         return bzrlib.__version__
 
+    def version_cmp(self, *args):
+        """
+        Compare the installed Bazaar version V_i with another version
+        V_o (given in *args).  Returns
+           1 if V_i > V_o,
+           0 if V_i == V_o, and
+          -1 if V_i < V_o
+        >>> b = Bzr(repo='.')
+        >>> b._vcs_version = lambda : "2.3.1 (release)"
+        >>> b.version_cmp(2,3,1)
+        0
+        >>> b.version_cmp(2,3,2)
+        -1
+        >>> b.version_cmp(2,3,0)
+        1
+        >>> b.version_cmp(3)
+        -1
+        >>> b._vcs_version = lambda : "2.0.0pre2"
+        >>> b._parsed_version = None
+        >>> b.version_cmp(3)
+        Traceback (most recent call last):
+          ...
+        NotImplementedError: Cannot parse "2.0.0pre2" portion of Bazaar version "2.0.0pre2"
+          invalid literal for int() with base 10: '0pre2'
+        """
+        if not hasattr(self, '_parsed_version') \
+                or self._parsed_version == None:
+            num_part = self._vcs_version().split(' ')[0]
+            try:
+                self._parsed_version = [int(i) for i in num_part.split('.')]
+            except ValueError, e:
+                raise NotImplementedError(
+                    'Cannot parse "%s" portion of Bazaar version "%s"\n  %s'
+                    % (num_part, self._vcs_version(), str(e)))
+        cmps = [cmp(a,b) for a,b in zip(self._parsed_version, args)]
+        for c in cmps:
+            if c != 0:
+                return c
+        return 0
+
     def _vcs_get_user_id(self):
         # excerpted from bzrlib.builtins.cmd_whoami.run()
         try:
@@ -160,7 +200,11 @@ class Bzr(base.VCS):
         cmd = bzrlib.builtins.cmd_ls()
         cmd.outf = StringIO.StringIO()
         try:
-            cmd.run(revision=revision, path=path, recursive=recursive)
+            if self.version_cmp(2,0,0) == 1:
+                cmd.run(revision=revision, path=path, recursive=recursive)
+            else: # Pre-2.0 Bazaar
+                cmd.run(revision=revision, path=path,
+                        non_recursive=not recursive)
         except bzrlib.errors.BzrCommandError, e:
             if 'not present in revision' in str(e):
                 raise base.InvalidPath(path, root=self.repo, revision=revision)