def test_list_files(self): tree = self.make_branch_and_tree('.') self.build_tree(['dir/', 'file']) if has_symlinks(): os.symlink('target', 'symlink') tree.lock_read() files = list(tree.list_files()) tree.unlock() self.assertEqual(files[0], ('dir', '?', 'directory', None, TreeDirectory())) self.assertEqual(files[1], ('file', '?', 'file', None, TreeFile())) if has_symlinks(): self.assertEqual(files[2], ('symlink', '?', 'symlink', None, TreeLink()))
def test_detect_real_kind(self): # working trees report the real kind of the file on disk, not the kind # they had when they were first added # create one file of every interesting type tree = self.make_branch_and_tree('.') self.build_tree(['file', 'directory/']) names = ['file', 'directory'] if has_symlinks(): os.symlink('target', 'symlink') names.append('symlink') tree.add(names, [n + '-id' for n in names]) if tree.supports_tree_reference(): sub_tree = self.make_branch_and_tree('tree-reference') sub_tree.set_root_id('tree-reference-id') sub_tree.commit('message') names.append('tree-reference') tree.add_reference(sub_tree) # now when we first look, we should see everything with the same kind # with which they were initially added for n in names: actual_kind = tree.kind(n + '-id') self.assertEqual(n, actual_kind) # move them around so the names no longer correspond to the types os.rename(names[0], 'tmp') for i in range(1, len(names)): os.rename(names[i], names[i-1]) os.rename('tmp', names[-1]) # now look and expect to see the correct types again for i in range(len(names)): actual_kind = tree.kind(names[i-1] + '-id') expected_kind = names[i] self.assertEqual(expected_kind, actual_kind)
def test_detect_real_kind(self): # working trees report the real kind of the file on disk, not the kind # they had when they were first added # create one file of every interesting type tree = self.make_branch_and_tree('.') self.build_tree(['file', 'directory/']) names = ['file', 'directory'] if has_symlinks(): os.symlink('target', 'symlink') names.append('symlink') tree.add(names, [n + '-id' for n in names]) if tree.supports_tree_reference(): sub_tree = self.make_branch_and_tree('tree-reference') sub_tree.set_root_id('tree-reference-id') sub_tree.commit('message') names.append('tree-reference') tree.add_reference(sub_tree) # now when we first look, we should see everything with the same kind # with which they were initially added for n in names: actual_kind = tree.kind(n + '-id') self.assertEqual(n, actual_kind) # move them around so the names no longer correspond to the types os.rename(names[0], 'tmp') for i in range(1, len(names)): os.rename(names[i], names[i - 1]) os.rename('tmp', names[-1]) # now look and expect to see the correct types again for i in range(len(names)): actual_kind = tree.kind(names[i - 1] + '-id') expected_kind = names[i] self.assertEqual(expected_kind, actual_kind)
def test_walkdir_subtree(self): tree = self.get_tree_with_subdirs_and_all_supported_content_types(has_symlinks()) # test that its iterable by iterating result = [] tree.lock_read() expected_dirblocks = self.get_all_subdirs_expected(tree, has_symlinks())[1:] for dirinfo, block in tree.walkdirs('1top-dir'): newblock = [] for row in block: if row[4] is not None: newblock.append(row[0:3] + (None,) + row[4:]) else: newblock.append(row) result.append((dirinfo, newblock)) tree.unlock() # check each return value for debugging ease. for pos, item in enumerate(expected_dirblocks): self.assertEqual(item, result[pos]) self.assertEqual(len(expected_dirblocks), len(result))
def test_walkdir_subtree(self): tree = self.get_tree_with_subdirs_and_all_supported_content_types( has_symlinks()) # test that its iterable by iterating result = [] tree.lock_read() expected_dirblocks = self.get_all_subdirs_expected( tree, has_symlinks())[1:] for dirinfo, block in tree.walkdirs('1top-dir'): newblock = [] for row in block: if row[4] is not None: newblock.append(row[0:3] + (None, ) + row[4:]) else: newblock.append(row) result.append((dirinfo, newblock)) tree.unlock() # check each return value for debugging ease. for pos, item in enumerate(expected_dirblocks): self.assertEqual(item, result[pos]) self.assertEqual(len(expected_dirblocks), len(result))
def test_revert(self): self.run_bzr('init') with file('hello', 'wt') as f: f.write('foo') self.run_bzr('add hello') self.run_bzr('commit -m setup hello') with file('goodbye', 'wt') as f: f.write('baz') self.run_bzr('add goodbye') self.run_bzr('commit -m setup goodbye') with file('hello', 'wt') as f: f.write('bar') with file('goodbye', 'wt') as f: f.write('qux') self.run_bzr('revert hello') self.check_file_contents('hello', 'foo') self.check_file_contents('goodbye', 'qux') self.run_bzr('revert') self.check_file_contents('goodbye', 'baz') os.mkdir('revertdir') self.run_bzr('add revertdir') self.run_bzr('commit -m f') os.rmdir('revertdir') self.run_bzr('revert') if osutils.has_symlinks(): os.symlink('/unlikely/to/exist', 'symlink') self.run_bzr('add symlink') self.run_bzr('commit -m f') os.unlink('symlink') self.run_bzr('revert') self.assertPathExists('symlink') os.unlink('symlink') os.symlink('a-different-path', 'symlink') self.run_bzr('revert') self.assertEqual('/unlikely/to/exist', os.readlink('symlink')) else: self.log("skipping revert symlink tests") with file('hello', 'wt') as f: f.write('xyz') self.run_bzr('commit -m xyz hello') self.run_bzr('revert -r 1 hello') self.check_file_contents('hello', 'foo') self.run_bzr('revert hello') self.check_file_contents('hello', 'xyz') os.chdir('revertdir') self.run_bzr('revert') os.chdir('..')
def test_symlinks(self): if has_symlinks() is False: return os.mkdir('branch') ControlDir.create_standalone_workingtree('branch') os.symlink(os.path.realpath('no-die-please'), 'branch/die-please') os.mkdir('no-die-please') self.assertPathExists('branch/die-please') os.mkdir('no-die-please/child') clean_tree('branch', unknown=True, no_prompt=True) self.assertPathExists('no-die-please') self.assertPathExists('no-die-please/child')
def test_bzr(self): from os import chdir, mkdir from os.path import exists progress = self.log progress("basic branch creation") mkdir('branch1') chdir('branch1') self.run_bzr('init') self.assertIsSameRealPath(self.run_bzr('root')[0].rstrip(), osutils.pathjoin(self.test_dir, 'branch1')) progress("status of new file") f = file('test.txt', 'wt') f.write('hello world!\n') f.close() self.assertEquals(self.run_bzr('unknowns')[0], 'test.txt\n') out = self.run_bzr("status")[0] self.assertEquals(out, 'unknown:\n test.txt\n') f = file('test2.txt', 'wt') f.write('goodbye cruel world...\n') f.close() out = self.run_bzr("status test.txt")[0] self.assertEquals(out, "unknown:\n test.txt\n") out = self.run_bzr("status")[0] self.assertEquals(out, ("unknown:\n" " test.txt\n" " test2.txt\n")) os.unlink('test2.txt') progress("command aliases") out = self.run_bzr("st")[0] self.assertEquals(out, ("unknown:\n" " test.txt\n")) out = self.run_bzr("stat")[0] self.assertEquals(out, ("unknown:\n" " test.txt\n")) progress("command help") self.run_bzr("help st") self.run_bzr("help") self.run_bzr("help commands") self.run_bzr("help slartibartfast", retcode=3) out = self.run_bzr("help ci")[0] out.index('Aliases: ci, checkin\n') f = file('hello.txt', 'wt') f.write('some nice new content\n') f.close() self.run_bzr("add hello.txt") f = file('msg.tmp', 'wt') f.write('this is my new commit\nand it has multiple lines, for fun') f.close() self.run_bzr('commit -F msg.tmp') self.assertEquals(self.run_bzr('revno')[0], '1\n') self.run_bzr('export -r 1 export-1.tmp') self.run_bzr('export export.tmp') self.run_bzr('log') self.run_bzr('log -v') self.run_bzr('log -v --forward') self.run_bzr('log -m', retcode=3) log_out = self.run_bzr('log -m commit')[0] self.assert_("this is my new commit\n and" in log_out) self.assert_("rename nested" not in log_out) self.assert_('revision-id' not in log_out) self.assert_('revision-id' in self.run_bzr('log --show-ids -m commit')[0]) log_out = self.run_bzr('log --line')[0] # determine the widest line we want max_width = osutils.terminal_width() if max_width is not None: for line in log_out.splitlines(): self.assert_(len(line) <= max_width - 1, len(line)) self.assert_("this is my new commit and" not in log_out) self.assert_("this is my new commit" in log_out) progress("file with spaces in name") mkdir('sub directory') with file('sub directory/file with spaces ', 'wt') as f: f.write('see how this works\n') self.run_bzr('add .') self.run_bzr('diff', retcode=1) self.run_bzr('commit -m add-spaces') self.run_bzr('check') self.run_bzr('log') self.run_bzr('log --forward') self.run_bzr('info') if osutils.has_symlinks(): progress("symlinks") mkdir('symlinks') chdir('symlinks') self.run_bzr('init') os.symlink("NOWHERE1", "link1") self.run_bzr('add link1') self.assertEquals(self.run_bzr('unknowns')[0], '') self.run_bzr(['commit', '-m', '1: added symlink link1']) mkdir('d1') self.run_bzr('add d1') self.assertEquals(self.run_bzr('unknowns')[0], '') os.symlink("NOWHERE2", "d1/link2") self.assertEquals(self.run_bzr('unknowns')[0], 'd1/link2\n') # is d1/link2 found when adding d1 self.run_bzr('add d1') self.assertEquals(self.run_bzr('unknowns')[0], '') os.symlink("NOWHERE3", "d1/link3") self.assertEquals(self.run_bzr('unknowns')[0], 'd1/link3\n') self.run_bzr(['commit', '-m', '2: added dir, symlink']) self.run_bzr('rename d1 d2') self.run_bzr('move d2/link2 .') self.run_bzr('move link1 d2') self.assertEquals(os.readlink("./link2"), "NOWHERE2") self.assertEquals(os.readlink("d2/link1"), "NOWHERE1") self.run_bzr('add d2/link3') self.run_bzr('diff', retcode=1) self.run_bzr(['commit', '-m', '3: rename of dir, move symlinks, add link3']) os.unlink("link2") os.symlink("TARGET 2", "link2") os.unlink("d2/link1") os.symlink("TARGET 1", "d2/link1") self.run_bzr('diff', retcode=1) self.assertEquals(self.run_bzr("relpath d2/link1")[0], "d2/link1\n") self.run_bzr(['commit', '-m', '4: retarget of two links']) self.run_bzr('remove --keep d2/link1') self.assertEquals(self.run_bzr('unknowns')[0], 'd2/link1\n') self.run_bzr(['commit', '-m', '5: remove d2/link1']) # try with the rm alias self.run_bzr('add d2/link1') self.run_bzr(['commit', '-m', '6: add d2/link1']) self.run_bzr('rm --keep d2/link1') self.assertEquals(self.run_bzr('unknowns')[0], 'd2/link1\n') self.run_bzr(['commit', '-m', '7: remove d2/link1']) os.mkdir("d1") self.run_bzr('add d1') self.run_bzr('rename d2/link3 d1/link3new') self.assertEquals(self.run_bzr('unknowns')[0], 'd2/link1\n') self.run_bzr(['commit', '-m', '8: remove d2/link1, move/rename link3']) self.run_bzr('check') self.run_bzr('export -r 1 exp1.tmp') chdir("exp1.tmp") self.assertEquals(listdir_sorted("."), [ "link1" ]) self.assertEquals(os.readlink("link1"), "NOWHERE1") chdir("..") self.run_bzr('export -r 2 exp2.tmp') chdir("exp2.tmp") self.assertEquals(listdir_sorted("."), [ "d1", "link1" ]) chdir("..") self.run_bzr('export -r 3 exp3.tmp') chdir("exp3.tmp") self.assertEquals(listdir_sorted("."), [ "d2", "link2" ]) self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ]) self.assertEquals(os.readlink("d2/link1"), "NOWHERE1") self.assertEquals(os.readlink("link2") , "NOWHERE2") chdir("..") self.run_bzr('export -r 4 exp4.tmp') chdir("exp4.tmp") self.assertEquals(listdir_sorted("."), [ "d2", "link2" ]) self.assertEquals(os.readlink("d2/link1"), "TARGET 1") self.assertEquals(os.readlink("link2") , "TARGET 2") self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ]) chdir("..") self.run_bzr('export -r 5 exp5.tmp') chdir("exp5.tmp") self.assertEquals(listdir_sorted("."), [ "d2", "link2" ]) self.assert_(os.path.islink("link2")) self.assert_(listdir_sorted("d2")== [ "link3" ]) chdir("..") self.run_bzr('export -r 8 exp6.tmp') chdir("exp6.tmp") self.assertEqual(listdir_sorted("."), [ "d1", "d2", "link2"]) self.assertEquals(listdir_sorted("d1"), [ "link3new" ]) self.assertEquals(listdir_sorted("d2"), []) self.assertEquals(os.readlink("d1/link3new"), "NOWHERE3") chdir("..") else: progress("skipping symlink tests")
def _probe(self): return osutils.has_symlinks()
def test_bzr(self): from os import chdir, mkdir from os.path import exists progress = self.log progress("basic branch creation") mkdir('branch1') chdir('branch1') self.run_bzr('init') self.assertIsSameRealPath( self.run_bzr('root')[0].rstrip(), osutils.pathjoin(self.test_dir, 'branch1')) progress("status of new file") f = file('test.txt', 'wt') f.write('hello world!\n') f.close() self.assertEqual(self.run_bzr('unknowns')[0], 'test.txt\n') out = self.run_bzr("status")[0] self.assertEqual(out, 'unknown:\n test.txt\n') f = file('test2.txt', 'wt') f.write('goodbye cruel world...\n') f.close() out = self.run_bzr("status test.txt")[0] self.assertEqual(out, "unknown:\n test.txt\n") out = self.run_bzr("status")[0] self.assertEqual(out, ("unknown:\n" " test.txt\n" " test2.txt\n")) os.unlink('test2.txt') progress("command aliases") out = self.run_bzr("st")[0] self.assertEqual(out, ("unknown:\n" " test.txt\n")) out = self.run_bzr("stat")[0] self.assertEqual(out, ("unknown:\n" " test.txt\n")) progress("command help") self.run_bzr("help st") self.run_bzr("help") self.run_bzr("help commands") self.run_bzr("help slartibartfast", retcode=3) out = self.run_bzr("help ci")[0] out.index('Aliases: ci, checkin\n') f = file('hello.txt', 'wt') f.write('some nice new content\n') f.close() self.run_bzr("add hello.txt") f = file('msg.tmp', 'wt') f.write('this is my new commit\nand it has multiple lines, for fun') f.close() self.run_bzr('commit -F msg.tmp') self.assertEqual(self.run_bzr('revno')[0], '1\n') self.run_bzr('export -r 1 export-1.tmp') self.run_bzr('export export.tmp') self.run_bzr('log') self.run_bzr('log -v') self.run_bzr('log -v --forward') self.run_bzr('log -m', retcode=3) log_out = self.run_bzr('log -m commit')[0] self.assertTrue("this is my new commit\n and" in log_out) self.assertTrue("rename nested" not in log_out) self.assertTrue('revision-id' not in log_out) self.assertTrue( 'revision-id' in self.run_bzr('log --show-ids -m commit')[0]) log_out = self.run_bzr('log --line')[0] # determine the widest line we want max_width = osutils.terminal_width() if max_width is not None: for line in log_out.splitlines(): self.assertTrue(len(line) <= max_width - 1, len(line)) self.assertTrue("this is my new commit and" not in log_out) self.assertTrue("this is my new commit" in log_out) progress("file with spaces in name") mkdir('sub directory') with file('sub directory/file with spaces ', 'wt') as f: f.write('see how this works\n') self.run_bzr('add .') self.run_bzr('diff', retcode=1) self.run_bzr('commit -m add-spaces') self.run_bzr('check') self.run_bzr('log') self.run_bzr('log --forward') self.run_bzr('info') if osutils.has_symlinks(): progress("symlinks") mkdir('symlinks') chdir('symlinks') self.run_bzr('init') os.symlink("NOWHERE1", "link1") self.run_bzr('add link1') self.assertEqual(self.run_bzr('unknowns')[0], '') self.run_bzr(['commit', '-m', '1: added symlink link1']) mkdir('d1') self.run_bzr('add d1') self.assertEqual(self.run_bzr('unknowns')[0], '') os.symlink("NOWHERE2", "d1/link2") self.assertEqual(self.run_bzr('unknowns')[0], 'd1/link2\n') # is d1/link2 found when adding d1 self.run_bzr('add d1') self.assertEqual(self.run_bzr('unknowns')[0], '') os.symlink("NOWHERE3", "d1/link3") self.assertEqual(self.run_bzr('unknowns')[0], 'd1/link3\n') self.run_bzr(['commit', '-m', '2: added dir, symlink']) self.run_bzr('rename d1 d2') self.run_bzr('move d2/link2 .') self.run_bzr('move link1 d2') self.assertEqual(os.readlink("./link2"), "NOWHERE2") self.assertEqual(os.readlink("d2/link1"), "NOWHERE1") self.run_bzr('add d2/link3') self.run_bzr('diff', retcode=1) self.run_bzr( ['commit', '-m', '3: rename of dir, move symlinks, add link3']) os.unlink("link2") os.symlink("TARGET 2", "link2") os.unlink("d2/link1") os.symlink("TARGET 1", "d2/link1") self.run_bzr('diff', retcode=1) self.assertEqual(self.run_bzr("relpath d2/link1")[0], "d2/link1\n") self.run_bzr(['commit', '-m', '4: retarget of two links']) self.run_bzr('remove --keep d2/link1') self.assertEqual(self.run_bzr('unknowns')[0], 'd2/link1\n') self.run_bzr(['commit', '-m', '5: remove d2/link1']) # try with the rm alias self.run_bzr('add d2/link1') self.run_bzr(['commit', '-m', '6: add d2/link1']) self.run_bzr('rm --keep d2/link1') self.assertEqual(self.run_bzr('unknowns')[0], 'd2/link1\n') self.run_bzr(['commit', '-m', '7: remove d2/link1']) os.mkdir("d1") self.run_bzr('add d1') self.run_bzr('rename d2/link3 d1/link3new') self.assertEqual(self.run_bzr('unknowns')[0], 'd2/link1\n') self.run_bzr( ['commit', '-m', '8: remove d2/link1, move/rename link3']) self.run_bzr('check') self.run_bzr('export -r 1 exp1.tmp') chdir("exp1.tmp") self.assertEqual(listdir_sorted("."), ["link1"]) self.assertEqual(os.readlink("link1"), "NOWHERE1") chdir("..") self.run_bzr('export -r 2 exp2.tmp') chdir("exp2.tmp") self.assertEqual(listdir_sorted("."), ["d1", "link1"]) chdir("..") self.run_bzr('export -r 3 exp3.tmp') chdir("exp3.tmp") self.assertEqual(listdir_sorted("."), ["d2", "link2"]) self.assertEqual(listdir_sorted("d2"), ["link1", "link3"]) self.assertEqual(os.readlink("d2/link1"), "NOWHERE1") self.assertEqual(os.readlink("link2"), "NOWHERE2") chdir("..") self.run_bzr('export -r 4 exp4.tmp') chdir("exp4.tmp") self.assertEqual(listdir_sorted("."), ["d2", "link2"]) self.assertEqual(os.readlink("d2/link1"), "TARGET 1") self.assertEqual(os.readlink("link2"), "TARGET 2") self.assertEqual(listdir_sorted("d2"), ["link1", "link3"]) chdir("..") self.run_bzr('export -r 5 exp5.tmp') chdir("exp5.tmp") self.assertEqual(listdir_sorted("."), ["d2", "link2"]) self.assertTrue(os.path.islink("link2")) self.assertTrue(listdir_sorted("d2") == ["link3"]) chdir("..") self.run_bzr('export -r 8 exp6.tmp') chdir("exp6.tmp") self.assertEqual(listdir_sorted("."), ["d1", "d2", "link2"]) self.assertEqual(listdir_sorted("d1"), ["link3new"]) self.assertEqual(listdir_sorted("d2"), []) self.assertEqual(os.readlink("d1/link3new"), "NOWHERE3") chdir("..") else: progress("skipping symlink tests")
self._translate_error(e, path) if osutils.host_os_dereferences_symlinks(): def readlink(self, relpath): """See Transport.readlink.""" return osutils.readlink(self._abspath(relpath)) if osutils.hardlinks_good(): def hardlink(self, source, link_name): """See Transport.link.""" try: os.link(self._abspath(source), self._abspath(link_name)) except (IOError, OSError), e: self._translate_error(e, source) if osutils.has_symlinks(): def symlink(self, source, link_name): """See Transport.symlink.""" abs_link_dirpath = urlutils.dirname(self.abspath(link_name)) source_rel = urlutils.file_relpath( urlutils.strip_trailing_slash(abs_link_dirpath), urlutils.strip_trailing_slash(self.abspath(source)) ) try: os.symlink(source_rel, self._abspath(link_name)) except (IOError, OSError), e: self._translate_error(e, source_rel) def _can_roundtrip_unix_modebits(self): if sys.platform == 'win32':