~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/merge.py

Merge from mpool.

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
                           NoCommits,
34
34
                           WorkingTreeNotRevision,
35
35
                           NotBranchError,
36
 
                           NotVersionedError)
 
36
                           NotVersionedError,
 
37
                           BzrError)
37
38
from bzrlib.delta import compare_trees
38
39
from bzrlib.trace import mutter, warning, note
39
40
from bzrlib.fetch import greedy_fetch, fetch
148
149
        Handle weave conflicts by producing a .THIS, and .OTHER.  The
149
150
        main file will be a version with diff3-style conflicts.
150
151
        """
151
 
        self.add_suffix(filename, ".THIS")
 
152
        self.add_suffix(filename, ".THIS", fix_inventory=False)
152
153
        out_file.commit()
153
154
        self.dump(weave.get_iter(other_i), filename+".OTHER")
154
155
        self.conflict("Text conflict encountered in %s" % filename)
273
274
    transform_tree(this_branch.working_tree(), this_branch.basis_tree())
274
275
 
275
276
 
276
 
def transform_tree(from_tree, to_tree):
277
 
    merge_inner(from_tree.branch, to_tree, from_tree, ignore_zero=True)
 
277
def transform_tree(from_tree, to_tree, interesting_ids=None):
 
278
    merge_inner(from_tree.branch, to_tree, from_tree, ignore_zero=True,
 
279
                interesting_ids=interesting_ids)
278
280
 
279
281
 
280
282
def merge(other_revision, base_revision,
322
324
    merger.check_basis(check_clean)
323
325
    merger.set_other(other_revision)
324
326
    merger.set_base(base_revision)
 
327
    if merger.base_rev_id == merger.other_rev_id:
 
328
        note('Nothing to do.')
 
329
        return 0
325
330
    merger.backup_files = backup_files
326
331
    merger.merge_type = merge_type 
327
332
    merger.set_interesting_files(file_list)
336
341
    return conflicts
337
342
 
338
343
def merge_inner(this_branch, other_tree, base_tree, ignore_zero=False,
339
 
                backup_files=False, merge_type=ApplyMerge3, 
340
 
                interesting_ids=None, show_base=False, reprocess=False,
 
344
                backup_files=False, 
 
345
                merge_type=ApplyMerge3, 
 
346
                interesting_ids=None, 
 
347
                show_base=False, 
 
348
                reprocess=False, 
 
349
                other_rev_id=None,
341
350
                interesting_files=None):
342
351
    """Primary interface for merging. 
343
352
 
358
367
    merger.conflict_handler = MergeConflictHandler(merger.this_tree, base_tree, 
359
368
                                                   other_tree,
360
369
                                                   ignore_zero=ignore_zero)
 
370
    merger.other_rev_id = other_rev_id
 
371
    merger.other_basis = other_rev_id
361
372
    return merger.do_merge()
362
373
 
363
374
 
369
380
        self.this_rev_id = None
370
381
        self.this_tree = this_branch.working_tree()
371
382
        self.this_revision_tree = None
 
383
        self.this_basis_tree = None
372
384
        self.other_tree = other_tree
373
385
        self.base_tree = base_tree
374
386
        self.ignore_zero = False
384
396
 
385
397
    def ensure_revision_trees(self):
386
398
        if self.this_revision_tree is None:
387
 
            if self.this_rev_id is None:
388
 
                self.compare_basis()
389
 
            if self.this_rev_id is None:
390
 
                raise WorkingTreeNotRevision(self.this_tree)
391
 
            self.this_revision_tree = self.this_branch.revision_tree(
392
 
                self.this_rev_id)
 
399
            self.this_basis_tree = self.this_branch.revision_tree(
 
400
                self.this_basis)
 
401
            if self.this_basis == self.this_rev_id:
 
402
                self.this_revision_tree = self.this_basis_tree
 
403
 
393
404
 
394
405
        if self.other_rev_id is None:
395
406
            other_basis_tree = self.revision_tree(self.other_basis)
406
417
            revision_id = tree.inventory[file_id].revision
407
418
            assert revision_id is not None
408
419
            return revision_id
409
 
        trees = (self.this_revision_tree, self.other_tree)
 
420
        if self.this_rev_id is None:
 
421
            if self.this_basis_tree.get_file_sha1(file_id) != \
 
422
                self.this_tree.get_file_sha1(file_id):
 
423
                raise WorkingTreeNotRevision(self.this_tree)
 
424
 
 
425
        trees = (self.this_basis_tree, self.other_tree)
410
426
        return [get_id(tree, file_id) for tree in trees]
411
427
            
412
428
 
413
429
    def merge_factory(self, file_id, base, other):
414
430
        if self.merge_type.history_based:
 
431
            if self.show_base is True:
 
432
                raise BzrError("Cannot show base for hisory-based merges")
 
433
            if self.reprocess is True:
 
434
                raise BzrError("Cannot reprocess history-based merges")
 
435
                
415
436
            t_revid, o_revid = self.file_revisions(file_id)
416
 
            weave = self.this_revision_tree.get_weave(file_id)
 
437
            weave = self.this_basis_tree.get_weave(file_id)
417
438
            contents_change = self.merge_type(weave, t_revid, o_revid)
418
439
        else:
419
440
            if self.show_base is True or self.reprocess is True:
522
543
    def do_merge(self):
523
544
        def get_inventory(tree):
524
545
            return tree.inventory
525
 
 
 
546
        
526
547
        inv_changes = merge_flex(self.this_tree, self.base_tree, 
527
548
                                 self.other_tree,
528
549
                                 generate_changeset, get_inventory,