43
42
# u'\xe5' == a with circle
44
43
# '\xc3\xae' == u'\xee' == i with hat
45
44
# So these are u'path' and 'id' only with a circle and a hat. (shappo?)
46
example_conflicts = conflicts.ConflictList(
47
[conflicts.MissingParent('Not deleting', u'p\xe5thg', b'\xc3\xaedg'),
48
conflicts.ContentsConflict(u'p\xe5tha', None, b'\xc3\xaeda'),
49
conflicts.TextConflict(u'p\xe5tha'),
50
conflicts.PathConflict(u'p\xe5thb', u'p\xe5thc', b'\xc3\xaedb'),
51
conflicts.DuplicateID('Unversioned existing file',
52
u'p\xe5thc', u'p\xe5thc2',
53
b'\xc3\xaedc', b'\xc3\xaedc'),
54
conflicts.DuplicateEntry('Moved existing file to',
55
u'p\xe5thdd.moved', u'p\xe5thd',
57
conflicts.ParentLoop('Cancelled move', u'p\xe5the', u'p\xe5th2e',
58
None, b'\xc3\xaed2e'),
59
conflicts.UnversionedParent('Versioned directory',
60
u'p\xe5thf', b'\xc3\xaedf'),
61
conflicts.NonDirectoryParent('Created directory',
62
u'p\xe5thg', b'\xc3\xaedg'),
46
bzr_conflicts.MissingParent('Not deleting', u'p\xe5thg', b'\xc3\xaedg'),
47
bzr_conflicts.ContentsConflict(u'p\xe5tha', None, b'\xc3\xaeda'),
48
bzr_conflicts.TextConflict(u'p\xe5tha'),
49
bzr_conflicts.PathConflict(u'p\xe5thb', u'p\xe5thc', b'\xc3\xaedb'),
50
bzr_conflicts.DuplicateID('Unversioned existing file',
51
u'p\xe5thc', u'p\xe5thc2',
52
b'\xc3\xaedc', b'\xc3\xaedc'),
53
bzr_conflicts.DuplicateEntry('Moved existing file to',
54
u'p\xe5thdd.moved', u'p\xe5thd',
56
bzr_conflicts.ParentLoop('Cancelled move', u'p\xe5the', u'p\xe5th2e',
57
None, b'\xc3\xaed2e'),
58
bzr_conflicts.UnversionedParent('Versioned directory',
59
u'p\xe5thf', b'\xc3\xaedf'),
60
bzr_conflicts.NonDirectoryParent('Created directory',
61
u'p\xe5thg', b'\xc3\xaedg'),
66
65
def vary_by_conflicts():
90
89
(not_selected, selected),
91
90
tree_conflicts.select_conflicts(tree, paths, **kwargs))
93
foo = conflicts.ContentsConflict('foo')
94
bar = conflicts.ContentsConflict('bar')
92
foo = bzr_conflicts.ContentsConflict('foo')
93
bar = bzr_conflicts.ContentsConflict('bar')
95
94
tree_conflicts = clist([foo, bar])
97
96
check_select(clist([bar]), clist([foo]), ['foo'])
98
97
check_select(clist(), tree_conflicts,
99
98
[''], ignore_misses=True, recurse=True)
101
foobaz = conflicts.ContentsConflict('foo/baz')
100
foobaz = bzr_conflicts.ContentsConflict('foo/baz')
102
101
tree_conflicts = clist([foobaz, bar])
104
103
check_select(clist([bar]), clist([foobaz]),
105
104
['foo'], ignore_misses=True, recurse=True)
107
qux = conflicts.PathConflict('qux', 'foo/baz')
106
qux = bzr_conflicts.PathConflict('qux', 'foo/baz')
108
107
tree_conflicts = clist([qux])
110
check_select(clist(), tree_conflicts,
109
check_select(tree_conflicts, clist(),
111
110
['foo'], ignore_misses=True, recurse=True)
112
111
check_select(tree_conflicts, clist(), ['foo'], ignore_misses=True)
116
115
self.build_tree(['dir/', 'dir/hello'])
117
116
tree.add(['dir', 'dir/hello'])
119
dirhello = conflicts.ConflictList(
120
[conflicts.TextConflict('dir/hello')])
118
dirhello = [bzr_conflicts.TextConflict('dir/hello')]
121
119
tree.set_conflicts(dirhello)
123
121
conflicts.resolve(tree, ['dir'], recursive=False, ignore_misses=True)
132
130
scenarios = scenarios.multiply_scenarios(vary_by_conflicts())
134
132
def test_stringification(self):
135
text = text_type(self.conflict)
133
text = str(self.conflict)
136
134
self.assertContainsString(text, self.conflict.path)
137
135
self.assertContainsString(text.lower(), "conflict")
138
136
self.assertContainsString(repr(self.conflict),
139
137
self.conflict.__class__.__name__)
141
def test_stanza_roundtrip(self):
143
o = conflicts.Conflict.factory(**p.as_stanza().as_dict())
144
self.assertEqual(o, p)
146
self.assertIsInstance(o.path, text_type)
148
if o.file_id is not None:
149
self.assertIsInstance(o.file_id, bytes)
151
conflict_path = getattr(o, 'conflict_path', None)
152
if conflict_path is not None:
153
self.assertIsInstance(conflict_path, text_type)
155
conflict_file_id = getattr(o, 'conflict_file_id', None)
156
if conflict_file_id is not None:
157
self.assertIsInstance(conflict_file_id, bytes)
159
def test_stanzification(self):
160
stanza = self.conflict.as_stanza()
161
if 'file_id' in stanza:
162
# In Stanza form, the file_id has to be unicode.
163
self.assertStartsWith(stanza['file_id'], u'\xeed')
164
self.assertStartsWith(stanza['path'], u'p\xe5th')
165
if 'conflict_path' in stanza:
166
self.assertStartsWith(stanza['conflict_path'], u'p\xe5th')
167
if 'conflict_file_id' in stanza:
168
self.assertStartsWith(stanza['conflict_file_id'], u'\xeed')
171
140
class TestConflictList(tests.TestCase):
173
142
def test_stanzas_roundtrip(self):
174
stanzas_iter = example_conflicts.to_stanzas()
175
processed = conflicts.ConflictList.from_stanzas(stanzas_iter)
143
stanzas_iter = bzr_conflicts.ConflictList(example_conflicts).to_stanzas()
144
processed = bzr_conflicts.ConflictList.from_stanzas(stanzas_iter)
176
145
self.assertEqual(example_conflicts, processed)
178
147
def test_stringification(self):
179
for text, o in zip(example_conflicts.to_strings(), example_conflicts):
149
bzr_conflicts.ConflictList(example_conflicts).to_strings(),
180
151
self.assertEqual(text, text_type(o))
675
646
# We create a conflict object as it was created before the fix and
676
647
# inject it into the working tree, the test will exercise the
677
648
# compatibility code.
678
old_c = conflicts.PathConflict('<deleted>', self._item_path,
649
old_c = bzr_conflicts.PathConflict('<deleted>', self._item_path,
680
wt.set_conflicts(conflicts.ConflictList([old_c]))
651
wt.set_conflicts([old_c])
683
654
class TestResolveDuplicateEntry(TestParametrizedResolveConflicts):
685
_conflict_type = conflicts.DuplicateEntry
656
_conflict_type = bzr_conflicts.DuplicateEntry
687
658
scenarios = mirror_scenarios(