~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/merge.py

MergeĀ fromĀ mainline

Show diffs side-by-side

added added

removed removed

Lines of Context:
145
145
        Handle weave conflicts by producing a .THIS, and .OTHER.  The
146
146
        main file will be a version with diff3-style conflicts.
147
147
        """
148
 
        self.add_suffix(filename, ".THIS")
 
148
        self.add_suffix(filename, ".THIS", fix_inventory=False)
149
149
        out_file.commit()
150
150
        self.dump(weave.get_iter(other_i), filename+".OTHER")
151
151
        self.conflict("Text conflict encountered in %s" % filename)
269
269
    this_branch = Branch.open_containing(to_dir)[0]
270
270
    transform_tree(this_branch.working_tree(), this_branch.basis_tree())
271
271
 
272
 
def transform_tree(from_tree, to_tree):
273
 
    merge_inner(from_tree.branch, to_tree, from_tree, ignore_zero=True)
 
272
def transform_tree(from_tree, to_tree, interesting_ids=None):
 
273
    merge_inner(from_tree.branch, to_tree, from_tree, ignore_zero=True,
 
274
                interesting_ids=interesting_ids)
274
275
 
275
276
def merge(other_revision, base_revision,
276
277
          check_clean=True, ignore_zero=False,
317
318
    merger.check_basis(check_clean)
318
319
    merger.set_other(other_revision)
319
320
    merger.set_base(base_revision)
 
321
    if merger.base_rev_id == merger.other_rev_id:
 
322
        note('Nothing to do.')
 
323
        return 0
320
324
    merger.backup_files = backup_files
321
325
    merger.merge_type = merge_type 
322
326
    merger.set_interesting_files(file_list)
332
336
 
333
337
def merge_inner(this_branch, other_tree, base_tree, ignore_zero=False,
334
338
                backup_files=False, merge_type=ApplyMerge3, 
335
 
                interesting_ids=None, show_base=False, reprocess=False):
 
339
                interesting_ids=None, show_base=False, reprocess=False, 
 
340
                other_rev_id=None):
336
341
    """Primary interface for merging. 
337
342
 
338
343
        typical use is probably 
341
346
        """
342
347
    merger = Merger(this_branch, other_tree, base_tree)
343
348
    merger.backup_files = False
344
 
    merger.merge_type = ApplyMerge3
 
349
    merger.merge_type = merge_type
345
350
    merger.interesting_ids = interesting_ids
346
351
    merger.show_base = show_base 
347
352
    merger.reprocess = reprocess
348
353
    merger.conflict_handler = MergeConflictHandler(merger.this_tree, base_tree, 
349
354
                                                   other_tree,
350
355
                                                   ignore_zero=ignore_zero)
 
356
    merger.other_rev_id = other_rev_id
 
357
    merger.other_basis = other_rev_id
351
358
    return merger.do_merge()
352
359
 
353
360
 
359
366
        self.this_rev_id = None
360
367
        self.this_tree = this_branch.working_tree()
361
368
        self.this_revision_tree = None
 
369
        self.this_basis_tree = None
362
370
        self.other_tree = other_tree
363
371
        self.base_tree = base_tree
364
372
        self.ignore_zero = False
374
382
 
375
383
    def ensure_revision_trees(self):
376
384
        if self.this_revision_tree is None:
377
 
            if self.this_rev_id is None:
378
 
                self.compare_basis()
379
 
            if self.this_rev_id is None:
380
 
                raise WorkingTreeNotRevision(self.this_tree)
381
 
            self.this_revision_tree = self.this_branch.revision_tree(
382
 
                self.this_rev_id)
 
385
            self.this_basis_tree = self.this_branch.revision_tree(
 
386
                self.this_basis)
 
387
            if self.this_basis == self.this_rev_id:
 
388
                self.this_revision_tree = self.this_basis_tree
 
389
 
383
390
 
384
391
        if self.other_rev_id is None:
385
392
            other_basis_tree = self.revision_tree(self.other_basis)
396
403
            revision_id = tree.inventory[file_id].revision
397
404
            assert revision_id is not None
398
405
            return revision_id
399
 
        trees = (self.this_revision_tree, self.other_tree)
 
406
        if self.this_rev_id is None:
 
407
            if self.this_basis_tree.get_file_sha1(file_id) != \
 
408
                self.this_tree.get_file_sha1(file_id):
 
409
                raise WorkingTreeNotRevision(self.this_tree)
 
410
 
 
411
        trees = (self.this_basis_tree, self.other_tree)
400
412
        return [get_id(tree, file_id) for tree in trees]
401
413
            
402
414
 
403
415
    def merge_factory(self, file_id, base, other):
404
416
        if self.merge_type.history_based:
 
417
            if self.show_base is True:
 
418
                raise BzrError("Cannot show base for hisory-based merges")
 
419
            if self.reprocess is True:
 
420
                raise BzrError("Cannot reprocess history-based merges")
 
421
                
405
422
            t_revid, o_revid = self.file_revisions(file_id)
406
 
            weave = self.this_revision_tree.get_weave(file_id)
 
423
            weave = self.this_basis_tree.get_weave(file_id)
407
424
            contents_change = self.merge_type(weave, t_revid, o_revid)
408
425
        else:
409
426
            if self.show_base is True or self.reprocess is True:
505
522
    def do_merge(self):
506
523
        def get_inventory(tree):
507
524
            return tree.inventory
508
 
 
 
525
        
509
526
        inv_changes = merge_flex(self.this_tree, self.base_tree, 
510
527
                                 self.other_tree,
511
528
                                 generate_changeset, get_inventory,