~abentley/bzrtools/bzrtools.dev

« back to all changes in this revision

Viewing changes to baz2bzr

  • Committer: Aaron Bentley
  • Date: 2005-06-03 21:19:31 UTC
  • Revision ID: abentley@panoramicfeedback.com-20050603211931-a69ba1ae4732d606
Refactored, made version optional

Show diffs side-by-side

added added

removed removed

Lines of Context:
172
172
    ancestors.reverse()
173
173
    return ancestors
174
174
 
 
175
def get_remaining_revisions(output_dir, version):
 
176
    last_patch = None
 
177
    old_revno = None
 
178
    if os.path.exists(output_dir):
 
179
        # We are starting from an existing directory, figure out what
 
180
        # the current version is
 
181
        branch = bzrlib.Branch(output_dir)
 
182
        last_patch = branch.last_patch()
 
183
        try:
 
184
            last_patch = arch_revision(last_patch)
 
185
        except NotArchRevision:
 
186
            raise UserError(
 
187
                "Directory \"%s\" already exists, and the last revision is not"
 
188
                " an Arch revision (%s)" % (output_dir, last_patch))
 
189
        if version is None:
 
190
            version = last_patch.version
 
191
    elif version is None:
 
192
        raise UserError("No version specified, and directory does not exist.")
 
193
 
 
194
    ancestors = version_ancestry(version)
 
195
 
 
196
    if last_patch:
 
197
        for i in range(len(ancestors)):
 
198
            if ancestors[i] == last_patch:
 
199
                break
 
200
        else:
 
201
            raise UserError("Directory \"%s\" already exists, and the last "
 
202
                "revision (%s) is not in the ancestry of %s" % 
 
203
                (output_dir, last_patch, version))
 
204
        # Strip off all of the ancestors which are already present
 
205
        # And get a directory starting with the latest ancestor
 
206
        latest_ancestor = ancestors[i]
 
207
        old_revno = bzrlib.Branch(output_dir).revno()
 
208
        ancestors = ancestors[i+1:]
 
209
    return ancestors, old_revno
175
210
 
176
211
def import_version(output_dir, version, fancy=True, fast=False, verbose=False, 
177
212
                   dry_run=False, max_count=None, skip_symlinks=False):
187
222
    Import complete.
188
223
    >>> teardown_environ(q)
189
224
    """
 
225
    ancestors, old_revno = get_remaining_revisions(output_dir, version)
 
226
    if len(ancestors) == 0:
 
227
        print '* Tree is up-to-date with %s' % last_patch
 
228
        return 0
 
229
 
190
230
    progress_bar = ProgressBar()
191
231
    tempdir = tempfile.mkdtemp(prefix="baz2bzr-",
192
232
                               dir=os.path.dirname(output_dir))
193
233
    try:
194
234
        if not fancy:
195
235
            print "not fancy"
196
 
        for result in iter_import_version(output_dir, version, tempdir,
 
236
        for result in iter_import_version(output_dir, ancestors, tempdir,
197
237
                fast=fast, verbose=verbose, dry_run=dry_run, 
198
238
                max_count=max_count, skip_symlinks=skip_symlinks):
199
239
            if fancy:
200
240
                progress_bar(result)
201
241
            else:
202
242
                sys.stdout.write('.')
 
243
 
 
244
        if dry_run:
 
245
            print '**Dry run, not modifying output_dir'
 
246
            return 0
 
247
        if os.path.exists(output_dir):
 
248
            # Move the bzr control directory back, and update the working tree
 
249
            tmp_bzr_dir = os.path.join(tempdir, '.bzr')
 
250
            
 
251
            bzr_dir = os.path.join(output_dir, '.bzr')
 
252
            new_bzr_dir = os.path.join(tempdir, "rd", '.bzr')
 
253
 
 
254
            os.rename(bzr_dir, tmp_bzr_dir) # Move the original bzr out of the way
 
255
            os.rename(new_bzr_dir, bzr_dir)
 
256
            try:
 
257
                # bzrlib.merge that exists in mainline does not have a this_dir component,
 
258
                # so we have to work in the local directory
 
259
                try:
 
260
                    pwd = os.getcwd()
 
261
                    os.chdir(output_dir)
 
262
                    bzrlib.merge.merge(('.', -1), ('.', old_revno))
 
263
                finally:
 
264
                    os.chdir(pwd)
 
265
            except:
 
266
                # If something failed, move back the original bzr directory
 
267
                os.rename(bzr_dir, new_bzr_dir)
 
268
                os.rename(tmp_bzr_dir, bzr_dir)
 
269
                raise
 
270
        else:
 
271
            os.rename(revdir, output_dir)
 
272
 
203
273
    finally:
204
274
        if fancy:
205
275
            clear_progress_bar()
251
321
        except pybaz.errors.NamespaceError, e:
252
322
            raise NotArchRevision(revision_id)
253
323
            
254
 
def iter_import_version(output_dir, version, tempdir, fast=False,
 
324
def iter_import_version(output_dir, ancestors, tempdir, fast=False,
255
325
                        verbose=False, dry_run=False, max_count=None,
256
326
                        skip_symlinks=False):
257
327
    revdir = None
258
 
    ancestors = version_ancestry(version)
259
 
    last_patch = None
260
 
    if os.path.exists(output_dir):
261
 
        # We are starting from an existing directory, figure out what
262
 
        # the current version is
263
 
        branch = bzrlib.Branch(output_dir)
264
 
        last_patch = branch.last_patch()
265
 
        try:
266
 
            last_patch = arch_revision(last_patch)
267
 
        except NotArchRevision:
268
 
            raise UserError(
269
 
                "Directory \"%s\" already exists, and the last patch is not"
270
 
                " an Arch patch (%s)" % (output_dir, last_patch))
271
 
 
272
 
    if last_patch:
273
 
        for i in range(len(ancestors)):
274
 
            if ancestors[i] == last_patch:
275
 
                break
276
 
        else:
277
 
            raise UserError("Directory \"%s\" already exists, and the last patch (%s) is not in the revision history" % (output_dir, last_patch))
278
 
        # Strip off all of the ancestors which are already present
279
 
        # And get a directory starting with the latest ancestor
280
 
        latest_ancestor = ancestors[i]
281
 
        old_revno = bzrlib.Branch(output_dir).revno()
282
 
        ancestors = ancestors[i+1:]
283
 
 
284
 
        if len(ancestors) == 0:
285
 
            print '* Tree is up-to-date with %s' % last_patch
286
 
            return
287
 
 
288
 
        revdir = os.path.join(tempdir, "rd")
289
 
        baz_inv, log = get_revision(revdir, latest_ancestor,
290
 
                                    skip_symlinks=skip_symlinks)
291
 
        bzr_dir = os.path.join(output_dir, '.bzr')
292
 
        new_bzr_dir = os.path.join(revdir, '.bzr')
293
 
        # This would be much faster with a simple os.rename(), but if we fail,
294
 
        # we have corrupted the original .bzr directory.
295
 
        # Is that a big problem, as we can just back out the last revisions in
296
 
        # .bzr/revision_history
297
 
        # I don't really know
298
 
        shutil.copytree(bzr_dir, new_bzr_dir)
299
 
        # Now revdir should have a tree with the latest .bzr, and the correct
300
 
        # version of the baz tree
301
328
 
302
329
    # Uncomment this for testing, it basically just has baz2bzr only update
303
330
    # 5 patches at a time
330
357
            revdir = os.path.join(tempdir, "rd")
331
358
            baz_inv, log = get_revision(revdir, revision, 
332
359
                                        skip_symlinks=skip_symlinks)
333
 
            branch = bzrlib.Branch(revdir, init=True)
 
360
            if os.path.exists(output_dir):
 
361
                bzr_dir = os.path.join(output_dir, '.bzr')
 
362
                new_bzr_dir = os.path.join(tempdir, "rd", '.bzr')
 
363
                # This would be much faster with a simple os.rename(), but if
 
364
                # we fail, we have corrupted the original .bzr directory.  Is
 
365
                # that a big problem, as we can just back out the last
 
366
                # revisions in .bzr/revision_history I don't really know
 
367
                shutil.copytree(bzr_dir, new_bzr_dir)
 
368
                # Now revdir should have a tree with the latest .bzr, and the
 
369
                # next revision of the baz tree
 
370
                branch = bzrlib.Branch(revdir)
 
371
            else:
 
372
                branch = bzrlib.Branch(revdir, init=True)
334
373
        else:
335
374
            old = os.path.join(revdir, ".bzr")
336
375
            new = os.path.join(tempdir, ".bzr")
352
391
            branch.unlock()
353
392
    yield Progress("revisions", len(ancestors), len(ancestors))
354
393
    unlink_unversioned(branch, revdir)
355
 
    if dry_run:
356
 
        print '**Dry run, not modifying output_dir'
357
 
        return
358
 
    if os.path.exists(output_dir):
359
 
        # Move the bzr control directory back, and update the working tree
360
 
        tmp_bzr_dir = os.path.join(tempdir, '.bzr')
361
 
        os.rename(bzr_dir, tmp_bzr_dir) # Move the original bzr out of the way
362
 
        os.rename(new_bzr_dir, bzr_dir)
363
 
        try:
364
 
            # bzrlib.merge that exists in mainline does not have a this_dir component,
365
 
            # so we have to work in the local directory
366
 
            try:
367
 
                pwd = os.getcwd()
368
 
                os.chdir(output_dir)
369
 
                bzrlib.merge.merge(('.', -1), ('.', old_revno))
370
 
            finally:
371
 
                os.chdir(pwd)
372
 
        except:
373
 
            # If something failed, move back the original bzr directory
374
 
            os.rename(bzr_dir, new_bzr_dir)
375
 
            os.rename(tmp_bzr_dir, bzr_dir)
376
 
            raise
377
 
    else:
378
 
        os.rename(revdir, output_dir)
379
394
 
380
395
def unlink_unversioned(branch, revdir):
381
396
    for unversioned in branch.working_tree().extras():
453
468
    :param args: The arguments to this script. Essentially sys.argv[1:]
454
469
    """
