19
19
from bzrlib.bzrdir import BzrDir
20
from bzrlib.conflicts import (DuplicateEntry, DuplicateID, MissingParent,
21
UnversionedParent, ParentLoop)
22
20
from bzrlib.errors import (DuplicateKey, MalformedTransform, NoSuchFile,
23
21
ReusingTransform, CantMoveRoot, NotVersionedError,
24
22
ExistingLimbo, ImmortalLimbo, LockError)
25
23
from bzrlib.osutils import file_kind, has_symlinks, pathjoin
26
24
from bzrlib.merge import Merge3Merger
27
from bzrlib.tests import TestCaseInTempDir, TestSkipped, TestCase
25
from bzrlib.tests import TestCaseInTempDir, TestSkipped
28
26
from bzrlib.transform import (TreeTransform, ROOT_PARENT, FinalPaths,
29
27
resolve_conflicts, cook_conflicts,
30
find_interesting, build_tree, get_backup_name)
28
conflicts_strings, find_interesting, build_tree)
32
30
class TestTreeTransform(TestCaseInTempDir):
190
188
transform3.adjust_path('tip', root_id, tip_id)
191
189
transform3.apply()
193
def test_add_del(self):
194
start, root = self.get_transform()
195
start.new_directory('a', root, 'a')
197
transform, root = self.get_transform()
198
transform.delete_versioned(transform.trans_id_tree_file_id('a'))
199
transform.new_directory('a', root, 'a')
202
191
def test_unversioning(self):
203
192
create_tree, root = self.get_transform()
204
193
parent_id = create_tree.new_directory('parent', root, 'parent-id')
403
392
tt, emerald, oz, old_dorothy, new_dorothy = self.get_conflicted()
404
393
raw_conflicts = resolve_conflicts(tt)
405
394
cooked_conflicts = cook_conflicts(raw_conflicts, tt)
406
duplicate = DuplicateEntry('Moved existing file to', 'dorothy.moved',
407
'dorothy', None, 'dorothy-id')
395
duplicate = ('duplicate', 'Moved existing file to', 'dorothy.moved',
396
None, 'dorothy', 'dorothy-id')
408
397
self.assertEqual(cooked_conflicts[0], duplicate)
409
duplicate_id = DuplicateID('Unversioned existing file',
410
'dorothy.moved', 'dorothy', None,
398
duplicate_id = ('duplicate id', 'Unversioned existing file',
399
'dorothy.moved', None, 'dorothy', 'dorothy-id')
412
400
self.assertEqual(cooked_conflicts[1], duplicate_id)
413
missing_parent = MissingParent('Not deleting', 'oz', 'oz-id')
401
missing_parent = ('missing parent', 'Not deleting', 'oz', 'oz-id')
414
402
self.assertEqual(cooked_conflicts[2], missing_parent)
415
unversioned_parent = UnversionedParent('Versioned directory', 'oz',
403
unversioned_parent = ('unversioned parent',
404
'Versioned directory', 'oz', 'oz-id')
417
405
self.assertEqual(cooked_conflicts[3], unversioned_parent)
418
parent_loop = ParentLoop('Cancelled move', 'oz/emeraldcity',
419
'oz/emeraldcity', 'emerald-id', 'emerald-id')
406
parent_loop = ('parent loop', 'Cancelled move', 'oz/emeraldcity',
407
'emerald-id', 'oz/emeraldcity', 'emerald-id')
420
408
self.assertEqual(cooked_conflicts[4], parent_loop)
421
409
self.assertEqual(len(cooked_conflicts), 5)
426
414
raw_conflicts = resolve_conflicts(tt)
427
415
cooked_conflicts = cook_conflicts(raw_conflicts, tt)
429
conflicts_s = [str(c) for c in cooked_conflicts]
417
conflicts_s = list(conflicts_strings(cooked_conflicts))
430
418
self.assertEqual(len(cooked_conflicts), len(conflicts_s))
431
419
self.assertEqual(conflicts_s[0], 'Conflict adding file dorothy. '
432
420
'Moved existing file to '
702
688
self.assertIs(os.path.isdir('b/foo'), True)
703
689
self.assertEqual(file('b/foo/bar', 'rb').read(), "contents")
704
690
self.assertEqual(os.readlink('b/foo/baz'), 'a/foo/bar')
706
class MockTransform(object):
708
def has_named_child(self, by_parent, parent_id, name):
709
for child_id in by_parent[parent_id]:
713
elif name == "name.~%s~" % child_id:
717
class MockEntry(object):
719
object.__init__(self)
722
class TestGetBackupName(TestCase):
723
def test_get_backup_name(self):
725
name = get_backup_name(MockEntry(), {'a':[]}, 'a', tt)
726
self.assertEqual(name, 'name.~1~')
727
name = get_backup_name(MockEntry(), {'a':['1']}, 'a', tt)
728
self.assertEqual(name, 'name.~2~')
729
name = get_backup_name(MockEntry(), {'a':['2']}, 'a', tt)
730
self.assertEqual(name, 'name.~1~')
731
name = get_backup_name(MockEntry(), {'a':['2'], 'b':[]}, 'b', tt)
732
self.assertEqual(name, 'name.~1~')
733
name = get_backup_name(MockEntry(), {'a':['1', '2', '3']}, 'a', tt)
734
self.assertEqual(name, 'name.~4~')