[patch] 'bzr mv' with no arguments breaks

Wouter van Heyst larstiq at larstiq.dyndns.org
Tue Jul 11 02:36:34 BST 2006


On Sat, Jul 08, 2006 at 10:38:38AM -0500, John Arbash Meinel wrote:
> 
> > +class TestMove(TestCaseWithTransport):
> > +
> > +    def test_mv_modes(self):
> > +        """Test two modes of operation for mv"""
> > +        tree = self.make_branch_and_tree('.')
> > +        files = self.build_tree(['a', 'c', 'subdir/'])
> > +        tree.add(['a', 'c', 'subdir'])
> > +
> > +        self.run_bzr('mv', 'a', 'b')
> > +        self.run_bzr('mv', 'b', 'subdir')
> > +        self.run_bzr('mv', 'subdir/b', 'a')
> > +        self.run_bzr('mv', 'a', 'c', 'subdir')
> > +        self.run_bzr('mv', 'subdir/a', 'subdir/newa')
> 
> We probably want to check that files are where we say they should be at
> this point. Using self.failIfExists() and self.failUnlessExists()
> It isn't critical, though.

I briefly had a wrapper to do the move and if/unless asserts, but it
can only be used on a couple calls, so now I've added them here too.


> 
> ...
> 
> > +    def test_mv_invalid(self):
> > +        tree = self.make_branch_and_tree('.')
> > +        self.build_tree(['test.txt', 'sub1/'])
> > +        tree.add(['test.txt'])
> > +
> > +        self.run_bzr_error(
> > +            ["^bzr: ERROR: destination u'sub1' is not a versioned directory$"],
> > +            'rename', 'test.txt', 'sub1')
> > +        
> > +        self.run_bzr_error(
> > +            ["^bzr: ERROR: can't determine destination directory id for u'sub1'$"],
> > +            'rename', 'test.txt', 'sub1/hello.txt')
> 
> I'm glad to see this being checked, since it shows that we probably
> aren't giving the right error. I think we should actually be giving
> 'sub1' is not a versioned directory.
> 
> Also, looking at it, we shouldn't be using %r, we should be using %s,
> because u'sub1' is confusing to anyone who isn't a python programmer.
> 
> I don't expect you to fix this, but if you could make a TODO out of it,
> that would be nice.

I had a brief look at WorkingTree.move, and apart from using %r, there
are several BzrErrors that aren't tested for. I'd like to come back to
those soon, but not right now for this unqualified mv.

...

> If you want to test 'rename' and 'move' as aliases of 'mv'. That's fine,
> but it should be done in a single test function, not randomly throughout
> the other tests. (And I do realize that this is just because you are
> cleaning up the ugly ugly OldTests.)

Added a smoketest for 'rename' and 'move'.

> 
> > === modified file bzrlib/builtins.py
> > --- bzrlib/builtins.py
> > +++ bzrlib/builtins.py
> > @@ -375,6 +375,9 @@
> >      encoding_type = 'replace'
> >  
> >      def run(self, names_list):
> > +        if names_list is None:
> > +            names_list = []
> > +
> >          if len(names_list) < 2:
> >              raise BzrCommandError("missing file argument")
> >          tree, rel_names = tree_files(names_list)
> 
> All of this for this one simple fix. :)

I don't mind the practice of the review process, but it would be nice to
get this done and out of the way. The attached patch isn't perfect (some
redundancy bothers me for instance), but is it good enough for now?

Wouter van Heyst
-------------- next part --------------
# Bazaar revision bundle v0.8
#
# message:
#   test mv more rigorously
# committer: Wouter van Heyst <larstiq at larstiq.dyndns.org>
# date: Tue 2006-07-11 03:14:17.277827024 +0200

=== added file bzrlib/tests/blackbox/test_mv.py // file-id:test_mv.py-200607051
... 14902-33tkxz0o9cdshemo-1
--- /dev/null
+++ bzrlib/tests/blackbox/test_mv.py
@@ -0,0 +1,130 @@
+# Copyright (C) 2006 by Canonical Ltd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+"""Test for 'bzr mv'"""
+
+import os
+
+from bzrlib.tests import TestCaseWithTransport
+
+
+class TestMove(TestCaseWithTransport):
+
+    def test_mv_modes(self):
+        """Test two modes of operation for mv"""
+        tree = self.make_branch_and_tree('.')
+        files = self.build_tree(['a', 'c', 'subdir/'])
+        tree.add(['a', 'c', 'subdir'])
+
+        self.run_bzr('mv', 'a', 'b')
+        self.failUnlessExists('b')
+        self.failIfExists('a')
+
+        self.run_bzr('mv', 'b', 'subdir')
+        self.failUnlessExists('subdir/b')
+        self.failIfExists('b')
+
+        self.run_bzr('mv', 'subdir/b', 'a')
+        self.failUnlessExists('a')
+        self.failIfExists('subdir/b')
+
+        self.run_bzr('mv', 'a', 'c', 'subdir')
+        self.failUnlessExists('subdir/a')
+        self.failUnlessExists('subdir/c')
+        self.failIfExists('a')
+        self.failIfExists('c')
+
+        self.run_bzr('mv', 'subdir/a', 'subdir/newa')
+        self.failUnlessExists('subdir/newa')
+        self.failIfExists('subdir/a')
+
+    def test_mv_unversioned(self):
+        self.build_tree(['unversioned.txt'])
+        self.run_bzr_error(
+            ["^bzr: ERROR: can't rename: old name .* is not versioned$"],
+            'mv', 'unversioned.txt', 'elsewhere')
+
+    def test_mv_nonexisting(self):
+        self.run_bzr_error(
+            ["^bzr: ERROR: can't rename: old working file .* does not exist$"],
+            'mv', 'doesnotexist', 'somewhereelse')
+
+    def test_mv_unqualified(self):
+        self.run_bzr_error(['^bzr: ERROR: missing file argument$'], 'mv')
+        
+    def test_mv_invalid(self):
+        tree = self.make_branch_and_tree('.')
+        self.build_tree(['test.txt', 'sub1/'])
+        tree.add(['test.txt'])
+
+        self.run_bzr_error(
+            ["^bzr: ERROR: destination u'sub1' is not a versioned directory$"],
+            'mv', 'test.txt', 'sub1')
+        
+        self.run_bzr_error(
+            ["^bzr: ERROR: can't determine destination directory id for u'sub1'$"],
+            'mv', 'test.txt', 'sub1/hello.txt')
+        
+    def test_mv_dirs(self):
+        tree = self.make_branch_and_tree('.')
+        self.build_tree(['hello.txt', 'sub1/'])
+        tree.add(['hello.txt', 'sub1'])
+
+        self.run_bzr('mv', 'sub1', 'sub2')
+        self.failUnlessExists('sub2')
+        self.failIfExists('sub1')
+        self.run_bzr('mv', 'hello.txt', 'sub2')
+        self.failUnlessExists("sub2/hello.txt")
+        self.failIfExists("hello.txt")
+
+        tree.read_working_inventory()
+        tree.commit('commit with some things moved to subdirs')
+
+        self.build_tree(['sub1/'])
+        tree.add(['sub1'])
+        self.run_bzr('mv', 'sub2/hello.txt', 'sub1')
+        self.failIfExists('sub2/hello.txt')
+        self.failUnlessExists('sub1/hello.txt')
+        self.run_bzr('mv', 'sub2', 'sub1')
+        self.failIfExists('sub2')
+        self.failUnlessExists('sub1/sub2')
+
+    def test_mv_relative(self):
+        self.build_tree(['sub1/', 'sub1/sub2/', 'sub1/hello.txt'])
+        tree = self.make_branch_and_tree('.')
+        tree.add(['sub1', 'sub1/sub2', 'sub1/hello.txt'])
+        tree.commit('initial tree')
+
+        os.chdir('sub1/sub2')
+        self.run_bzr('mv', '../hello.txt', '.')
+        self.failUnlessExists('./hello.txt')
+        tree.read_working_inventory()
+        tree.commit('move to parent directory')
+
+        os.chdir('..')
+
+        self.run_bzr('mv', 'sub2/hello.txt', '.')
+        self.failUnlessExists('hello.txt')
+
+    def test_mv_smoke_aliases(self):
+        # just test that aliases for mv exist, if their behaviour is changed in
+        # the future, then extend the tests.
+        self.build_tree(['a'])
+        tree = self.make_branch_and_tree('.')
+        tree.add(['a'])
+
+        self.run_bzr('move', 'a', 'b')
+        self.run_bzr('rename', 'b', 'a')

=== modified file bzrlib/builtins.py // last-changed:larstiq at larstiq.dyndns.org
... -20060709201249-91fa66f6001eb965
--- bzrlib/builtins.py
+++ bzrlib/builtins.py
@@ -375,6 +375,9 @@
     encoding_type = 'replace'
 
     def run(self, names_list):
+        if names_list is None:
+            names_list = []
+
         if len(names_list) < 2:
             raise BzrCommandError("missing file argument")
         tree, rel_names = tree_files(names_list)

=== modified file bzrlib/tests/blackbox/__init__.py // last-changed:larstiq at lar
... stiq.dyndns.org-20060709201249-91fa66f6001eb965
--- bzrlib/tests/blackbox/__init__.py
+++ bzrlib/tests/blackbox/__init__.py
@@ -64,6 +64,7 @@
                      'bzrlib.tests.blackbox.test_logformats',
                      'bzrlib.tests.blackbox.test_merge',
                      'bzrlib.tests.blackbox.test_missing',
+                     'bzrlib.tests.blackbox.test_mv',
                      'bzrlib.tests.blackbox.test_outside_wt',
                      'bzrlib.tests.blackbox.test_pull',
                      'bzrlib.tests.blackbox.test_push',

=== modified file bzrlib/tests/blackbox/test_too_much.py // last-changed:larsti
... q at larstiq.dyndns.org-20060709201249-91fa66f6001eb965
--- bzrlib/tests/blackbox/test_too_much.py
+++ bzrlib/tests/blackbox/test_too_much.py
@@ -147,17 +147,6 @@
         self.runbzr('revert')
         os.chdir('..')
 
-    def test_mv_modes(self):
-        """Test two modes of operation for mv"""
-        self.runbzr('init')
-        self.build_tree(['a', 'c', 'subdir/'])
-        self.run_bzr_captured(['add', self.test_dir])
-        self.run_bzr_captured(['mv', 'a', 'b'])
-        self.run_bzr_captured(['mv', 'b', 'subdir'])
-        self.run_bzr_captured(['mv', 'subdir/b', 'a'])
-        self.run_bzr_captured(['mv', 'a', 'c', 'subdir'])
-        self.run_bzr_captured(['mv', 'subdir/a', 'subdir/newa'])
-
     def test_main_version(self):
         """Check output from version command and master option is reasonable"""
         # output is intentionally passed through to stdout so that we
@@ -677,81 +666,20 @@
         out = capture("help ci")
         out.index('aliases: ')
 
-        progress("can't rename unversioned file")
-        runbzr("rename test.txt new-test.txt", 3)
-
-        progress("adding a file")
-
-        runbzr("add test.txt")
-        self.assertEquals(capture("unknowns"), '')
-
-        progress("rename newly-added file")
-        runbzr("rename test.txt hello.txt")
-        self.assert_(os.path.exists("hello.txt"))
-        self.assert_(not os.path.exists("test.txt"))
-
-        self.assertEquals(capture("revno"), '0\n')
-
-        progress("add first revision")
-        runbzr(['commit', '-m', 'add first revision'])
-
-        progress("more complex renames")
-        os.mkdir("sub1")
-        runbzr("rename hello.txt sub1", 3)
-        runbzr("rename hello.txt sub1/hello.txt", 3)
-        runbzr("move hello.txt sub1", 3)
-
-        runbzr("add sub1")
-        runbzr("rename sub1 sub2")
-        runbzr("move hello.txt sub2")
-        self.assertEqual(capture("relpath sub2/hello.txt"),
-                         pathjoin("sub2", "hello.txt\n"))
-
-        self.assert_(exists("sub2"))
-        self.assert_(exists("sub2/hello.txt"))
-        self.assert_(not exists("sub1"))
-        self.assert_(not exists("hello.txt"))
-
-        runbzr(['commit', '-m', 'commit with some things moved to subdirs'])
-
-        mkdir("sub1")
-        runbzr('add sub1')
-        runbzr('move sub2/hello.txt sub1')
-        self.assert_(not exists('sub2/hello.txt'))
-        self.assert_(exists('sub1/hello.txt'))
-        runbzr('move sub2 sub1')
-        self.assert_(not exists('sub2'))
-        self.assert_(exists('sub1/sub2'))
-
-        runbzr(['commit', '-m', 'rename nested subdirectories'])
-
-        chdir('sub1/sub2')
-        self.assertEquals(capture('root')[:-1],
-                          pathjoin(self.test_dir, 'branch1'))
-        runbzr('move ../hello.txt .')
-        self.assert_(exists('./hello.txt'))
-        self.assertEquals(capture('relpath hello.txt'),
-                          pathjoin('sub1', 'sub2', 'hello.txt') + '\n')
-        self.assertEquals(capture('relpath ../../sub1/sub2/hello.txt'), pathjoin('sub1', 'sub2', 'hello.txt\n'))
-        runbzr(['commit', '-m', 'move to parent directory'])
-        chdir('..')
-        self.assertEquals(capture('relpath sub2/hello.txt'), pathjoin('sub1', 'sub2', 'hello.txt\n'))
-
-        runbzr('move sub2/hello.txt .')
-        self.assert_(exists('hello.txt'))
-
         f = file('hello.txt', 'wt')
         f.write('some nice new content\n')
         f.close()
 
+        runbzr("add hello.txt")
+        
         f = file('msg.tmp', 'wt')
         f.write('this is my new commit\nand it has multiple lines, for fun')
         f.close()
 
         runbzr('commit -F msg.tmp')
 
-        self.assertEquals(capture('revno'), '5\n')
-        runbzr('export -r 5 export-5.tmp')
+        self.assertEquals(capture('revno'), '1\n')
+        runbzr('export -r 1 export-1.tmp')
         runbzr('export export.tmp')
 
         runbzr('log')

# revision id: larstiq at larstiq.dyndns.org-20060711011417-67a3cc31542a448f
# sha1: e5064be00a5c1f5fcdad04b7c1081821ee9a2a64
# inventory sha1: 6a7be8fe57c2b56581100c21ae9dc67c687d2e81
# parent ids:
#   larstiq at larstiq.dyndns.org-20060709201249-91fa66f6001eb965
# base id: pqm at pqm.ubuntu.com-20060709161745-764d41910ae59c5e
# properties:
#   branch-nick: bzr.mv

# message:
#   Don't fail on 'bzr mv', extract move tests from OldTests.
# committer: Wouter van Heyst <larstiq at larstiq.dyndns.org>
# date: Sun 2006-07-09 22:12:49.479820013 +0200

