1# Copyright (C) 2006, 2010 Canonical Ltd 2# 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 2 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program; if not, write to the Free Software 15# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 16 17 18import os 19 20from breezy import ( 21 osutils, 22 tests, 23 workingtree, 24 ) 25 26 27class TestJoin(tests.TestCaseWithTransport): 28 29 def make_trees(self): 30 base_tree = self.make_branch_and_tree('tree', 31 format='development-subtree') 32 base_tree.commit('empty commit') 33 self.build_tree(['tree/subtree/', 'tree/subtree/file1']) 34 sub_tree = self.make_branch_and_tree('tree/subtree') 35 sub_tree.add('file1', b'file1-id') 36 sub_tree.commit('added file1') 37 return base_tree, sub_tree 38 39 def check_success(self, path): 40 base_tree = workingtree.WorkingTree.open(path) 41 self.assertEqual(b'file1-id', base_tree.path2id('subtree/file1')) 42 43 def test_join(self): 44 base_tree, sub_tree = self.make_trees() 45 self.run_bzr('join tree/subtree') 46 self.check_success('tree') 47 48 def test_join_dot(self): 49 base_tree, sub_tree = self.make_trees() 50 self.run_bzr('join .', working_dir='tree/subtree') 51 self.check_success('tree') 52 53 def test_join_error(self): 54 base_tree, sub_tree = self.make_trees() 55 os.mkdir('tree/subtree2') 56 osutils.rename('tree/subtree', 'tree/subtree2/subtree') 57 self.run_bzr_error( 58 ('Cannot join .*subtree. Parent directory is not versioned',), 59 'join tree/subtree2/subtree') 60 # disabled because this gives an ugly error at present -- mbp 20070306 61 # self.run_bzr_error( 62 ## ('Cannot join .*subtree. Parent directory is not versioned',), 63 # 'join', '--reference', 'tree/subtree2/subtree') 64 self.run_bzr_error(('Not a branch:.*subtree2',), 65 'join tree/subtree2') 66 67 def test_join_reference(self): 68 """Join can add a reference if --reference is supplied""" 69 base_tree, sub_tree = self.make_trees() 70 subtree_root_id = sub_tree.path2id('') 71 self.run_bzr('join . --reference', working_dir='tree/subtree') 72 sub_tree.lock_read() 73 self.addCleanup(sub_tree.unlock) 74 if sub_tree.supports_setting_file_ids(): 75 self.assertEqual(b'file1-id', sub_tree.path2id('file1')) 76 self.assertEqual('file1', sub_tree.id2path(b'file1-id')) 77 self.assertEqual(subtree_root_id, sub_tree.path2id('')) 78 self.assertEqual('', sub_tree.id2path(subtree_root_id)) 79 self.assertEqual( 80 sub_tree.path2id('file1'), base_tree.path2id('subtree/file1')) 81 82 base_tree.lock_read() 83 self.addCleanup(base_tree.unlock) 84 self.assertEqual(['subtree'], list(base_tree.iter_references())) 85 if base_tree.supports_setting_file_ids(): 86 self.assertEqual(b'file1-id', sub_tree.path2id('file1')) 87 self.assertEqual('file1', sub_tree.id2path(b'file1-id')) 88 self.assertEqual(subtree_root_id, base_tree.path2id('subtree')) 89 self.assertEqual('subtree', base_tree.id2path(subtree_root_id)) 90 91 def test_references_check_repository_support(self): 92 """Users are stopped from adding a reference that can't be committed.""" 93 # in 0.15 the default format has a dirstate workingtree, that can 94 # support tree references, but the default repository format 95 # cannot. 96 tree = self.make_branch_and_tree('tree', format='dirstate') 97 tree2 = self.make_branch_and_tree('tree/subtree') 98 out, err = self.run_bzr('join --reference tree/subtree', 99 retcode=3) 100 self.assertContainsRe(err, r"Can't join trees") 101 self.assertContainsRe(err, r"use brz upgrade") 102