~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/shelf_ui.py

  • Committer: John Arbash Meinel
  • Date: 2009-12-22 16:28:47 UTC
  • mto: This revision was merged to the branch mainline in revision 4922.
  • Revision ID: john@arbash-meinel.com-20091222162847-tvnsc69to4l4uf5r
Implement a permute_for_extension helper.

Use it for all of the 'simple' extension permutations.
It basically permutes all tests in the current module, by setting TestCase.module.
Which works well for most of our extension tests. Some had more advanced
handling of permutations (extra permutations, custom vars, etc.)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2008, 2009, 2010 Canonical Ltd
 
1
# Copyright (C) 2008 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
22
22
 
23
23
from bzrlib import (
24
24
    builtins,
 
25
    commands,
25
26
    delta,
26
27
    diff,
27
28
    errors,
382
383
    """Unshelve changes into a working tree."""
383
384
 
384
385
    @classmethod
385
 
    def from_args(klass, shelf_id=None, action='apply', directory='.',
386
 
                  write_diff_to=None):
 
386
    def from_args(klass, shelf_id=None, action='apply', directory='.'):
387
387
        """Create an unshelver from commandline arguments.
388
388
 
389
 
        The returned shelver will have a tree that is locked and should
 
389
        The returned shelver wil have a tree that is locked and should
390
390
        be unlocked.
391
391
 
392
392
        :param shelf_id: Integer id of the shelf, as a string.
393
393
        :param action: action to perform.  May be 'apply', 'dry-run',
394
 
            'delete', 'preview'.
 
394
            'delete'.
395
395
        :param directory: The directory to unshelve changes into.
396
 
        :param write_diff_to: See Unshelver.__init__().
397
396
        """
398
397
        tree, path = workingtree.WorkingTree.open_containing(directory)
399
398
        tree.lock_tree_write()
411
410
            apply_changes = True
412
411
            delete_shelf = True
413
412
            read_shelf = True
414
 
            show_diff = False
415
413
            if action == 'dry-run':
416
414
                apply_changes = False
417
415
                delete_shelf = False
418
 
            elif action == 'preview':
419
 
                apply_changes = False
420
 
                delete_shelf = False
421
 
                show_diff = True
422
416
            elif action == 'delete-only':
423
417
                apply_changes = False
424
418
                read_shelf = False
429
423
            tree.unlock()
430
424
            raise
431
425
        return klass(tree, manager, shelf_id, apply_changes, delete_shelf,
432
 
                     read_shelf, show_diff, write_diff_to)
 
426
                     read_shelf)
433
427
 
434
428
    def __init__(self, tree, manager, shelf_id, apply_changes=True,
435
 
                 delete_shelf=True, read_shelf=True, show_diff=False,
436
 
                 write_diff_to=None):
 
429
                 delete_shelf=True, read_shelf=True):
437
430
        """Constructor.
438
431
 
439
432
        :param tree: The working tree to unshelve into.
443
436
            working tree.
444
437
        :param delete_shelf: If True, delete the changes from the shelf.
445
438
        :param read_shelf: If True, read the changes from the shelf.
446
 
        :param show_diff: If True, show the diff that would result from
447
 
            unshelving the changes.
448
 
        :param write_diff_to: A file-like object where the diff will be
449
 
            written to. If None, ui.ui_factory.make_output_stream() will
450
 
            be used.
451
439
        """
452
440
        self.tree = tree
453
441
        manager = tree.get_shelf_manager()
456
444
        self.apply_changes = apply_changes
457
445
        self.delete_shelf = delete_shelf
458
446
        self.read_shelf = read_shelf
459
 
        self.show_diff = show_diff
460
 
        self.write_diff_to = write_diff_to
461
447
 
462
448
    def run(self):
463
449
        """Perform the unshelving operation."""
471
457
                if unshelver.message is not None:
472
458
                    trace.note('Message: %s' % unshelver.message)
473
459
                change_reporter = delta._ChangeReporter()
474
 
                merger = unshelver.make_merger(None)
475
 
                merger.change_reporter = change_reporter
476
 
                if self.apply_changes:
477
 
                    merger.do_merge()
478
 
                elif self.show_diff:
479
 
                    self.write_diff(merger)
480
 
                else:
481
 
                    self.show_changes(merger)
 
460
                task = ui.ui_factory.nested_progress_bar()
 
461
                try:
 
462
                    merger = unshelver.make_merger(task)
 
463
                    merger.change_reporter = change_reporter
 
464
                    if self.apply_changes:
 
465
                        merger.do_merge()
 
466
                    else:
 
467
                        self.show_changes(merger)
 
468
                finally:
 
469
                    task.finished()
482
470
            if self.delete_shelf:
483
471
                self.manager.delete_shelf(self.shelf_id)
484
472
                trace.note('Deleted changes with id "%d".' % self.shelf_id)
486
474
            for cleanup in reversed(cleanups):
487
475
                cleanup()
488
476
 
489
 
    def write_diff(self, merger):
490
 
        """Write this operation's diff to self.write_diff_to."""
491
 
        tree_merger = merger.make_merger()
492
 
        tt = tree_merger.make_preview_transform()
493
 
        new_tree = tt.get_preview_tree()
494
 
        if self.write_diff_to is None:
495
 
            self.write_diff_to = ui.ui_factory.make_output_stream()
496
 
        diff.show_diff_trees(merger.this_tree, new_tree, self.write_diff_to)
497
 
        tt.finalize()
498
 
 
499
477
    def show_changes(self, merger):
500
478
        """Show the changes that this operation specifies."""
501
479
        tree_merger = merger.make_merger()