=== added file bzrlib/tests/blackbox/test_mv.py // file-id:test_mv.py-200607051
... 14902-33tkxz0o9cdshemo-1 // encoding:base64
LS0tIC9kZXYvbnVsbAorKysgYnpybGliL3Rlc3RzL2JsYWNrYm94L3Rlc3RfbXYucHkKQEAgLTAs
MCArMSwxMTggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA2IGJ5IENhbm9uaWNhbCBMdGQKKyMKKyMg
VGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGlu
IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJS
QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05V
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3Vs
ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UK
KyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29m
dHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJv
c3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisiIiJUZXN0IGZvciAnYnpyIG12JyIiIgorCitp
bXBvcnQgb3MKKworZnJvbSBienJsaWIudGVzdHMgaW1wb3J0IFRlc3RDYXNlV2l0aFRyYW5zcG9y
dAorCisKK2NsYXNzIFRlc3RNb3ZlKFRlc3RDYXNlV2l0aFRyYW5zcG9ydCk6CisKKyAgICBkZWYg
dGVzdF9tdl9tb2RlcyhzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0d28gbW9kZXMgb2Ygb3BlcmF0
aW9uIGZvciBtdiIiIgorICAgICAgICB0cmVlID0gc2VsZi5tYWtlX2JyYW5jaF9hbmRfdHJlZSgn
LicpCisgICAgICAgIGZpbGVzID0gc2VsZi5idWlsZF90cmVlKFsnYScsICdjJywgJ3N1YmRpci8n
XSkKKyAgICAgICAgdHJlZS5hZGQoWydhJywgJ2MnLCAnc3ViZGlyJ10pCisKKyAgICAgICAgc2Vs
Zi5ydW5fYnpyKCdtdicsICdhJywgJ2InKQorICAgICAgICBzZWxmLnJ1bl9ienIoJ212JywgJ2In
LCAnc3ViZGlyJykKKyAgICAgICAgc2VsZi5ydW5fYnpyKCdtdicsICdzdWJkaXIvYicsICdhJykK
KyAgICAgICAgc2VsZi5ydW5fYnpyKCdtdicsICdhJywgJ2MnLCAnc3ViZGlyJykKKyAgICAgICAg
c2VsZi5ydW5fYnpyKCdtdicsICdzdWJkaXIvYScsICdzdWJkaXIvbmV3YScpCisKKyAgICBkZWYg
dGVzdF9tdl91bnZlcnNpb25lZChzZWxmKToKKyAgICAgICAgc2VsZi5idWlsZF90cmVlKFsndW52
ZXJzaW9uZWQudHh0J10pCisgICAgICAgIHNlbGYucnVuX2J6cl9lcnJvcigKKyAgICAgICAgICAg
IFsiXmJ6cjogRVJST1I6IGNhbid0IHJlbmFtZTogb2xkIG5hbWUgLiogaXMgbm90IHZlcnNpb25l
ZCQiXSwKKyAgICAgICAgICAgICdtdicsICd1bnZlcnNpb25lZC50eHQnLCAnZWxzZXdoZXJlJykK
KworICAgIGRlZiB0ZXN0X212X25vbmV4aXN0aW5nKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl9i
enJfZXJyb3IoCisgICAgICAgICAgICBbIl5ienI6IEVSUk9SOiBjYW4ndCByZW5hbWU6IG9sZCB3
b3JraW5nIGZpbGUgLiogZG9lcyBub3QgZXhpc3QkIl0sCisgICAgICAgICAgICAnbXYnLCAnZG9l
c25vdGV4aXN0JywgJ3NvbWV3aGVyZWVsc2UnKQorCisgICAgZGVmIHRlc3RfbXZfdW5xdWFsaWZp
ZWQoc2VsZik6CisgICAgICAgIHNlbGYucnVuX2J6cl9lcnJvcihbJ15ienI6IEVSUk9SOiBtaXNz
aW5nIGZpbGUgYXJndW1lbnQkJ10sICdtdicpCisgICAgICAgIAorICAgIGRlZiB0ZXN0X212X25l
d2x5X2FkZGVkKHNlbGYpOgorICAgICAgICB0cmVlID0gc2VsZi5tYWtlX2JyYW5jaF9hbmRfdHJl
ZSgnLicpCisgICAgICAgIHNlbGYuYnVpbGRfdHJlZShbJ3Rlc3QudHh0J10pCisgICAgICAgIHRy
ZWUuYWRkKFsndGVzdC50eHQnXSkKKworICAgICAgICBzZWxmLnJ1bl9ienIoJ212JywgJ3Rlc3Qu
dHh0JywgJ2hlbGxvLnR4dCcpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0V4aXN0cygiaGVsbG8u
dHh0IikKKyAgICAgICAgc2VsZi5mYWlsSWZFeGlzdHMoInRlc3QudHh0IikKKworICAgIGRlZiB0
ZXN0X212X2ludmFsaWQoc2VsZik6CisgICAgICAgIHRyZWUgPSBzZWxmLm1ha2VfYnJhbmNoX2Fu
ZF90cmVlKCcuJykKKyAgICAgICAgc2VsZi5idWlsZF90cmVlKFsndGVzdC50eHQnLCAnc3ViMS8n
XSkKKyAgICAgICAgdHJlZS5hZGQoWyd0ZXN0LnR4dCddKQorCisgICAgICAgIHNlbGYucnVuX2J6
cl9lcnJvcigKKyAgICAgICAgICAgIFsiXmJ6cjogRVJST1I6IGRlc3RpbmF0aW9uIHUnc3ViMScg
aXMgbm90IGEgdmVyc2lvbmVkIGRpcmVjdG9yeSQiXSwKKyAgICAgICAgICAgICdyZW5hbWUnLCAn
dGVzdC50eHQnLCAnc3ViMScpCisgICAgICAgIAorICAgICAgICBzZWxmLnJ1bl9ienJfZXJyb3Io
CisgICAgICAgICAgICBbIl5ienI6IEVSUk9SOiBjYW4ndCBkZXRlcm1pbmUgZGVzdGluYXRpb24g
ZGlyZWN0b3J5IGlkIGZvciB1J3N1YjEnJCJdLAorICAgICAgICAgICAgJ3JlbmFtZScsICd0ZXN0
LnR4dCcsICdzdWIxL2hlbGxvLnR4dCcpCisgICAgICAgIAorICAgICAgICBzZWxmLnJ1bl9ienJf
ZXJyb3IoCisgICAgICAgICAgICBbIl5ienI6IEVSUk9SOiBkZXN0aW5hdGlvbiB1J3N1YjEnIGlz
IG5vdCBhIHZlcnNpb25lZCBkaXJlY3RvcnkkIl0sCisgICAgICAgICAgICAnbW92ZScsICd0ZXN0
LnR4dCcsICdzdWIxJykKKyAgICAKKyAgICBkZWYgdGVzdF9tdl9kaXJzKHNlbGYpOgorICAgICAg
ICB0cmVlID0gc2VsZi5tYWtlX2JyYW5jaF9hbmRfdHJlZSgnLicpCisgICAgICAgIHNlbGYuYnVp
bGRfdHJlZShbJ2hlbGxvLnR4dCcsICdzdWIxLyddKQorICAgICAgICB0cmVlLmFkZChbJ2hlbGxv
LnR4dCcsICdzdWIxJ10pCisKKyAgICAgICAgc2VsZi5ydW5fYnpyKCdyZW5hbWUnLCAnc3ViMScs
ICdzdWIyJykKKyAgICAgICAgc2VsZi5ydW5fYnpyKCdtb3ZlJywgJ2hlbGxvLnR4dCcsICdzdWIy
JykKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFeGlzdHMoInN1YjIiKQorICAgICAgICBzZWxm
LmZhaWxVbmxlc3NFeGlzdHMoInN1YjIvaGVsbG8udHh0IikKKyAgICAgICAgc2VsZi5mYWlsSWZF
eGlzdHMoInN1YjEiKQorICAgICAgICBzZWxmLmZhaWxJZkV4aXN0cygiaGVsbG8udHh0IikKKwor
ICAgICAgICB0cmVlLnJlYWRfd29ya2luZ19pbnZlbnRvcnkoKQorICAgICAgICB0cmVlLmNvbW1p
dCgnY29tbWl0IHdpdGggc29tZSB0aGluZ3MgbW92ZWQgdG8gc3ViZGlycycpCisKKyAgICAgICAg
c2VsZi5idWlsZF90cmVlKFsnc3ViMS8nXSkKKyAgICAgICAgdHJlZS5hZGQoWydzdWIxJ10pCisg
ICAgICAgIHNlbGYucnVuX2J6cignbW92ZScsICdzdWIyL2hlbGxvLnR4dCcsICdzdWIxJykKKyAg
ICAgICAgc2VsZi5mYWlsSWZFeGlzdHMoJ3N1YjIvaGVsbG8udHh0JykKKyAgICAgICAgc2VsZi5m
YWlsVW5sZXNzRXhpc3RzKCdzdWIxL2hlbGxvLnR4dCcpCisgICAgICAgIHNlbGYucnVuX2J6cign
bW92ZScsICdzdWIyJywgJ3N1YjEnKQorICAgICAgICBzZWxmLmZhaWxJZkV4aXN0cygnc3ViMicp
CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0V4aXN0cygnc3ViMS9zdWIyJykKKworICAgIGRlZiB0
ZXN0X212X3JlbGF0aXZlKHNlbGYpOiAKKyAgICAgICAgc2VsZi5idWlsZF90cmVlKFsnc3ViMS8n
LCAnc3ViMS9zdWIyLycsICdzdWIxL2hlbGxvLnR4dCddKQorICAgICAgICB0cmVlID0gc2VsZi5t
YWtlX2JyYW5jaF9hbmRfdHJlZSgnLicpCisgICAgICAgIHRyZWUuYWRkKFsnc3ViMScsICdzdWIx
L3N1YjInLCAnc3ViMS9oZWxsby50eHQnXSkKKyAgICAgICAgdHJlZS5jb21taXQoJ2luaXRpYWwg
dHJlZScpCisKKyAgICAgICAgb3MuY2hkaXIoJ3N1YjEvc3ViMicpCisgICAgICAgIHNlbGYucnVu
X2J6cignbW92ZScsICcuLi9oZWxsby50eHQnLCAnLicpCisgICAgICAgIHNlbGYuZmFpbFVubGVz
c0V4aXN0cygnLi9oZWxsby50eHQnKQorICAgICAgICB0cmVlLnJlYWRfd29ya2luZ19pbnZlbnRv
cnkoKQorICAgICAgICB0cmVlLmNvbW1pdCgnbW92ZSB0byBwYXJlbnQgZGlyZWN0b3J5JykKKwor
ICAgICAgICBvcy5jaGRpcignLi4nKQorCisgICAgICAgIHNlbGYucnVuX2J6cignbW92ZScsICdz
dWIyL2hlbGxvLnR4dCcsICcuJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXhpc3RzKCdoZWxs
by50eHQnKQoK

