354
def import_version(output_dir, version, fast=False,
356
def import_version(output_dir, version, printer, fancy=True, fast=False,
355
357
verbose=False, dry_run=False, max_count=None,
356
358
reuse_history_from=[], standalone=True):
358
360
>>> q = test_environ()
360
Progress bars output to stderr, but doctest does not capture that.
362
>>> old_stderr = sys.stderr
363
>>> sys.stderr = sys.stdout
365
361
>>> result_path = os.path.join(q, "result")
366
362
>>> commit_test_revisions()
367
363
>>> version = pybaz.Version("test@example.com/test--test--0.1")
368
>>> old_ui = bzrlib.ui.ui_factory
369
>>> bzrlib.ui.ui_factory = bzrlib.ui.text.TextUIFactory(
370
... bar_type=bzrlib.progress.DotsProgressBar)
372
>>> import_version('/', version, dry_run=True)
364
>>> def printer(message): print message
365
>>> import_version('/', version, printer, fancy=False, dry_run=True)
373
366
Traceback (most recent call last):
374
367
NotPreviousImport: / is not the location of a previous import.
375
>>> import_version(result_path, version, dry_run=True)
368
>>> import_version(result_path, version, printer, fancy=False, dry_run=True)
376
369
Traceback (most recent call last):
377
370
UserError: The version test@example.com/test--test--0.1 does not exist.
378
371
>>> version = pybaz.Version("test@example.com/test--test--0")
379
>>> import_version(result_path, version, dry_run=True) #doctest: +ELLIPSIS
380
importing test@example.com/test--test--0 into ...
382
revisions: ..........................................
372
>>> import_version(result_path, version, printer, fancy=False, dry_run=True)
383
375
Dry run, not modifying output_dir
385
>>> import_version(result_path, version) #doctest: +ELLIPSIS
386
importing test@example.com/test--test--0 into ...
388
revisions: .....................................................................
377
>>> import_version(result_path, version, printer, fancy=False)
391
>>> import_version(result_path, version) #doctest: +ELLIPSIS
382
>>> import_version(result_path, version, printer, fancy=False)
392
383
Tree is up-to-date with test@example.com/test--test--0--patch-2
393
384
>>> commit_more_test_revisions()
394
>>> import_version(result_path, version) #doctest: +ELLIPSIS
395
importing test@example.com/test--test--0 into ...
396
revisions: ....................................................
385
>>> import_version(result_path, version, printer, fancy=False)
399
>>> bzrlib.ui.ui_factory = old_ui
400
>>> sys.stderr = old_stderr
401
390
>>> teardown_environ(q)
393
ancestors, old_revno = get_remaining_revisions(output_dir, version,
395
except NotBranchError, e:
396
raise NotPreviousImport(e.path)
397
if old_revno is None and len(ancestors) == 0:
398
print 'Version %s has no revisions.' % version
400
if len(ancestors) == 0:
401
last_revision = get_last_revision(Branch.open(output_dir))
402
print 'Tree is up-to-date with %s' % last_revision
403
405
progress_bar = bzrlib.ui.ui_factory.nested_progress_bar()
406
tempdir = tempfile.mkdtemp(prefix="baz2bzr-",
407
dir=os.path.dirname(output_dir))
409
wt = WorkingTree.open(output_dir)
410
except (NotBranchError, NoWorkingTree):
413
old_basis = EmptyTree()
415
old_basis = wt.basis_tree()
406
ancestors, old_revno = get_remaining_revisions(output_dir, version,
408
except NotBranchError, e:
409
raise NotPreviousImport(e.path)
410
if old_revno is None and len(ancestors) == 0:
411
progress_bar.note('Version %s has no revisions.' % version)
413
if len(ancestors) == 0:
414
last_revision = get_last_revision(Branch.open(output_dir))
415
progress_bar.note('Tree is up-to-date with %s' % last_revision)
418
progress_bar.note("importing %s into %s" % (version, output_dir))
420
tempdir = tempfile.mkdtemp(prefix="baz2bzr-",
421
dir=os.path.dirname(output_dir))
420
for result in iter_import_version(output_dir, ancestors, tempdir,
421
progress_bar, fast=fast, verbose=verbose, dry_run=dry_run,
422
max_count=max_count, standalone=standalone):
424
show_progress(progress_bar, result)
426
sys.stdout.write('.')
429
progress_bar.finished()
431
sys.stdout.write('\n')
434
print 'Dry run, not modifying output_dir'
437
# Update the working tree of the branch
423
439
wt = WorkingTree.open(output_dir)
424
except (NotBranchError, NoWorkingTree):
440
except NoWorkingTree:
427
for result in iter_import_version(output_dir, ancestors, tempdir,
429
fast=fast, verbose=verbose, dry_run=dry_run,
430
max_count=max_count, standalone=standalone):
431
show_progress(progress_bar, result)
433
progress_bar.note('Dry run, not modifying output_dir')
436
# Update the working tree of the branch
438
wt = WorkingTree.open(output_dir)
439
except NoWorkingTree:
442
wt.set_last_revision(wt.branch.last_revision())
447
progress_bar.note('Cleaning up')
448
shutil.rmtree(tempdir)
449
progress_bar.note("Import complete.")
443
wt.set_last_revision(wt.branch.last_revision())
444
merge_inner(wt.branch, wt.basis_tree(), old_basis,
445
ignore_zero=True, this_tree=wt)
451
progress_bar.finished()
449
printer('Cleaning up')
450
shutil.rmtree(tempdir)
451
printer("Import complete.")
453
453
class UserError(BzrCommandError):
454
454
def __init__(self, message):
725
def baz_import_branch(to_location, from_branch, fast, max_count, verbose,
726
dry_run, reuse_history_list):
727
to_location = os.path.realpath(str(to_location))
728
if from_branch is not None:
730
from_branch = pybaz.Version(from_branch)
731
except pybaz.errors.NamespaceError:
732
print "%s is not a valid Arch branch." % from_branch
734
if reuse_history_list is None:
735
reuse_history_list = []
736
import_version(to_location, from_branch,
738
reuse_history_from=reuse_history_list)
725
_global_option('max-count', type = int)
726
class cmd_baz_import_branch(Command):
727
"""Import an Arch or Baz branch into a bzr branch. <BZRTOOLS>"""
728
takes_args = ['to_location', 'from_branch?', 'reuse_history*']
729
takes_options = ['verbose', 'max-count']
731
def printer(self, name):
734
def run(self, to_location, from_branch=None, fast=False, max_count=None,
735
verbose=False, dry_run=False, reuse_history_list=[]):
736
to_location = os.path.realpath(str(to_location))
737
if from_branch is not None:
739
from_branch = pybaz.Version(from_branch)
740
except pybaz.errors.NamespaceError:
741
print "%s is not a valid Arch branch." % from_branch
743
if reuse_history_list is None:
744
reuse_history_list = []
745
import_version(to_location, from_branch, self.printer,
747
reuse_history_from=reuse_history_list)
741
750
class NotInABranch(Exception):
748
def baz_import(to_root_dir, from_archive, verbose=False, reuse_history_list=[],
750
if reuse_history_list is None:
751
reuse_history_list = []
752
to_root = str(os.path.realpath(to_root_dir))
753
if not os.path.exists(to_root):
755
if prefixes is not None:
756
prefixes = prefixes.split(':')
757
import_archive(to_root, from_archive, verbose,
758
reuse_history_list, prefixes=prefixes)
761
def import_archive(to_root, from_archive, verbose,
756
class cmd_baz_import(Command):
757
"""Import an Arch or Baz archive into bzr branches. <BZRTOOLS>
759
This command should be used on local archives (or mirrors) only. It is
760
quite slow on remote archives.
762
reuse_history allows you to specify any previous imports you
763
have done of different archives, which this archive has branches
764
tagged from. This will dramatically reduce the time to convert
765
the archive as it will not have to convert the history already
766
converted in that other branch.
768
If you specify prefixes, only branches whose names start with that prefix
769
will be imported. Skipped branches will be listed, so you can import any
770
branches you missed by accident. Here's an example of doing a partial
771
import from thelove@canonical.com:
772
bzr baz-import thelove thelove@canonical.com --prefixes dists:talloc-except
774
takes_args = ['to_root_dir', 'from_archive', 'reuse_history*']
775
takes_options = ['verbose', Option('prefixes', type=str,
776
help="Prefixes of branches to import, colon-separated")]
778
def printer(self, name):
781
def run(self, to_root_dir, from_archive, verbose=False,
782
reuse_history_list=[], prefixes=None):
783
if reuse_history_list is None:
784
reuse_history_list = []
785
to_root = str(os.path.realpath(to_root_dir))
786
if not os.path.exists(to_root):
788
if prefixes is not None:
789
prefixes = prefixes.split(':')
790
import_archive(to_root, from_archive, verbose, self.printer,
791
reuse_history_list, prefixes=prefixes)
794
def import_archive(to_root, from_archive, verbose, printer,
762
795
reuse_history_from=[], standalone=False,
764
797
def selected(version):
780
813
except NoRepositoryPresent:
781
814
raise BzrCommandError("Can't create repository at existing branch.")
782
815
versions = list(pybaz.Archive(str(from_archive)).iter_versions())
783
progress_bar = bzrlib.ui.ui_factory.nested_progress_bar()
816
# progress_bar = bzrlib.ui.ui_factory.nested_progress_bar()
785
818
for num, version in enumerate(versions):
786
progress_bar.update("Branch", num, len(versions))
819
# progress_bar.update("Branch", num, len(versions))
787
820
if not selected(version):
788
821
print "Skipping %s" % version
790
823
target = os.path.join(to_root, map_namespace(version))
824
printer("importing %s into %s" % (version, target))
791
825
if not os.path.exists(os.path.dirname(target)):
792
826
os.makedirs(os.path.dirname(target))
794
import_version(target, version,
828
import_version(target, version, printer,
795
829
reuse_history_from=reuse_history_from,
796
830
standalone=standalone)
797
831
except pybaz.errors.ExecProblem,e:
798
832
if str(e).find('The requested revision cannot be built.') != -1:
800
"Skipping version %s as it cannot be built due"
801
" to a missing parent archive." % version)
833
printer("Skipping version %s as it cannot be built due"
834
" to a missing parent archive." % version)
804
837
except UserError, e:
805
838
if str(e).find('already exists, and the last revision ') != -1:
807
"Skipping version %s as it has had commits made"
808
" since it was converted to bzr." % version)
839
printer("Skipping version %s as it has had commits made"
840
" since it was converted to bzr." % version)
812
progress_bar.finished()
845
# progress_bar.finished()
815
847
def map_namespace(a_version):
816
848
a_version = pybaz.Version("%s" % a_version)