290
286
# We are starting from an existing directory, figure out what
291
287
# the current version is
292
288
branch = Branch.open(output_dir)
293
last_patch, last_encoding = get_last_revision(branch)
294
assert encoding == last_encoding
289
last_patch = get_last_revision(branch)
295
290
if last_patch is None:
296
291
if branch.last_revision() != None:
297
292
raise NotPreviousImport(branch.base)
316
311
map_namespace(ancestor.version))
318
313
source = Branch.open(possible_source)
319
rev_id = revision_id(ancestor, encoding)
314
rev_id = revision_id(ancestor)
320
315
if rev_id in source.revision_history():
321
316
do_branch(source, output_dir, rev_id)
322
317
last_patch = ancestor
360
def import_version(output_dir, version, encoding, fast=False,
355
def import_version(output_dir, version, fast=False,
361
356
verbose=False, dry_run=False, max_count=None,
362
357
reuse_history_from=[], standalone=True):
375
370
>>> bzrlib.ui.ui_factory = bzrlib.ui.text.TextUIFactory(
376
371
... bar_type=bzrlib.progress.DotsProgressBar)
378
>>> import_version('/', version, None, dry_run=True)
373
>>> import_version('/', version, dry_run=True)
379
374
Traceback (most recent call last):
380
375
NotPreviousImport: / is not the location of a previous import.
381
>>> import_version(result_path, version, None, dry_run=True)
376
>>> import_version(result_path, version, dry_run=True)
382
377
Traceback (most recent call last):
383
378
UserError: The version test@example.com/test--test--0.1 does not exist.
384
379
>>> version = pybaz.Version("test@example.com/test--test--0")
385
>>> import_version(result_path, version, None, dry_run=True) #doctest: +ELLIPSIS
380
>>> import_version(result_path, version, dry_run=True) #doctest: +ELLIPSIS
386
381
importing test@example.com/test--test--0 into ...
388
383
revisions: ..........................................
389
384
Dry run, not modifying output_dir
391
>>> import_version(result_path, version, None) #doctest: +ELLIPSIS
386
>>> import_version(result_path, version) #doctest: +ELLIPSIS
392
387
importing test@example.com/test--test--0 into ...
394
389
revisions: .....................................................................
397
>>> import_version(result_path, version, None) #doctest: +ELLIPSIS
392
>>> import_version(result_path, version) #doctest: +ELLIPSIS
398
393
Tree is up-to-date with test@example.com/test--test--0--patch-2
399
394
>>> commit_more_test_revisions()
400
>>> import_version(result_path, version, None) #doctest: +ELLIPSIS
395
>>> import_version(result_path, version) #doctest: +ELLIPSIS
401
396
importing test@example.com/test--test--0 into ...
402
397
revisions: ....................................................
431
424
wt = WorkingTree.open(output_dir)
432
425
except (NotBranchError, NoWorkingTree):
428
old_basis = EmptyTree()
430
old_basis = wt.basis_tree()
435
432
for result in iter_import_version(output_dir, ancestors, tempdir,
436
pb=progress_bar, encoding=encoding, fast=fast,
437
verbose=verbose, dry_run=dry_run, max_count=max_count,
438
standalone=standalone):
434
fast=fast, verbose=verbose, dry_run=dry_run,
435
max_count=max_count, standalone=standalone):
439
436
show_progress(progress_bar, result)
441
438
progress_bar.note('Dry run, not modifying output_dir')
482
480
:param arch_revision: The Arch revision to generate an ID for.
484
>>> revision_id(pybaz.Revision("you@example.com/cat--br--0--base-0"), None)
482
>>> revision_id(pybaz.Revision("you@example.com/cat--br--0--base-0"))
485
483
'Arch-1:you@example.com%cat--br--0--base-0'
486
>>> revision_id(pybaz.Revision("you@example.com/cat--br--0--base-0"), 'utf-8')
487
'Arch-1-utf-8:you@example.com%cat--br--0--base-0'
492
encoding = '-' + encoding
493
return "Arch-1%s:%s" % (encoding, str(arch_revision).replace('/', '%'))
485
return "Arch-1:%s" % str(arch_revision).replace('/', '%')
495
487
class NotArchRevision(Exception):
496
488
def __init__(self, revision_id):
506
498
>>> str(arch_revision("Arch-1:jrandom@example.com%test--test--0--base-5"))
507
499
Traceback (most recent call last):
508
500
NotArchRevision: The revision id Arch-1:jrandom@example.com%test--test--0--base-5 does not look like it came from Arch.
509
>>> str(arch_revision("Arch-1:jrandom@example.com%test--test--0--patch-5")[0])
510
'jrandom@example.com/test--test--0--patch-5'
511
>>> str(arch_revision("Arch-1:jrandom@example.com%test--test--0--patch-5")[0])
512
'jrandom@example.com/test--test--0--patch-5'
513
>>> str(arch_revision("Arch-1:jrandom@example.com%test--test--0--patch-5")[1])
515
>>> str(arch_revision("Arch-1-utf-8:jrandom@example.com%test--test--0--patch-5")[1])
501
>>> str(arch_revision("Arch-1:jrandom@example.com%test--test--0--patch-5"))
502
'jrandom@example.com/test--test--0--patch-5'
518
504
if revision_id is None:
520
if revision_id[:7] not in ('Arch-1:', 'Arch-1-'):
506
if revision_id[:7] != 'Arch-1:':
521
507
raise NotArchRevision(revision_id)
524
encoding, arch_name = revision_id[6:].split(':', 1)
525
arch_name = arch_name.replace('%', '/')
529
encoding = encoding[1:]
530
return pybaz.Revision(arch_name), encoding
510
return pybaz.Revision(revision_id[7:].replace('%', '/'))
531
511
except pybaz.errors.NamespaceError, e:
532
512
raise NotArchRevision(revision_id)
553
533
revision_id = source.last_revision()
554
534
wt = create_checkout(source, to_location, NULL_REVISION)
555
535
wt.set_last_revision(revision_id)
556
if revision_id not in (NULL_REVISION, None):
557
wt._write_inventory(wt.basis_tree().inventory)
536
wt._write_inventory(wt.basis_tree().inventory)
561
def iter_import_version(output_dir, ancestors, tempdir, pb, encoding,
562
fast=False, verbose=False, dry_run=False,
563
max_count=None, standalone=False):
540
def iter_import_version(output_dir, ancestors, tempdir, pb, fast=False,
541
verbose=False, dry_run=False, max_count=None,
565
log_encoding = 'ascii'
566
if encoding is not None:
567
log_encoding = encoding
569
545
# Uncomment this for testing, it basically just has baz2bzr only update
570
546
# 5 patches at a time
657
633
if missing_ancestor:
658
634
# if we want it to be in revision-history, do that here.
659
target_tree.set_parent_ids(
660
[revision_id(missing_ancestor, encoding)],
661
allow_leftmost_as_ghost=True)
635
target_tree.add_pending_merge(revision_id(missing_ancestor))
662
636
missing_ancestor = None
663
637
for merged_rev in direct_merges:
664
target_tree.add_pending_merge(revision_id(merged_rev,
666
target_tree.set_root_id(BAZ_IMPORT_ROOT)
638
target_tree.add_pending_merge(revision_id(merged_rev))
667
639
target_tree.set_inventory(baz_inv)
668
640
commitobj = Commit(reporter=ImportCommitReporter())
669
641
commitobj.commit(working_tree=target_tree,
670
message=log_message.decode(log_encoding, 'replace'),
671
verbose=False, committer=log_creator, timestamp=timestamp,
672
timezone=0, rev_id=rev_id, revprops={})
642
message=log_message.decode('ascii', 'replace'),
643
verbose=False, committer=log_creator,
644
timestamp=timestamp, timezone=0, rev_id=rev_id,
674
647
target_tree.unlock()
731
_global_option('max-count', type = int)
732
class cmd_baz_import_branch(Command):
733
"""Import an Arch or Baz branch into a bzr branch."""
734
takes_args = ['to_location', 'from_branch?', 'reuse_history*']
735
takes_options = ['verbose', 'max-count']
759
def baz_import_branch(to_location, from_branch, fast, max_count, verbose,
760
encoding, dry_run, reuse_history_list):
761
to_location = os.path.realpath(str(to_location))
762
if from_branch is not None:
764
from_branch = pybaz.Version(from_branch)
765
except pybaz.errors.NamespaceError:
766
print "%s is not a valid Arch branch." % from_branch
768
if reuse_history_list is None:
769
reuse_history_list = []
770
import_version(to_location, from_branch, encoding, max_count=max_count,
771
reuse_history_from=reuse_history_list)
737
def run(self, to_location, from_branch=None, fast=False, max_count=None,
738
verbose=False, dry_run=False, reuse_history_list=[]):
739
to_location = os.path.realpath(str(to_location))
740
if from_branch is not None:
742
from_branch = pybaz.Version(from_branch)
743
except pybaz.errors.NamespaceError:
744
print "%s is not a valid Arch branch." % from_branch
746
if reuse_history_list is None:
747
reuse_history_list = []
748
import_version(to_location, from_branch,
750
reuse_history_from=reuse_history_list)
774
753
class NotInABranch(Exception):
781
def baz_import(to_root_dir, from_archive, encoding, 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, encoding,
791
reuse_history_list, prefixes=prefixes)
759
class cmd_baz_import(Command):
760
"""Import an Arch or Baz archive into a bzr repository.
762
This command should be used on local archives (or mirrors) only. It is
763
quite slow on remote archives.
765
reuse_history allows you to specify any previous imports you
766
have done of different archives, which this archive has branches
767
tagged from. This will dramatically reduce the time to convert
768
the archive as it will not have to convert the history already
769
converted in that other branch.
771
If you specify prefixes, only branches whose names start with that prefix
772
will be imported. Skipped branches will be listed, so you can import any
773
branches you missed by accident. Here's an example of doing a partial
774
import from thelove@canonical.com:
775
bzr baz-import thelove thelove@canonical.com --prefixes dists:talloc-except
777
takes_args = ['to_root_dir', 'from_archive', 'reuse_history*']
778
takes_options = ['verbose', Option('prefixes', type=str,
779
help="Prefixes of branches to import, colon-separated")]
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,
791
reuse_history_list, prefixes=prefixes)
794
794
def import_archive(to_root, from_archive, verbose,
795
encoding, reuse_history_from=[], standalone=False,
795
reuse_history_from=[], standalone=False,
797
797
def selected(version):
798
798
if prefixes is None:
824
824
if not os.path.exists(os.path.dirname(target)):
825
825
os.makedirs(os.path.dirname(target))
827
import_version(target, version, encoding,
827
import_version(target, version,
828
828
reuse_history_from=reuse_history_from,
829
829
standalone=standalone)
830
830
except pybaz.errors.ExecProblem,e: