11
9
WorkingTreeNotRevision, BzrCommandError)
12
10
from bzrlib.inventory import RootEntry
13
11
import bzrlib.inventory as inventory
14
from bzrlib.osutils import file_kind, rename, sha_file
12
from bzrlib.osutils import file_kind, rename, sha_file, pathjoin, mkdtemp
15
13
from bzrlib import changeset
16
14
from bzrlib.merge_core import (ApplyMerge3, make_merge_changeset,
17
15
BackupBeforeChange, ExecFlagMerge, WeaveMerge)
64
62
self.inventory = FalseTree(self)
66
64
def child_path(self, parent, name):
67
return os.path.join(self.inventory_dict[parent], name)
65
return pathjoin(self.inventory_dict[parent], name)
69
67
def add_file(self, id, parent, name, contents, mode):
70
68
path = self.child_path(parent, name)
94
92
self.inventory_dict[id] = path
96
94
def abs_path(self, path):
97
return os.path.join(self.dir, path)
95
return pathjoin(self.dir, path)
99
97
def full_path(self, id):
123
121
return self.full_path(id)
125
123
def change_path(self, id, path):
126
old_path = os.path.join(self.dir, self.inventory_dict[id])
124
old_path = pathjoin(self.dir, self.inventory_dict[id])
127
125
rename(old_path, self.abs_path(path))
128
126
self.inventory_dict[id] = path
143
141
class MergeBuilder(object):
144
142
def __init__(self):
145
self.dir = tempfile.mkdtemp(prefix="BaZing")
146
self.base = MergeTree(os.path.join(self.dir, "base"))
147
self.this = MergeTree(os.path.join(self.dir, "this"))
148
self.other = MergeTree(os.path.join(self.dir, "other"))
143
self.dir = mkdtemp(prefix="BaZing")
144
self.base = MergeTree(pathjoin(self.dir, "base"))
145
self.this = MergeTree(pathjoin(self.dir, "this"))
146
self.other = MergeTree(pathjoin(self.dir, "other"))
150
148
self.cset = changeset.Changeset()
151
149
self.cset.add_entry(changeset.ChangesetEntry("0",
155
153
assert (parent is None)
157
return os.path.join(self.cset.entries[parent].path, name)
155
return pathjoin(self.cset.entries[parent].path, name)
159
157
def add_file(self, id, parent, name, contents, mode):
160
158
self.base.add_file(id, parent, name, contents, mode)
328
326
if parent is None:
329
327
return orig_inventory[file_id]
330
328
dirname = new_path(parent)
331
return os.path.join(dirname, orig_inventory[file_id])
329
return pathjoin(dirname, orig_inventory[file_id])
333
331
new_inventory = {}
334
332
for file_id in orig_inventory.iterkeys():
366
364
builder.add_file("3", "0", "name5", "hello3", 0755)
367
365
builder.change_name("3", this="name6")
368
366
cset = builder.merge_changeset(ApplyMerge3)
369
self.assert_(cset.entries["2"].is_boring())
370
self.assert_(cset.entries["1"].name == "name1")
371
self.assert_(cset.entries["1"].new_name == "name2")
372
self.assert_(cset.entries["3"].is_boring())
367
self.failUnless(cset.entries["2"].is_boring())
368
self.assertEqual(cset.entries["1"].name, "name1")
369
self.assertEqual(cset.entries["1"].new_name, "name2")
370
self.failUnless(cset.entries["3"].is_boring())
373
371
for tree in (builder.this, builder.other, builder.base):
374
self.assert_(tree.dir != builder.dir and
375
tree.dir.startswith(builder.dir))
372
self.assertNotEqual(tree.dir, builder.dir)
373
self.assertStartsWith(tree.dir, builder.dir)
376
374
for path in tree.inventory_dict.itervalues():
377
375
fullpath = tree.abs_path(path)
378
self.assert_(fullpath.startswith(tree.dir))
379
self.assert_(not path.startswith(tree.dir))
380
self.assert_(os.path.exists(fullpath))
376
self.assertStartsWith(fullpath, tree.dir)
377
self.failIf(path.startswith(tree.dir))
378
self.failUnless(os.path.lexists(fullpath))
381
379
builder.apply_changeset(cset)
382
380
builder.cleanup()
383
381
builder = MergeBuilder()
537
535
def test_trivial_star_merge(self):
538
536
"""Test that merges in a star shape Just Work."""
539
from bzrlib.add import smart_add_tree, add_reporter_null
537
from bzrlib.add import smart_add_tree
540
538
from bzrlib.clone import copy_branch
541
539
from bzrlib.merge import merge
542
540
# John starts a branch
543
541
self.build_tree(("original/", "original/file1", "original/file2"))
544
542
branch = Branch.initialize("original")
545
543
tree = WorkingTree('original', branch)
546
smart_add_tree(tree, ["original"], True, add_reporter_null)
544
smart_add_tree(tree, ["original"])
547
545
tree.commit("start branch.", verbose=False)
548
546
# Mary branches it.
549
547
self.build_tree(("mary/",))