=== modified file bzrlib/builtins.py // encoding:base64
LS0tIGJ6cmxpYi9idWlsdGlucy5weQorKysgYnpybGliL2J1aWx0aW5zLnB5CkBAIC0zNzUsNiAr
Mzc1LDkgQEAKICAgICBlbmNvZGluZ190eXBlID0gJ3JlcGxhY2UnCiAKICAgICBkZWYgcnVuKHNl
bGYsIG5hbWVzX2xpc3QpOgorICAgICAgICBpZiBuYW1lc19saXN0IGlzIE5vbmU6CisgICAgICAg
ICAgICBuYW1lc19saXN0ID0gW10KKwogICAgICAgICBpZiBsZW4obmFtZXNfbGlzdCkgPCAyOgog
ICAgICAgICAgICAgcmFpc2UgQnpyQ29tbWFuZEVycm9yKCJtaXNzaW5nIGZpbGUgYXJndW1lbnQi
KQogICAgICAgICB0cmVlLCByZWxfbmFtZXMgPSB0cmVlX2ZpbGVzKG5hbWVzX2xpc3QpCgo=

=== modified file bzrlib/tests/blackbox/__init__.py // encoding:base64
LS0tIGJ6cmxpYi90ZXN0cy9ibGFja2JveC9fX2luaXRfXy5weQorKysgYnpybGliL3Rlc3RzL2Js
YWNrYm94L19faW5pdF9fLnB5CkBAIC02NCw2ICs2NCw3IEBACiAgICAgICAgICAgICAgICAgICAg
ICAnYnpybGliLnRlc3RzLmJsYWNrYm94LnRlc3RfbG9nZm9ybWF0cycsCiAgICAgICAgICAgICAg
ICAgICAgICAnYnpybGliLnRlc3RzLmJsYWNrYm94LnRlc3RfbWVyZ2UnLAogICAgICAgICAgICAg
ICAgICAgICAgJ2J6cmxpYi50ZXN0cy5ibGFja2JveC50ZXN0X21pc3NpbmcnLAorICAgICAgICAg
ICAgICAgICAgICAgJ2J6cmxpYi50ZXN0cy5ibGFja2JveC50ZXN0X212JywKICAgICAgICAgICAg
ICAgICAgICAgICdienJsaWIudGVzdHMuYmxhY2tib3gudGVzdF9vdXRzaWRlX3d0JywKICAgICAg
ICAgICAgICAgICAgICAgICdienJsaWIudGVzdHMuYmxhY2tib3gudGVzdF9wdWxsJywKICAgICAg
ICAgICAgICAgICAgICAgICdienJsaWIudGVzdHMuYmxhY2tib3gudGVzdF9wdXNoJywKCg==

