13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16
from bzrlib import Branch
19
from bzrlib.bzrdir import BzrDir
20
import bzrlib.bzrdir as bzrdir
21
from bzrlib.errors import (BzrError,
28
from bzrlib.branch import Branch
29
from bzrlib.commit import Commit, NullCommitReporter
17
30
from bzrlib.commands import Command
31
from bzrlib.option import _global_option, Option
32
from bzrlib.merge import merge_inner
33
from bzrlib.revision import NULL_REVISION
36
from bzrlib.workingtree import WorkingTree
37
from errors import NoPyBaz
20
40
import pybaz.errors
41
from pybaz import NameParser as NameParser
42
from pybaz.backends.baz import null_cmd
21
43
except ImportError:
22
print "This command requires PyBaz. Please ensure that it is installed."
25
from pybaz.backends.baz import null_cmd
45
from fai import iter_new_merges, direct_merges
31
from bzrlib.errors import BzrError
32
51
import bzrlib.trace
33
52
import bzrlib.merge
53
import bzrlib.inventory
36
57
from progress import *
60
BAZ_IMPORT_ROOT = 'TREE_ROOT'
63
class ImportCommitReporter(NullCommitReporter):
65
def escaped(self, escape_count, message):
66
bzrlib.trace.warning("replaced %d control characters in message" %
38
69
def add_id(files, id=None):
39
70
"""Adds an explicit id to a list of files.
207
250
def get_last_revision(branch):
208
last_patch = branch.last_patch()
251
last_patch = branch.last_revision()
210
253
return arch_revision(last_patch)
211
254
except NotArchRevision:
213
256
"Directory \"%s\" already exists, and the last revision is not"
214
" an Arch revision (%s)" % (output_dir, last_patch))
217
def get_remaining_revisions(output_dir, version):
257
" an Arch revision (%s)" % (branch.base, last_patch))
259
def do_branch(br_from, to_location, revision_id):
260
"""Derived from branch in builtins."""
264
os.mkdir(to_location)
266
if e.errno == errno.EEXIST:
267
raise UserError('Target directory "%s" already'
268
' exists.' % to_location)
269
if e.errno == errno.ENOENT:
270
raise UserError('Parent of "%s" does not exist.' %
275
br_from.bzrdir.clone(to_location, revision_id)
276
except NoSuchRevision:
278
msg = "The branch %s has no revision %s." % (from_location,
284
def get_remaining_revisions(output_dir, version, encoding,
285
reuse_history_from=[]):
218
286
last_patch = None
220
if os.path.exists(output_dir):
288
output_exists = os.path.exists(output_dir)
221
290
# We are starting from an existing directory, figure out what
222
291
# the current version is
223
branch = find_branch(output_dir)
224
last_patch = get_last_revision(branch)
292
branch = Branch.open(output_dir)
293
last_patch, last_encoding = get_last_revision(branch)
294
assert encoding == last_encoding
295
if last_patch is None:
296
if branch.last_revision() != None:
297
raise NotPreviousImport(branch.base)
298
elif version is None:
226
299
version = last_patch.version
227
300
elif version is None:
228
301
raise UserError("No version specified, and directory does not exist.")
231
304
ancestors = version_ancestry(version)
305
if not output_exists and reuse_history_from != []:
306
for ancestor in reversed(ancestors):
307
if last_patch is not None:
308
# found something to copy
310
# try to grab a copy of ancestor
311
# note that is not optimised: we could look for namespace
312
# transitions and only look for the past after the
314
for history_root in reuse_history_from:
315
possible_source = os.path.join(history_root,
316
map_namespace(ancestor.version))
318
source = Branch.open(possible_source)
319
rev_id = revision_id(ancestor, encoding)
320
if rev_id in source.revision_history():
321
do_branch(source, output_dir, rev_id)
322
last_patch = ancestor
324
except NotBranchError:
232
326
except NoSuchVersion, e:
327
raise UserError(str(e))
236
330
for i in range(len(ancestors)):
240
334
raise UserError("Directory \"%s\" already exists, and the last "
241
"revision (%s) is not in the ancestry of %s" %
335
"revision (%s) is not in the ancestry of %s" %
242
336
(output_dir, last_patch, version))
243
337
# Strip off all of the ancestors which are already present
244
338
# And get a directory starting with the latest ancestor
245
339
latest_ancestor = ancestors[i]
246
old_revno = find_branch(output_dir).revno()
340
old_revno = Branch.open(output_dir).revno()
247
341
ancestors = ancestors[i+1:]
248
342
return ancestors, old_revno
250
def import_version(output_dir, version, fancy=True, fast=False, verbose=False,
251
dry_run=False, max_count=None, skip_symlinks=False):
345
###class Importer(object):
348
### Currently this is used as a parameter object, though more behaviour is
352
### def __init__(self, output_dir, version, fast=False,
353
### verbose=False, dry_run=False, max_count=None,
354
### reuse_history_from=[]):
355
### self.output_dir = output_dir
356
### self.version = version
360
def import_version(output_dir, version, encoding, fast=False,
361
verbose=False, dry_run=False, max_count=None,
362
reuse_history_from=[], standalone=True):
253
364
>>> q = test_environ()
366
Progress bars output to stderr, but doctest does not capture that.
368
>>> old_stderr = sys.stderr
369
>>> sys.stderr = sys.stdout
254
371
>>> result_path = os.path.join(q, "result")
255
372
>>> commit_test_revisions()
256
373
>>> version = pybaz.Version("test@example.com/test--test--0.1")
257
>>> import_version('/', version, fancy=False, dry_run=True)
374
>>> old_ui = bzrlib.ui.ui_factory
375
>>> bzrlib.ui.ui_factory = bzrlib.ui.text.TextUIFactory(
376
... bar_type=bzrlib.progress.DotsProgressBar)
378
>>> import_version('/', version, None, dry_run=True)
258
379
Traceback (most recent call last):
259
UserError: / exists, but is not a bzr branch.
260
>>> import_version(result_path, version, fancy=False, dry_run=True)
380
NotPreviousImport: / is not the location of a previous import.
381
>>> import_version(result_path, version, None, dry_run=True)
261
382
Traceback (most recent call last):
262
383
UserError: The version test@example.com/test--test--0.1 does not exist.
263
384
>>> version = pybaz.Version("test@example.com/test--test--0")
264
>>> import_version(result_path, version, fancy=False, dry_run=True)
385
>>> import_version(result_path, version, None, dry_run=True) #doctest: +ELLIPSIS
386
importing test@example.com/test--test--0 into ...
388
revisions: ..........................................
267
389
Dry run, not modifying output_dir
269
>>> import_version(result_path, version, fancy=False)
391
>>> import_version(result_path, version, None) #doctest: +ELLIPSIS
392
importing test@example.com/test--test--0 into ...
394
revisions: .....................................................................
274
>>> import_version(result_path, version, fancy=False)
397
>>> import_version(result_path, version, None) #doctest: +ELLIPSIS
275
398
Tree is up-to-date with test@example.com/test--test--0--patch-2
276
399
>>> commit_more_test_revisions()
277
>>> import_version(result_path, version, fancy=False)
400
>>> import_version(result_path, version, None) #doctest: +ELLIPSIS
401
importing test@example.com/test--test--0 into ...
402
revisions: ....................................................
405
>>> bzrlib.ui.ui_factory = old_ui
406
>>> sys.stderr = old_stderr
282
407
>>> teardown_environ(q)
285
ancestors, old_revno = get_remaining_revisions(output_dir, version)
286
except NotInABranch, e:
287
raise UserError("%s exists, but is not a bzr branch." % e.path)
288
if len(ancestors) == 0:
289
last_revision = get_last_revision(find_branch(output_dir))
290
print 'Tree is up-to-date with %s' % last_revision
293
progress_bar = ProgressBar()
294
tempdir = tempfile.mkdtemp(prefix="baz2bzr-",
295
dir=os.path.dirname(output_dir))
409
progress_bar = bzrlib.ui.ui_factory.nested_progress_bar()
412
ancestors, old_revno = get_remaining_revisions(output_dir, version,
415
except NotBranchError, e:
416
raise NotPreviousImport(e.path)
417
if old_revno is None and len(ancestors) == 0:
418
progress_bar.note('Version %s has no revisions.' % version)
420
if len(ancestors) == 0:
421
last_revision, last_encoding = \
422
get_last_revision(Branch.open(output_dir))
423
progress_bar.note('Tree is up-to-date with %s' % last_revision)
426
progress_bar.note("importing %s into %s" % (version, output_dir))
428
tempdir = tempfile.mkdtemp(prefix="baz2bzr-",
429
dir=os.path.dirname(output_dir))
431
wt = WorkingTree.open(output_dir)
432
except (NotBranchError, NoWorkingTree):
300
435
for result in iter_import_version(output_dir, ancestors, tempdir,
301
fast=fast, verbose=verbose, dry_run=dry_run,
302
max_count=max_count, skip_symlinks=skip_symlinks):
306
sys.stdout.write('.')
436
pb=progress_bar, encoding=encoding, fast=fast,
437
verbose=verbose, dry_run=dry_run, max_count=max_count,
438
standalone=standalone):
439
show_progress(progress_bar, result)
441
progress_bar.note('Dry run, not modifying output_dir')
444
# Update the working tree of the branch
446
wt = WorkingTree.open(output_dir)
447
except NoWorkingTree:
450
wt.set_last_revision(wt.branch.last_revision())
451
wt.set_root_id(BAZ_IMPORT_ROOT)
311
sys.stdout.write('\n')
314
print 'Dry run, not modifying output_dir'
316
if os.path.exists(output_dir):
317
# Move the bzr control directory back, and update the working tree
318
tmp_bzr_dir = os.path.join(tempdir, '.bzr')
320
bzr_dir = os.path.join(output_dir, '.bzr')
321
new_bzr_dir = os.path.join(tempdir, "rd", '.bzr')
323
os.rename(bzr_dir, tmp_bzr_dir) # Move the original bzr out of the way
324
os.rename(new_bzr_dir, bzr_dir)
326
bzrlib.merge.merge((output_dir, -1), (output_dir, old_revno),
327
check_clean=False, this_dir=output_dir,
330
# If something failed, move back the original bzr directory
331
os.rename(bzr_dir, new_bzr_dir)
332
os.rename(tmp_bzr_dir, bzr_dir)
335
revdir = os.path.join(tempdir, "rd")
336
os.rename(revdir, output_dir)
456
progress_bar.note('Cleaning up')
457
shutil.rmtree(tempdir)
458
progress_bar.note("Import complete.")
340
shutil.rmtree(tempdir)
341
print "Import complete."
343
class UserError(Exception):
460
progress_bar.finished()
462
class UserError(BzrCommandError):
344
463
def __init__(self, message):
345
464
"""Exception to throw when a user makes an impossible request
346
465
:param message: The message to emit when printing this exception
347
466
:type message: string
349
Exception.__init__(self, message)
351
def revision_id(arch_revision):
468
BzrCommandError.__init__(self, message)
470
class NotPreviousImport(UserError):
471
def __init__(self, path):
472
UserError.__init__(self, "%s is not the location of a previous import."
476
def revision_id(arch_revision, encoding):
353
478
Generate a Bzr revision id from an Arch revision id. 'x' in the id
354
479
designates a revision imported with an experimental algorithm. A number
370
501
def arch_revision(revision_id):
372
>>> str(arch_revision("Arch-x:jrandom@example.com%test--test--0"))
373
Traceback (most recent call last):
374
NotArchRevision: The revision id Arch-x:jrandom@example.com%test--test--0 does not look like it came from Arch.
375
>>> str(arch_revision("Arch-x:jrandom@example.com%test--test--0--base-5"))
376
Traceback (most recent call last):
377
NotArchRevision: The revision id Arch-x:jrandom@example.com%test--test--0--base-5 does not look like it came from Arch.
378
>>> str(arch_revision("Arch-x:jrandom@example.com%test--test--0--patch-5"))
379
'jrandom@example.com/test--test--0--patch-5'
503
>>> str(arch_revision("Arch-1:jrandom@example.com%test--test--0"))
504
Traceback (most recent call last):
505
NotArchRevision: The revision id Arch-1:jrandom@example.com%test--test--0 does not look like it came from Arch.
506
>>> str(arch_revision("Arch-1:jrandom@example.com%test--test--0--base-5"))
507
Traceback (most recent call last):
508
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])
381
518
if revision_id is None:
383
if revision_id[:7] != 'Arch-x:':
520
if revision_id[:7] not in ('Arch-1:', 'Arch-1-'):
384
521
raise NotArchRevision(revision_id)
387
return pybaz.Revision(revision_id[7:].replace('%', '/'))
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
388
531
except pybaz.errors.NamespaceError, e:
389
532
raise NotArchRevision(revision_id)
391
def iter_import_version(output_dir, ancestors, tempdir, fast=False,
392
verbose=False, dry_run=False, max_count=None,
393
skip_symlinks=False):
535
def create_shared_repository(output_dir):
536
bd = bzrdir.BzrDirMetaFormat1().initialize(output_dir)
537
bd.create_repository(shared=True)
539
def create_branch(output_dir):
541
bd = bzrdir.BzrDirMetaFormat1().initialize(output_dir)
542
return bd.create_branch()
545
def create_checkout(source, to_location, revision_id=None):
546
checkout = bzrdir.BzrDirMetaFormat1().initialize(to_location)
547
bzrlib.branch.BranchReferenceFormat().initialize(checkout, source)
548
return checkout.create_workingtree(revision_id)
551
def create_checkout_metadata(source, to_location, revision_id=None):
552
if revision_id is None:
553
revision_id = source.last_revision()
554
wt = create_checkout(source, to_location, NULL_REVISION)
557
wt.set_last_revision(revision_id)
559
if revision_id not in (NULL_REVISION, None):
560
basis = wt.basis_tree()
563
wt._write_inventory(basis.inventory)
571
def iter_import_version(output_dir, ancestors, tempdir, pb, encoding,
572
fast=False, verbose=False, dry_run=False,
573
max_count=None, standalone=False):
575
log_encoding = 'ascii'
576
if encoding is not None:
577
log_encoding = encoding
396
579
# Uncomment this for testing, it basically just has baz2bzr only update
397
580
# 5 patches at a time
408
591
# print '\t%s' % a
410
593
previous_version=None
594
missing_ancestor = None
596
dry_output_dir = os.path.join(tempdir, 'od')
597
if os.path.exists(output_dir):
598
shutil.copytree(output_dir, dry_output_dir)
599
output_dir = dry_output_dir
601
if os.path.exists(output_dir):
602
target_branch = Branch.open(output_dir)
605
wt = BzrDir.create_standalone_workingtree(output_dir)
606
target_branch = wt.branch
608
target_branch = create_branch(output_dir)
412
610
for i in range(len(ancestors)):
413
611
revision = ancestors[i]
612
rev_id = revision_id(revision, encoding)
415
615
version = str(revision.version)
416
616
if version != previous_version:
418
print '\rOn version: %s' % version
617
pb.note('On version: %s' % version)
419
618
yield Progress(str(revision.patchlevel), i, len(ancestors))
420
619
previous_version = version
422
621
yield Progress("revisions", i, len(ancestors))
623
if target_branch.repository.has_revision(rev_id):
624
target_branch.append_revision(rev_id)
423
626
if revdir is None:
424
627
revdir = os.path.join(tempdir, "rd")
425
baz_inv, log = get_revision(revdir, revision,
426
skip_symlinks=skip_symlinks)
427
if os.path.exists(output_dir):
428
bzr_dir = os.path.join(output_dir, '.bzr')
429
new_bzr_dir = os.path.join(tempdir, "rd", '.bzr')
430
# This would be much faster with a simple os.rename(), but if
431
# we fail, we have corrupted the original .bzr directory. Is
432
# that a big problem, as we can just back out the last
433
# revisions in .bzr/revision_history I don't really know
434
shutil.copytree(bzr_dir, new_bzr_dir)
435
# Now revdir should have a tree with the latest .bzr, and the
436
# next revision of the baz tree
437
branch = find_branch(revdir)
439
branch = bzrlib.Branch(revdir, init=True)
629
tree, baz_inv, log = get_revision(revdir, revision)
630
except pybaz.errors.ExecProblem, e:
631
if ("%s" % e.args).find('could not connect') == -1:
633
missing_ancestor = revision
635
pb.note("unable to access ancestor %s, making into a merge."
638
target_tree = create_checkout_metadata(target_branch, revdir)
639
branch = target_tree.branch
441
641
old = os.path.join(revdir, ".bzr")
442
642
new = os.path.join(tempdir, ".bzr")
443
643
os.rename(old, new)
444
baz_inv, log = apply_revision(revdir, revision,
445
skip_symlinks=skip_symlinks)
644
baz_inv, log = apply_revision(tree, revision)
446
645
os.rename(new, old)
447
branch = find_branch(revdir)
448
timestamp = email.Utils.mktime_tz(log.date + (0,))
449
rev_id = revision_id(revision)
646
target_tree = WorkingTree.open(revdir)
647
branch = target_tree.branch
648
# cached so we can delete the log
650
log_summary = log.summary
651
log_description = log.description
652
is_continuation = log.continuation_of is not None
653
log_creator = log.creator
654
direct_merges = get_direct_merges(revdir, revision, log)
656
timestamp = email.Utils.mktime_tz(log_date + (0,))
657
if log_summary is None:
659
# log_descriptions of None and "" are ignored.
660
if not is_continuation and log_description:
661
log_message = "\n".join((log_summary, log_description))
663
log_message = log_summary
664
target_tree.lock_write()
450
665
branch.lock_write()
452
branch.set_inventory(baz_inv)
453
bzrlib.trace.silent = True
454
branch.commit(log.summary, verbose=False, committer=log.creator,
455
timestamp=timestamp, timezone=0, rev_id=rev_id)
668
# if we want it to be in revision-history, do that here.
669
target_tree.set_parent_ids(
670
[revision_id(missing_ancestor, encoding)],
671
allow_leftmost_as_ghost=True)
672
missing_ancestor = None
673
for merged_rev in direct_merges:
674
target_tree.add_pending_merge(revision_id(merged_rev,
676
target_tree.set_root_id(BAZ_IMPORT_ROOT)
678
target_tree.set_inventory(baz_inv)
679
commitobj = Commit(reporter=ImportCommitReporter())
680
commitobj.commit(working_tree=target_tree,
681
message=log_message.decode(log_encoding, 'replace'),
682
verbose=False, committer=log_creator, timestamp=timestamp,
683
timezone=0, rev_id=rev_id, revprops={})
457
bzrlib.trace.silent = False
459
687
yield Progress("revisions", len(ancestors), len(ancestors))
460
unlink_unversioned(branch, revdir)
462
def unlink_unversioned(branch, revdir):
463
for unversioned in branch.working_tree().extras():
464
path = os.path.join(revdir, unversioned)
689
def get_direct_merges(revdir, revision, log):
690
continuation = log.continuation_of
691
previous_version = revision.version
692
if pybaz.WorkingTree(revdir).tree_version != previous_version:
693
pybaz.WorkingTree(revdir).set_tree_version(previous_version)
694
log_path = "%s/{arch}/%s/%s/%s/%s/patch-log/%s" % (revdir,
695
revision.category.nonarch, revision.branch.nonarch,
696
revision.version.nonarch, revision.archive, revision.patchlevel)
697
temp_path = tempfile.mktemp(dir=os.path.dirname(revdir))
698
os.rename(log_path, temp_path)
699
merges = list(iter_new_merges(revdir, revision.version))
700
direct = direct_merges(merges, [continuation])
701
os.rename(temp_path, log_path)
704
def unlink_unversioned(wt):
705
for unversioned in wt.extras():
706
path = wt.abspath(unversioned)
465
707
if os.path.isdir(path):
466
708
shutil.rmtree(path)
470
712
def get_log(tree, revision):
471
log = tree.iter_logs(version=revision.version, reverse=True).next()
472
assert log.revision == revision
713
log = pybaz.Patchlog(revision, tree=tree)
714
assert str(log.revision) == str(revision), (log.revision, revision)
475
def get_revision(revdir, revision, skip_symlinks=False):
477
tree = pybaz.tree_root(revdir)
717
def get_revision(revdir, revision):
718
tree = revision.get(revdir)
478
719
log = get_log(tree, revision)
480
return bzr_inventory_data(tree, skip_symlinks=skip_symlinks), log
721
return tree, bzr_inventory_data(tree), log
481
722
except BadFileKind, e:
482
raise UserError("Cannot convert %s because %s is a %s" % (revision,e.path, e.kind) )
485
def apply_revision(revdir, revision, skip_symlinks=False):
486
tree = pybaz.tree_root(revdir)
723
raise UserError("Cannot convert %s because %s is a %s" %
724
(revision,e.path, e.kind))
727
def apply_revision(tree, revision):
487
728
revision.apply(tree)
488
729
log = get_log(tree, revision)
490
return bzr_inventory_data(tree, skip_symlinks=skip_symlinks), log
731
return bzr_inventory_data(tree), log
491
732
except BadFileKind, e:
492
raise UserError("Cannot convert %s because %s is a %s" % (revision,e.path, e.kind) )
733
raise UserError("Cannot convert %s because %s is a %s" %
734
(revision,e.path, e.kind))
497
737
class BadFileKind(Exception):
770
def baz_import_branch(to_location, from_branch, fast, max_count, verbose,
771
encoding, dry_run, reuse_history_list):
772
to_location = os.path.realpath(str(to_location))
773
if from_branch is not None:
775
from_branch = pybaz.Version(from_branch)
776
except pybaz.errors.NamespaceError:
777
print "%s is not a valid Arch branch." % from_branch
779
if reuse_history_list is None:
780
reuse_history_list = []
781
import_version(to_location, from_branch, encoding, max_count=max_count,
782
reuse_history_from=reuse_history_list)
529
785
class NotInABranch(Exception):
530
786
def __init__(self, path):
531
787
Exception.__init__(self, "%s is not in a branch." % path)
535
def find_branch(path):
538
Traceback (most recent call last):
539
NotInABranch: / is not in a branch.
540
>>> sb = bzrlib.ScratchBranch()
541
>>> isinstance(find_branch(sb.base), bzrlib.Branch)
792
def baz_import(to_root_dir, from_archive, encoding, verbose=False,
793
reuse_history_list=[], prefixes=None):
794
if reuse_history_list is None:
795
reuse_history_list = []
796
to_root = str(os.path.realpath(to_root_dir))
797
if not os.path.exists(to_root):
799
if prefixes is not None:
800
prefixes = prefixes.split(':')
801
import_archive(to_root, from_archive, verbose, encoding,
802
reuse_history_list, prefixes=prefixes)
805
def import_archive(to_root, from_archive, verbose,
806
encoding, reuse_history_from=[], standalone=False,
808
def selected(version):
812
for prefix in prefixes:
813
if version.nonarch.startswith(prefix):
816
real_to = os.path.realpath(to_root)
817
history_locations = [real_to] + reuse_history_from
818
if standalone is False:
820
bd = BzrDir.open(to_root)
822
except NotBranchError:
823
create_shared_repository(to_root)
824
except NoRepositoryPresent:
825
raise BzrCommandError("Can't create repository at existing branch.")
826
versions = list(pybaz.Archive(str(from_archive)).iter_versions())
827
progress_bar = bzrlib.ui.ui_factory.nested_progress_bar()
545
return bzrlib.Branch(path)
547
if e.args[0].endswith("' is not in a branch"):
548
raise NotInABranch(path)
550
class cmd_baz_import(Command):
551
"""Import an Arch or Baz branch into a bzr branch"""
552
takes_args = ['to_location', 'from_branch?']
553
takes_options = ['verbose']
555
def run(self, to_location, from_branch=None, skip_symlinks=False,
556
fast=False, max_count=None, verbose=False, dry_run=False):
557
fancy = rewriting_supported()
558
to_location = os.path.realpath(str(to_location))
559
if from_branch is not None:
829
for num, version in enumerate(versions):
830
progress_bar.update("Branch", num, len(versions))
831
if not selected(version):
832
print "Skipping %s" % version
834
target = os.path.join(to_root, map_namespace(version))
835
if not os.path.exists(os.path.dirname(target)):
836
os.makedirs(os.path.dirname(target))
561
from_branch = pybaz.Version(version)
562
except pybaz.errors.NamespaceError:
563
print "%s is not a valid Arch branch." % from_branch
565
import_version(to_location, from_branch, fancy=fancy)
838
import_version(target, version, encoding,
839
reuse_history_from=reuse_history_from,
840
standalone=standalone)
841
except pybaz.errors.ExecProblem,e:
842
if str(e).find('The requested revision cannot be built.') != -1:
844
"Skipping version %s as it cannot be built due"
845
" to a missing parent archive." % version)
849
if str(e).find('already exists, and the last revision ') != -1:
851
"Skipping version %s as it has had commits made"
852
" since it was converted to bzr." % version)
856
progress_bar.finished()
859
def map_namespace(a_version):
860
a_version = pybaz.Version("%s" % a_version)
861
parser = NameParser(a_version)
862
version = parser.get_version()
863
branch = parser.get_branch()
864
category = parser.get_category()
865
if branch is None or branch == '':
868
return "%s/%s" % (category, branch)
869
return "%s/%s/%s" % (category, version, branch)
872
def map_file_id(file_id):
873
"""Convert a baz file id to a bzr one."""
874
return file_id.replace('%', '%25').replace('/', '%2f')