# Bazaar revision bundle v0.9 # # message: # Add more tests and fix condiion check in mv based on feedback from James Westby. # committer: Daniel Parks # date: Mon 2007-07-16 12:49:42.269999981 -0700 === modified file NEWS // last-changed:dp+bzr@oxidized.org-20070714090956-101de ... 8o81rpoftg3 --- NEWS +++ NEWS @@ -2,6 +2,9 @@ BUGFIXES: + * ``bzr mv`` can now rename a directory after it has been moved by an + external command. (Daniel Parks, #107967) + * ``bzr rm`` now does not insist on ``--force`` to delete files that have been renamed but not otherwise modified. (Marius Kruger, #111664) === modified file bzrlib/builtins.py --- bzrlib/builtins.py +++ bzrlib/builtins.py @@ -534,7 +534,7 @@ raise errors.BzrCommandError("missing file argument") tree, rel_names = tree_files(names_list) - if os.path.isdir(names_list[-1]): + if self._is_mv_into_dir(names_list, tree, rel_names): # move into existing directory for pair in tree.move(rel_names[:-1], rel_names[-1], after=after): self.outf.write("%s => %s\n" % pair) @@ -547,6 +547,41 @@ self.outf.write("%s => %s\n" % (rel_names[0], rel_names[1])) + def _is_mv_into_dir(self, names_list, tree, rel_names): + """Determines if the user wants to move into a directory. + """ + + if not os.path.isdir(names_list[-1]): + # rename_one + return False + + if len(names_list) > 2 or os.path.lexists(names_list[0]): + # move to directory + return True + + # here we know that we're moving A to B, and A doesn't exist on + # the file system. This must be an after-the-fact move. + + tree.lock_read() + try: + inv = tree.inventory + + if inv.path2id(rel_names[1]) is not None: + # let tree.move decide which error to raise + return True + + if osutils.file_kind(names_list[1]) == \ + inv.get_file_kind(inv.path2id(rel_names[0])): + # matching file types, so this is a rename + return False + finally: + tree.unlock() + + # tried to move a deleted file (or other non-directory) to an + # unversioned subdirectory. let tree.move decide which error to raise + return True + + class cmd_pull(Command): """Turn this branch into a mirror of another branch. === modified file bzrlib/tests/blackbox/test_mv.py --- bzrlib/tests/blackbox/test_mv.py +++ bzrlib/tests/blackbox/test_mv.py @@ -146,6 +146,22 @@ tree = workingtree.WorkingTree.open('.') self.assertEqual('b-id', tree.path2id('b')) + def test_mv_broken_symlink(self): + """Test bzr mv broken_symlink to new_location. + + Tests if a broken symlink is handled correctly by bzr mv. + Setup: ln1 is in the working tree. ln1 points to nonexistant. + User does: bzr mv ln1 ln2 + """ + if not osutils.has_symlinks(): + raise TestSkipped('Symlinks are not supported on this platform') + os.symlink('nonexistant', 'ln1') + tree = self.make_branch_and_tree('.') + tree.add(['ln1']) + + self.run_bzr('mv ln1 ln2') + self.assertMoved('ln1','ln2') + def test_mv_already_moved_file(self): """Test bzr mv original_file to moved_file. @@ -235,6 +251,151 @@ self.assertMoved('a1','sub/a1') self.assertMoved('a2','sub/a2') + def test_mv_already_moved_subdir(self): + """Test bzr mv already_mved_versioned_dir to new_unversioned_dir. + + Tests if a subdirectory which has already been renamed externally + is handled correctly by bzr mv. + Setup: sub1, sub1/a are in the working tree. + User does: mv sub1 sub2; bzr mv sub1 sub2 + """ + self.build_tree(['sub1/', 'sub1/a']) + tree = self.make_branch_and_tree('.') + tree.add(['sub1', 'sub1/a']) + + osutils.rename('sub1', 'sub2') + self.run_bzr('mv sub1 sub2') + self.assertMoved('sub1','sub2') + self.assertMoved('sub1/a','sub2/a') + + def test_mv_unversioned_subdir_to_unversioned_subdir(self): + """Test bzr mv unversioned_subdir to unversioned_subdir2. + + Setup: nothing is in the working tree. sub1 and sub2 exist. + User does: bzr mv sub1 sub2 + """ + self.build_tree(['sub1/', 'sub1/a', 'sub2/', 'sub2/a']) + tree = self.make_branch_and_tree('.') + + self.run_bzr_error( + ["^bzr: ERROR: Could not move to sub2. sub2 is not versioned$"], + 'mv sub1 sub2') + self.failUnlessExists('sub1/a') + self.failUnlessExists('sub2/a') + self.assertNotInWorkingTree('sub1') + self.assertNotInWorkingTree('sub2') + + def test_mv_versioned_subdir_to_unversioned_subdir(self): + """Test bzr mv versioned_subdir to unversioned_subdir2. + + Setup: sub1, sub1/a are in the working tree. sub2, sub2/a exist. + User does: bzr mv sub1 sub2 + """ + self.build_tree(['sub1/', 'sub1/a', 'sub2/', 'sub2/a']) + tree = self.make_branch_and_tree('.') + tree.add(['sub1', 'sub1/a']) + + self.run_bzr_error( + ["^bzr: ERROR: Could not move to sub2. sub2 is not versioned$"], + 'mv sub1 sub2') + self.failUnlessExists('sub1/a') + self.failUnlessExists('sub2/a') + self.assertInWorkingTree('sub1/a') + self.assertNotInWorkingTree('sub2') + + def test_mv_after_versioned_subdir_to_unversioned_subdir(self): + """Test bzr mv versioned_subdir to unversioned_subdir2. + + Setup: sub1, sub1/a are in the working tree. sub2, sub2/a exist. + User does: bzr mv sub1 sub2 + """ + self.build_tree(['sub1/', 'sub1/a', 'sub2/', 'sub2/a']) + tree = self.make_branch_and_tree('.') + tree.add(['sub1', 'sub1/a']) + + self.run_bzr_error( + ["^bzr: ERROR: Could not move to sub2. sub2 is not versioned$"], + 'mv --after sub1 sub2') + self.failUnlessExists('sub1/a') + self.failUnlessExists('sub2/a') + self.assertInWorkingTree('sub1/a') + self.assertNotInWorkingTree('sub2') + + def test_mv_unversioned_subdir_to_versioned_subdir(self): + """Test bzr mv unversioned_subdir to versioned_subdir2. + + Setup: sub2, sub2/a are in the working tree. sub1, sub1/a exist. + User does: bzr mv sub1 sub2 + """ + self.build_tree(['sub1/', 'sub1/a', 'sub2/', 'sub2/a']) + tree = self.make_branch_and_tree('.') + tree.add(['sub2', 'sub2/a']) + + self.run_bzr_error( + ["^bzr: ERROR: Could not move sub1 => sub2: sub1 is not " + "versioned$"], + 'mv sub1 sub2') + self.failUnlessExists('sub1/a') + self.failUnlessExists('sub2/a') + self.assertNotInWorkingTree('sub1') + self.assertInWorkingTree('sub2/a') + + def test_mv_source_kind_changed_to_unversioned_subdir(self): + """Test bzr mv file_in_place_of_versioned_subdir to unversioned_subdir. + + Setup: a/, a/b are in the working tree. + User does: mv a c; touch a; bzr mv --after a c + """ + self.build_tree(['a/', 'a/b']) + tree = self.make_branch_and_tree('.') + tree.add(['a', 'a/b']) + osutils.rename('a', 'c') + self.build_tree(['a']) + + self.run_bzr_error( + ["^bzr: ERROR: Could not move to c: c is not versioned$"], + 'mv --after a c') + self.failUnlessExists('a') + self.failUnlessExists('c/b') + self.assertNotInWorkingTree('c') + self.assertInWorkingTree('a/b') + + def test_mv_already_moved_symlink(self): + """Test bzr mv already_mved_symlink to new_unversioned_symlink. + + Tests if a symlink which has already been renamed externally + is handled correctly by bzr mv. + Setup: ln1 sub is in the working tree. ln1 points to sub. + User does: mv ln1 ln2; bzr mv ln1 ln2 + """ + if not osutils.has_symlinks(): + raise TestSkipped('Symlinks are not supported on this platform') + self.build_tree(['sub/']) + os.symlink('sub', 'ln1') + tree = self.make_branch_and_tree('.') + tree.add(['sub', 'ln1']) + + osutils.rename('ln1', 'ln2') + self.run_bzr('mv ln1 ln2') + self.assertMoved('ln1','ln2') + + def test_mv_already_moved_broken_symlink(self): + """Test bzr mv broken_symlink to new_location. + + Tests if a broken symlink is handled correctly by bzr mv. + Setup: ln1 is in the working tree. ln1 points to nonexistant. + User does: bzr mv ln1 ln2 + """ + if not osutils.has_symlinks(): + raise TestSkipped('Symlinks are not supported on this platform') + os.symlink('nonexistant', 'ln1') + tree = self.make_branch_and_tree('.') + tree.add(['ln1']) + + osutils.rename('ln1', 'ln2') + self.run_bzr('mv ln1 ln2') + self.assertMoved('ln1','ln2') + def test_mv_already_moved_files_into_unversioned_subdir(self): """Test bzr mv original_file to unversioned_directory. === modified directory // last-changed:dp+bzr@oxidized.org-20070716194942-gi5a ... 7mf9ixx0vh10 # revision id: dp+bzr@oxidized.org-20070716194942-gi5a7mf9ixx0vh10 # sha1: 0efcab367b795d5af5f828be7773647cea8e989a # inventory sha1: 8e03782d4da73293ec1bd5099ccce3095c2d3668 # parent ids: # dp+bzr@oxidized.org-20070714091642-j28248a3m2yys9kc # base id: pqm@pqm.ubuntu.com-20070713074627-93zxs9uh528y0fki # properties: # branch-nick: fix-mv # message: # Remove spaces on blank lines. # committer: Daniel Parks # date: Sat 2007-07-14 02:16:42.989000082 -0700 === modified file bzrlib/builtins.py // encoding:base64 LS0tIGJ6cmxpYi9idWlsdGlucy5weQorKysgYnpybGliL2J1aWx0aW5zLnB5CkBAIC01NDYsNDIg KzU0Niw0MiBAQAogICAgICAgICAgICAgdHJlZS5yZW5hbWVfb25lKHJlbF9uYW1lc1swXSwgcmVs X25hbWVzWzFdLCBhZnRlcj1hZnRlcikKICAgICAgICAgICAgIHNlbGYub3V0Zi53cml0ZSgiJXMg PT4gJXNcbiIgJSAocmVsX25hbWVzWzBdLCByZWxfbmFtZXNbMV0pKQogICAgICAgICAgICAgCi0K KyAgICAKICAgICBkZWYgX2lzX212X2ludG9fZGlyKHNlbGYsIG5hbWVzX2xpc3QsIHRyZWUsIHJl bF9uYW1lcyk6CiAgICAgICAgICIiIkRldGVybWluZXMgaWYgdGhlIHVzZXIgd2FudHMgdG8gbW92 ZSBpbnRvIGEgZGlyZWN0b3J5LgogICAgICAgICAiIiIKLSAgICAgICAgCisKICAgICAgICAgaWYg bm90IG9zLnBhdGguaXNkaXIobmFtZXNfbGlzdFstMV0pOgogICAgICAgICAgICAgIyByZW5hbWVf b25lCiAgICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgCisKICAgICAgICAgaWYgbGVu KG5hbWVzX2xpc3QpID4gMiBvciBvcy5wYXRoLmxleGlzdHMobmFtZXNfbGlzdFswXSk6CiAgICAg ICAgICAgICAjIG1vdmUgdG8gZGlyZWN0b3J5CiAgICAgICAgICAgICByZXR1cm4gVHJ1ZQotICAg ICAgICAKKwogICAgICAgICAjIGhlcmUgd2Uga25vdyB0aGF0IHdlJ3JlIG1vdmluZyBBIHRvIEIs IGFuZCBBIGRvZXNuJ3QgZXhpc3Qgb24KICAgICAgICAgIyB0aGUgZmlsZSBzeXN0ZW0uIFRoaXMg bXVzdCBiZSBhbiBhZnRlci10aGUtZmFjdCBtb3ZlLgotICAgICAgICAKKwogICAgICAgICB0cmVl LmxvY2tfcmVhZCgpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGludiA9IHRyZWUuaW52ZW50 b3J5Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgaW52LnBhdGgyaWQocmVsX25hbWVz WzFdKToKICAgICAgICAgICAgICAgICAjIGxldCB0cmVlLm1vdmUgZGVjaWRlIHdoaWNoIGVycm9y IHRvIHJhaXNlCiAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKLSAgICAgICAgICAgIAorCiAg ICAgICAgICAgICBpZiBvc3V0aWxzLmZpbGVfa2luZChuYW1lc19saXN0WzFdKSA9PSBcCiAgICAg ICAgICAgICAgICBpbnYuZ2V0X2ZpbGVfa2luZChpbnYucGF0aDJpZChyZWxfbmFtZXNbMF0pKToK ICAgICAgICAgICAgICAgICAjIG1hdGNoaW5nIGZpbGUgdHlwZXMsIHNvIHRoaXMgaXMgYSByZW5h bWUKICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgZmluYWxseToKICAgICAg ICAgICAgIHRyZWUudW5sb2NrKCkKLSAgICAgICAgCisKICAgICAgICAgIyB0cmllZCB0byBtb3Zl IGEgZGVsZXRlZCBmaWxlIChvciBvdGhlciBub24tZGlyZWN0b3J5KSB0byBhbgogICAgICAgICAj IHVudmVyc2lvbmVkIHN1YmRpcmVjdG9yeS4gbGV0IHRyZWUubW92ZSBkZWNpZGUgd2hpY2ggZXJy b3IgdG8gcmFpc2UKICAgICAgICAgcmV0dXJuIFRydWUKIAotICAgIAorCiBjbGFzcyBjbWRfcHVs bChDb21tYW5kKToKICAgICAiIiJUdXJuIHRoaXMgYnJhbmNoIGludG8gYSBtaXJyb3Igb2YgYW5v dGhlciBicmFuY2guCiAKCg== === modified directory // last-changed:dp+bzr@oxidized.org-20070714091642-j282 ... 48a3m2yys9kc # revision id: dp+bzr@oxidized.org-20070714091642-j28248a3m2yys9kc # sha1: a3b5e6c766c2f2350b826e21eb21cb62223562fc # inventory sha1: 56bdbb73e22e839e63eb6cf5a4eb928e587fcf27 # parent ids: # dp+bzr@oxidized.org-20070714090956-101de8o81rpoftg3 # properties: # branch-nick: fix-mv # message: # Fix bug #107967: mv sub1 sub2; bzr mv sub1 sub2 # # committer: Daniel Parks # date: Sat 2007-07-14 02:09:56.177999973 -0700 === modified file NEWS // encoding:base64 LS0tIE5FV1MKKysrIE5FV1MKQEAgLTIsNiArMiw5IEBACiAKICAgQlVHRklYRVM6CiAKKyAgICAq IGBgYnpyIG12YGAgY2FuIG5vdyByZW5hbWUgYSBkaXJlY3RvcnkgYWZ0ZXIgaXQgaGFzIGJlZW4g bW92ZWQgYnkgYW4KKyAgICAgIGV4dGVybmFsIGNvbW1hbmQuICAoRGFuaWVsIFBhcmtzLCAjMTA3 OTY3KQorCiAgICAgKiBgYGJ6ciBybWBgIG5vdyBkb2VzIG5vdCBpbnNpc3Qgb24gYGAtLWZvcmNl YGAgdG8gZGVsZXRlIGZpbGVzIHRoYXQKICAgICAgIGhhdmUgYmVlbiByZW5hbWVkIGJ1dCBub3Qg b3RoZXJ3aXNlIG1vZGlmaWVkLiAgKE1hcml1cyBLcnVnZXIsCiAgICAgICAjMTExNjY0KQoK === modified file bzrlib/builtins.py // encoding:base64 LS0tIGJ6cmxpYi9idWlsdGlucy5weQorKysgYnpybGliL2J1aWx0aW5zLnB5CkBAIC01MzQsNyAr NTM0LDcgQEAKICAgICAgICAgICAgIHJhaXNlIGVycm9ycy5CenJDb21tYW5kRXJyb3IoIm1pc3Np bmcgZmlsZSBhcmd1bWVudCIpCiAgICAgICAgIHRyZWUsIHJlbF9uYW1lcyA9IHRyZWVfZmlsZXMo bmFtZXNfbGlzdCkKICAgICAgICAgCi0gICAgICAgIGlmIG9zLnBhdGguaXNkaXIobmFtZXNfbGlz dFstMV0pOgorICAgICAgICBpZiBzZWxmLl9pc19tdl9pbnRvX2RpcihuYW1lc19saXN0LCB0cmVl LCByZWxfbmFtZXMpOgogICAgICAgICAgICAgIyBtb3ZlIGludG8gZXhpc3RpbmcgZGlyZWN0b3J5 CiAgICAgICAgICAgICBmb3IgcGFpciBpbiB0cmVlLm1vdmUocmVsX25hbWVzWzotMV0sIHJlbF9u YW1lc1stMV0sIGFmdGVyPWFmdGVyKToKICAgICAgICAgICAgICAgICBzZWxmLm91dGYud3JpdGUo IiVzID0+ICVzXG4iICUgcGFpcikKQEAgLTU0Niw2ICs1NDYsNDEgQEAKICAgICAgICAgICAgIHRy ZWUucmVuYW1lX29uZShyZWxfbmFtZXNbMF0sIHJlbF9uYW1lc1sxXSwgYWZ0ZXI9YWZ0ZXIpCiAg ICAgICAgICAgICBzZWxmLm91dGYud3JpdGUoIiVzID0+ICVzXG4iICUgKHJlbF9uYW1lc1swXSwg cmVsX25hbWVzWzFdKSkKICAgICAgICAgICAgIAorCisgICAgZGVmIF9pc19tdl9pbnRvX2Rpcihz ZWxmLCBuYW1lc19saXN0LCB0cmVlLCByZWxfbmFtZXMpOgorICAgICAgICAiIiJEZXRlcm1pbmVz IGlmIHRoZSB1c2VyIHdhbnRzIHRvIG1vdmUgaW50byBhIGRpcmVjdG9yeS4KKyAgICAgICAgIiIi CisgICAgICAgIAorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihuYW1lc19saXN0Wy0xXSk6 CisgICAgICAgICAgICAjIHJlbmFtZV9vbmUKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAg ICAgICAKKyAgICAgICAgaWYgbGVuKG5hbWVzX2xpc3QpID4gMiBvciBvcy5wYXRoLmxleGlzdHMo bmFtZXNfbGlzdFswXSk6CisgICAgICAgICAgICAjIG1vdmUgdG8gZGlyZWN0b3J5CisgICAgICAg ICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAKKyAgICAgICAgIyBoZXJlIHdlIGtub3cgdGhhdCB3 ZSdyZSBtb3ZpbmcgQSB0byBCLCBhbmQgQSBkb2Vzbid0IGV4aXN0IG9uCisgICAgICAgICMgdGhl IGZpbGUgc3lzdGVtLiBUaGlzIG11c3QgYmUgYW4gYWZ0ZXItdGhlLWZhY3QgbW92ZS4KKyAgICAg ICAgCisgICAgICAgIHRyZWUubG9ja19yZWFkKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAg aW52ID0gdHJlZS5pbnZlbnRvcnkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgaW52LnBh dGgyaWQocmVsX25hbWVzWzFdKToKKyAgICAgICAgICAgICAgICAjIGxldCB0cmVlLm1vdmUgZGVj aWRlIHdoaWNoIGVycm9yIHRvIHJhaXNlCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAg ICAgICAgICAgIAorICAgICAgICAgICAgaWYgb3N1dGlscy5maWxlX2tpbmQobmFtZXNfbGlzdFsx XSkgPT0gXAorICAgICAgICAgICAgICAgaW52LmdldF9maWxlX2tpbmQoaW52LnBhdGgyaWQocmVs X25hbWVzWzBdKSk6CisgICAgICAgICAgICAgICAgIyBtYXRjaGluZyBmaWxlIHR5cGVzLCBzbyB0 aGlzIGlzIGEgcmVuYW1lCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGZp bmFsbHk6CisgICAgICAgICAgICB0cmVlLnVubG9jaygpCisgICAgICAgIAorICAgICAgICAjIHRy aWVkIHRvIG1vdmUgYSBkZWxldGVkIGZpbGUgKG9yIG90aGVyIG5vbi1kaXJlY3RvcnkpIHRvIGFu CisgICAgICAgICMgdW52ZXJzaW9uZWQgc3ViZGlyZWN0b3J5LiBsZXQgdHJlZS5tb3ZlIGRlY2lk ZSB3aGljaCBlcnJvciB0byByYWlzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCiAgICAgCiBjbGFz cyBjbWRfcHVsbChDb21tYW5kKToKICAgICAiIiJUdXJuIHRoaXMgYnJhbmNoIGludG8gYSBtaXJy b3Igb2YgYW5vdGhlciBicmFuY2guCgo= === modified file bzrlib/tests/blackbox/test_mv.py // encoding:base64 LS0tIGJ6cmxpYi90ZXN0cy9ibGFja2JveC90ZXN0X212LnB5CisrKyBienJsaWIvdGVzdHMvYmxh Y2tib3gvdGVzdF9tdi5weQpAQCAtMTQ2LDYgKzE0NiwyMiBAQAogICAgICAgICB0cmVlID0gd29y a2luZ3RyZWUuV29ya2luZ1RyZWUub3BlbignLicpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwo J2ItaWQnLCB0cmVlLnBhdGgyaWQoJ2InKSkKIAorICAgIGRlZiB0ZXN0X212X2Jyb2tlbl9zeW1s aW5rKHNlbGYpOgorICAgICAgICAiIiJUZXN0IGJ6ciBtdiBicm9rZW5fc3ltbGluayB0byBuZXdf bG9jYXRpb24uCisKKyAgICAgICAgVGVzdHMgaWYgYSBicm9rZW4gc3ltbGluayBpcyBoYW5kbGVk IGNvcnJlY3RseSBieSBienIgbXYuCisgICAgICAgIFNldHVwOiBsbjEgaXMgaW4gdGhlIHdvcmtp bmcgdHJlZS4gbG4xIHBvaW50cyB0byBub25leGlzdGFudC4KKyAgICAgICAgVXNlciBkb2VzOiBi enIgbXYgbG4xIGxuMgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IG9zdXRpbHMuaGFzX3N5 bWxpbmtzKCk6CisgICAgICAgICAgICByYWlzZSBUZXN0U2tpcHBlZCgnU3ltbGlua3MgYXJlIG5v dCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybScpCisgICAgICAgIG9zLnN5bWxpbmsoJ25vbmV4 aXN0YW50JywgJ2xuMScpCisgICAgICAgIHRyZWUgPSBzZWxmLm1ha2VfYnJhbmNoX2FuZF90cmVl KCcuJykKKyAgICAgICAgdHJlZS5hZGQoWydsbjEnXSkKKworICAgICAgICBzZWxmLnJ1bl9ienIo J212IGxuMSBsbjInKQorICAgICAgICBzZWxmLmFzc2VydE1vdmVkKCdsbjEnLCdsbjInKQorCiAg ICAgZGVmIHRlc3RfbXZfYWxyZWFkeV9tb3ZlZF9maWxlKHNlbGYpOgogICAgICAgICAiIiJUZXN0 IGJ6ciBtdiBvcmlnaW5hbF9maWxlIHRvIG1vdmVkX2ZpbGUuCiAKQEAgLTIzNSw2ICsyNTEsNTkg QEAKICAgICAgICAgc2VsZi5hc3NlcnRNb3ZlZCgnYTEnLCdzdWIvYTEnKQogICAgICAgICBzZWxm LmFzc2VydE1vdmVkKCdhMicsJ3N1Yi9hMicpCiAKKyAgICBkZWYgdGVzdF9tdl9hbHJlYWR5X21v dmVkX3N1YmRpcihzZWxmKToKKyAgICAgICAgIiIiVGVzdCBienIgbXYgYWxyZWFkeV9tdmVkX3Zl cnNpb25lZF9kaXIgdG8gbmV3X3VudmVyc2lvbmVkX2Rpci4KKworICAgICAgICBUZXN0cyBpZiBh IHN1YmRpcmVjdG9yeSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIHJlbmFtZWQgZXh0ZXJuYWxseQor ICAgICAgICBpcyBoYW5kbGVkIGNvcnJlY3RseSBieSBienIgbXYuCisgICAgICAgIFNldHVwOiBz dWIxIHN1YjEvYSBpcyBpbiB0aGUgd29ya2luZyB0cmVlLgorICAgICAgICBVc2VyIGRvZXM6IG12 IHN1YjEgc3ViMjsgYnpyIG12IHN1YjEgc3ViMgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5i dWlsZF90cmVlKFsnc3ViMS8nLCAnc3ViMS9hJ10pCisgICAgICAgIHRyZWUgPSBzZWxmLm1ha2Vf YnJhbmNoX2FuZF90cmVlKCcuJykKKyAgICAgICAgdHJlZS5hZGQoWydzdWIxJywgJ3N1YjEvYSdd KQorCisgICAgICAgIG9zdXRpbHMucmVuYW1lKCdzdWIxJywgJ3N1YjInKQorICAgICAgICBzZWxm LnJ1bl9ienIoJ212IHN1YjEgc3ViMicpCisgICAgICAgIHNlbGYuYXNzZXJ0TW92ZWQoJ3N1YjEn LCdzdWIyJykKKyAgICAgICAgc2VsZi5hc3NlcnRNb3ZlZCgnc3ViMS9hJywnc3ViMi9hJykKKwor ICAgIGRlZiB0ZXN0X212X2FscmVhZHlfbW92ZWRfc3ltbGluayhzZWxmKToKKyAgICAgICAgIiIi VGVzdCBienIgbXYgYWxyZWFkeV9tdmVkX3N5bWxpbmsgdG8gbmV3X3VudmVyc2lvbmVkX3N5bWxp bmsuCisKKyAgICAgICAgVGVzdHMgaWYgYSBzeW1saW5rIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4g cmVuYW1lZCBleHRlcm5hbGx5CisgICAgICAgIGlzIGhhbmRsZWQgY29ycmVjdGx5IGJ5IGJ6ciBt di4KKyAgICAgICAgU2V0dXA6IGxuMSBzdWIgaXMgaW4gdGhlIHdvcmtpbmcgdHJlZS4gbG4xIHBv aW50cyB0byBzdWIuCisgICAgICAgIFVzZXIgZG9lczogbXYgbG4xIGxuMjsgYnpyIG12IGxuMSBs bjIKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBvc3V0aWxzLmhhc19zeW1saW5rcygpOgor ICAgICAgICAgICAgcmFpc2UgVGVzdFNraXBwZWQoJ1N5bWxpbmtzIGFyZSBub3Qgc3VwcG9ydGVk IG9uIHRoaXMgcGxhdGZvcm0nKQorICAgICAgICBzZWxmLmJ1aWxkX3RyZWUoWydzdWIvJ10pCisg ICAgICAgIG9zLnN5bWxpbmsoJ3N1YicsICdsbjEnKQorICAgICAgICB0cmVlID0gc2VsZi5tYWtl X2JyYW5jaF9hbmRfdHJlZSgnLicpCisgICAgICAgIHRyZWUuYWRkKFsnc3ViJywgJ2xuMSddKQor CisgICAgICAgIG9zdXRpbHMucmVuYW1lKCdsbjEnLCAnbG4yJykKKyAgICAgICAgc2VsZi5ydW5f YnpyKCdtdiBsbjEgbG4yJykKKyAgICAgICAgc2VsZi5hc3NlcnRNb3ZlZCgnbG4xJywnbG4yJykK KworICAgIGRlZiB0ZXN0X212X2FscmVhZHlfbW92ZWRfYnJva2VuX3N5bWxpbmsoc2VsZik6Cisg ICAgICAgICIiIlRlc3QgYnpyIG12IGJyb2tlbl9zeW1saW5rIHRvIG5ld19sb2NhdGlvbi4KKwor ICAgICAgICBUZXN0cyBpZiBhIGJyb2tlbiBzeW1saW5rIGlzIGhhbmRsZWQgY29ycmVjdGx5IGJ5 IGJ6ciBtdi4KKyAgICAgICAgU2V0dXA6IGxuMSBpcyBpbiB0aGUgd29ya2luZyB0cmVlLiBsbjEg cG9pbnRzIHRvIG5vbmV4aXN0YW50LgorICAgICAgICBVc2VyIGRvZXM6IGJ6ciBtdiBsbjEgbG4y CisgICAgICAgICIiIgorICAgICAgICBpZiBub3Qgb3N1dGlscy5oYXNfc3ltbGlua3MoKToKKyAg ICAgICAgICAgIHJhaXNlIFRlc3RTa2lwcGVkKCdTeW1saW5rcyBhcmUgbm90IHN1cHBvcnRlZCBv biB0aGlzIHBsYXRmb3JtJykKKyAgICAgICAgb3Muc3ltbGluaygnbm9uZXhpc3RhbnQnLCAnbG4x JykKKyAgICAgICAgdHJlZSA9IHNlbGYubWFrZV9icmFuY2hfYW5kX3RyZWUoJy4nKQorICAgICAg ICB0cmVlLmFkZChbJ2xuMSddKQorCisgICAgICAgIG9zdXRpbHMucmVuYW1lKCdsbjEnLCAnbG4y JykKKyAgICAgICAgc2VsZi5ydW5fYnpyKCdtdiBsbjEgbG4yJykKKyAgICAgICAgc2VsZi5hc3Nl cnRNb3ZlZCgnbG4xJywnbG4yJykKKwogICAgIGRlZiB0ZXN0X212X2FscmVhZHlfbW92ZWRfZmls ZXNfaW50b191bnZlcnNpb25lZF9zdWJkaXIoc2VsZik6CiAgICAgICAgICIiIlRlc3QgYnpyIG12 IG9yaWdpbmFsX2ZpbGUgdG8gdW52ZXJzaW9uZWRfZGlyZWN0b3J5LgogCgo= === modified directory // last-changed:dp+bzr@oxidized.org-20070714090956-101d ... e8o81rpoftg3 # revision id: dp+bzr@oxidized.org-20070714090956-101de8o81rpoftg3 # sha1: 4a7f772e925cdf526ab5ac370e3d894d01a1f418 # inventory sha1: aeb9f7d9c03a86c172c781d6b9626e83642f7e79 # parent ids: # pqm@pqm.ubuntu.com-20070713074627-93zxs9uh528y0fki # properties: # branch-nick: fix-mv