=== modified file bzrlib/tests/blackbox/test_too_much.py // encoding:base64
LS0tIGJ6cmxpYi90ZXN0cy9ibGFja2JveC90ZXN0X3Rvb19tdWNoLnB5CisrKyBienJsaWIvdGVz
dHMvYmxhY2tib3gvdGVzdF90b29fbXVjaC5weQpAQCAtMTQ3LDE3ICsxNDcsNiBAQAogICAgICAg
ICBzZWxmLnJ1bmJ6cigncmV2ZXJ0JykKICAgICAgICAgb3MuY2hkaXIoJy4uJykKIAotICAgIGRl
ZiB0ZXN0X212X21vZGVzKHNlbGYpOgotICAgICAgICAiIiJUZXN0IHR3byBtb2RlcyBvZiBvcGVy
YXRpb24gZm9yIG12IiIiCi0gICAgICAgIHNlbGYucnVuYnpyKCdpbml0JykKLSAgICAgICAgc2Vs
Zi5idWlsZF90cmVlKFsnYScsICdjJywgJ3N1YmRpci8nXSkKLSAgICAgICAgc2VsZi5ydW5fYnpy
X2NhcHR1cmVkKFsnYWRkJywgc2VsZi50ZXN0X2Rpcl0pCi0gICAgICAgIHNlbGYucnVuX2J6cl9j
YXB0dXJlZChbJ212JywgJ2EnLCAnYiddKQotICAgICAgICBzZWxmLnJ1bl9ienJfY2FwdHVyZWQo
WydtdicsICdiJywgJ3N1YmRpciddKQotICAgICAgICBzZWxmLnJ1bl9ienJfY2FwdHVyZWQoWydt
dicsICdzdWJkaXIvYicsICdhJ10pCi0gICAgICAgIHNlbGYucnVuX2J6cl9jYXB0dXJlZChbJ212
JywgJ2EnLCAnYycsICdzdWJkaXInXSkKLSAgICAgICAgc2VsZi5ydW5fYnpyX2NhcHR1cmVkKFsn
bXYnLCAnc3ViZGlyL2EnLCAnc3ViZGlyL25ld2EnXSkKLQogICAgIGRlZiB0ZXN0X21haW5fdmVy
c2lvbihzZWxmKToKICAgICAgICAgIiIiQ2hlY2sgb3V0cHV0IGZyb20gdmVyc2lvbiBjb21tYW5k
IGFuZCBtYXN0ZXIgb3B0aW9uIGlzIHJlYXNvbmFibGUiIiIKICAgICAgICAgIyBvdXRwdXQgaXMg
aW50ZW50aW9uYWxseSBwYXNzZWQgdGhyb3VnaCB0byBzdGRvdXQgc28gdGhhdCB3ZQpAQCAtNjc3
LDgxICs2NjYsMjAgQEAKICAgICAgICAgb3V0ID0gY2FwdHVyZSgiaGVscCBjaSIpCiAgICAgICAg
IG91dC5pbmRleCgnYWxpYXNlczogJykKIAotICAgICAgICBwcm9ncmVzcygiY2FuJ3QgcmVuYW1l
IHVudmVyc2lvbmVkIGZpbGUiKQotICAgICAgICBydW5ienIoInJlbmFtZSB0ZXN0LnR4dCBuZXct
dGVzdC50eHQiLCAzKQotCi0gICAgICAgIHByb2dyZXNzKCJhZGRpbmcgYSBmaWxlIikKLQotICAg
ICAgICBydW5ienIoImFkZCB0ZXN0LnR4dCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNh
cHR1cmUoInVua25vd25zIiksICcnKQotCi0gICAgICAgIHByb2dyZXNzKCJyZW5hbWUgbmV3bHkt
YWRkZWQgZmlsZSIpCi0gICAgICAgIHJ1bmJ6cigicmVuYW1lIHRlc3QudHh0IGhlbGxvLnR4dCIp
Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cygiaGVsbG8udHh0IikpCi0gICAg
ICAgIHNlbGYuYXNzZXJ0Xyhub3Qgb3MucGF0aC5leGlzdHMoInRlc3QudHh0IikpCi0KLSAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbHMoY2FwdHVyZSgicmV2bm8iKSwgJzBcbicpCi0KLSAgICAgICAg
cHJvZ3Jlc3MoImFkZCBmaXJzdCByZXZpc2lvbiIpCi0gICAgICAgIHJ1bmJ6cihbJ2NvbW1pdCcs
ICctbScsICdhZGQgZmlyc3QgcmV2aXNpb24nXSkKLQotICAgICAgICBwcm9ncmVzcygibW9yZSBj
b21wbGV4IHJlbmFtZXMiKQotICAgICAgICBvcy5ta2Rpcigic3ViMSIpCi0gICAgICAgIHJ1bmJ6
cigicmVuYW1lIGhlbGxvLnR4dCBzdWIxIiwgMykKLSAgICAgICAgcnVuYnpyKCJyZW5hbWUgaGVs
bG8udHh0IHN1YjEvaGVsbG8udHh0IiwgMykKLSAgICAgICAgcnVuYnpyKCJtb3ZlIGhlbGxvLnR4
dCBzdWIxIiwgMykKLQotICAgICAgICBydW5ienIoImFkZCBzdWIxIikKLSAgICAgICAgcnVuYnpy
KCJyZW5hbWUgc3ViMSBzdWIyIikKLSAgICAgICAgcnVuYnpyKCJtb3ZlIGhlbGxvLnR4dCBzdWIy
IikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXB0dXJlKCJyZWxwYXRoIHN1YjIvaGVsbG8u
dHh0IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGF0aGpvaW4oInN1YjIiLCAiaGVsbG8u
dHh0XG4iKSkKLQotICAgICAgICBzZWxmLmFzc2VydF8oZXhpc3RzKCJzdWIyIikpCi0gICAgICAg
IHNlbGYuYXNzZXJ0XyhleGlzdHMoInN1YjIvaGVsbG8udHh0IikpCi0gICAgICAgIHNlbGYuYXNz
ZXJ0Xyhub3QgZXhpc3RzKCJzdWIxIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZXhpc3Rz
KCJoZWxsby50eHQiKSkKLQotICAgICAgICBydW5ienIoWydjb21taXQnLCAnLW0nLCAnY29tbWl0
IHdpdGggc29tZSB0aGluZ3MgbW92ZWQgdG8gc3ViZGlycyddKQotCi0gICAgICAgIG1rZGlyKCJz
dWIxIikKLSAgICAgICAgcnVuYnpyKCdhZGQgc3ViMScpCi0gICAgICAgIHJ1bmJ6cignbW92ZSBz
dWIyL2hlbGxvLnR4dCBzdWIxJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBleGlzdHMoJ3N1
YjIvaGVsbG8udHh0JykpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhleGlzdHMoJ3N1YjEvaGVsbG8u
dHh0JykpCi0gICAgICAgIHJ1bmJ6cignbW92ZSBzdWIyIHN1YjEnKQotICAgICAgICBzZWxmLmFz
c2VydF8obm90IGV4aXN0cygnc3ViMicpKQotICAgICAgICBzZWxmLmFzc2VydF8oZXhpc3RzKCdz
dWIxL3N1YjInKSkKLQotICAgICAgICBydW5ienIoWydjb21taXQnLCAnLW0nLCAncmVuYW1lIG5l
c3RlZCBzdWJkaXJlY3RvcmllcyddKQotCi0gICAgICAgIGNoZGlyKCdzdWIxL3N1YjInKQotICAg
ICAgICBzZWxmLmFzc2VydEVxdWFscyhjYXB0dXJlKCdyb290JylbOi0xXSwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgcGF0aGpvaW4oc2VsZi50ZXN0X2RpciwgJ2JyYW5jaDEnKSkKLSAgICAg
ICAgcnVuYnpyKCdtb3ZlIC4uL2hlbGxvLnR4dCAuJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGV4
aXN0cygnLi9oZWxsby50eHQnKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY2FwdHVyZSgn
cmVscGF0aCBoZWxsby50eHQnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aGpvaW4o
J3N1YjEnLCAnc3ViMicsICdoZWxsby50eHQnKSArICdcbicpCi0gICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWxzKGNhcHR1cmUoJ3JlbHBhdGggLi4vLi4vc3ViMS9zdWIyL2hlbGxvLnR4dCcpLCBwYXRo
am9pbignc3ViMScsICdzdWIyJywgJ2hlbGxvLnR4dFxuJykpCi0gICAgICAgIHJ1bmJ6cihbJ2Nv
bW1pdCcsICctbScsICdtb3ZlIHRvIHBhcmVudCBkaXJlY3RvcnknXSkKLSAgICAgICAgY2hkaXIo
Jy4uJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY2FwdHVyZSgncmVscGF0aCBzdWIyL2hl
bGxvLnR4dCcpLCBwYXRoam9pbignc3ViMScsICdzdWIyJywgJ2hlbGxvLnR4dFxuJykpCi0KLSAg
ICAgICAgcnVuYnpyKCdtb3ZlIHN1YjIvaGVsbG8udHh0IC4nKQotICAgICAgICBzZWxmLmFzc2Vy
dF8oZXhpc3RzKCdoZWxsby50eHQnKSkKLQogICAgICAgICBmID0gZmlsZSgnaGVsbG8udHh0Jywg
J3d0JykKICAgICAgICAgZi53cml0ZSgnc29tZSBuaWNlIG5ldyBjb250ZW50XG4nKQogICAgICAg
ICBmLmNsb3NlKCkKIAorICAgICAgICBydW5ienIoImFkZCBoZWxsby50eHQiKQorICAgICAgICAK
ICAgICAgICAgZiA9IGZpbGUoJ21zZy50bXAnLCAnd3QnKQogICAgICAgICBmLndyaXRlKCd0aGlz
IGlzIG15IG5ldyBjb21taXRcbmFuZCBpdCBoYXMgbXVsdGlwbGUgbGluZXMsIGZvciBmdW4nKQog
ICAgICAgICBmLmNsb3NlKCkKIAogICAgICAgICBydW5ienIoJ2NvbW1pdCAtRiBtc2cudG1wJykK
IAotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjYXB0dXJlKCdyZXZubycpLCAnNVxuJykKLSAg
ICAgICAgcnVuYnpyKCdleHBvcnQgLXIgNSBleHBvcnQtNS50bXAnKQorICAgICAgICBzZWxmLmFz
c2VydEVxdWFscyhjYXB0dXJlKCdyZXZubycpLCAnMVxuJykKKyAgICAgICAgcnVuYnpyKCdleHBv
cnQgLXIgMSBleHBvcnQtMS50bXAnKQogICAgICAgICBydW5ienIoJ2V4cG9ydCBleHBvcnQudG1w
JykKIAogICAgICAgICBydW5ienIoJ2xvZycpCgo=

# revision id: larstiq at larstiq.dyndns.org-20060709201249-91fa66f6001eb965
# sha1: 9940fe981d1b03e3653061744a6274f7fa90c526
# inventory sha1: 762e713b62d6746f262192e8e0f4e037f61019e9
# parent ids:
#   pqm at pqm.ubuntu.com-20060709161745-764d41910ae59c5e
# properties:
#   branch-nick: bzr.mv



More information about the bazaar mailing list