455
470
    import optparse
456
 
    parser = optparse.OptionParser(usage='%prog [options] VERSION OUTDIR'
 
471
    parser = optparse.OptionParser(usage='%prog [options] [VERSION] OUTDIR'
457
472
        '\n  VERSION is the arch version to import.'
458
473
        '\n  OUTDIR can be an existing directory to be updated'
459
474
        '\n         or a new directory which will be created from scratch.')
493
508
            return 1
494
509
        else:
495
510
            return 0
496
 
 
497
 
    if len(args) != 2:
 
511
    if len(args) == 2:
 
512
        output_dir = os.path.realpath(args[1]) 
 
513
        version = pybaz.Version(args[0])
 
514
    elif len(args) == 1:
 
515
        output_dir = os.path.realpath(args[0])
 
516
        version = None
 
517
    else:
498
518
        print 'Invalid number of arguments, try --help for more info'
499
519
        return 1
500
 
    else:
501
 
        try:
502
 
            output_dir = os.path.realpath(args[1])
503
 
            import_version(output_dir, pybaz.Version(args[0]),
504
 
                verbose=opts.verbose, fast=opts.fast,
505
 
                fancy=opts.fancy, dry_run=opts.dry_run,
506
 
                max_count=opts.max_count, skip_symlinks=opts.skip_symlinks)
507
 
            return 0
508
 
        except UserError, e:
509
 
            print e
510
 
            return 1
511
 
        except KeyboardInterrupt:
512
 
            print "Aborted."
513
 
            return 1
 
520
        
 
521
    try:
 
522
        
 
523
        import_version(output_dir, version,
 
524
            verbose=opts.verbose, fast=opts.fast,
 
525
            fancy=opts.fancy, dry_run=opts.dry_run,
 
526
            max_count=opts.max_count, skip_symlinks=opts.skip_symlinks)
 
527
        return 0
 
528
    except UserError, e:
 
529
        print e
 
530
        return 1
 
531
    except KeyboardInterrupt:
 
532
        print "Aborted."
 
533
        return 1
514
534
 
515
535
 
516
536
if __name__ == '__main__':